static dfsch_object_t* decoded_time_apply(decoded_time_t* time, dfsch_object_t* args, dfsch_tail_escape_t* esc){ dfsch_object_t* selector; DFSCH_OBJECT_ARG(args, selector); DFSCH_ARG_END(args); if (dfsch_compare_keyword(selector, "sec")){ return dfsch_make_number_from_long(time->tm.tm_sec); } else if (dfsch_compare_keyword(selector, "min")){ return dfsch_make_number_from_long(time->tm.tm_min); } else if (dfsch_compare_keyword(selector, "hour")){ return dfsch_make_number_from_long(time->tm.tm_hour); } else if (dfsch_compare_keyword(selector, "date")){ return dfsch_make_number_from_long(time->tm.tm_mday); } else if (dfsch_compare_keyword(selector, "month")){ return dfsch_make_number_from_long(time->tm.tm_mon + 1); } else if (dfsch_compare_keyword(selector, "year")){ return dfsch_make_number_from_long(time->tm.tm_year + 1900); } else if (dfsch_compare_keyword(selector, "day")){ return dfsch_make_number_from_long(time->tm.tm_wday); } else if (dfsch_compare_keyword(selector, "year-day")){ return dfsch_make_number_from_long(time->tm.tm_yday + 1); } else if (dfsch_compare_keyword(selector, "dst?")){ return dfsch_bool(time->tm.tm_isdst == 1); } dfsch_error("Unknown field requested", selector); }
static void finalize_slots_definition(class_t* klass, dfsch_object_t* env, dfsch_object_t* slot_definitions){ dfsch_object_t* i = slot_definitions; while (DFSCH_PAIR_P(i)){ dfsch_object_t* slot_def = DFSCH_FAST_CAR(i); if (DFSCH_PAIR_P(slot_def)){ dfsch_slot_t* slot = find_direct_slot(klass, dfsch_symbol(DFSCH_FAST_CAR(slot_def))); slot_def = DFSCH_FAST_CDR(slot_def); while (DFSCH_PAIR_P((slot_def))){ dfsch_object_t* keyword; dfsch_object_t* value; keyword = DFSCH_FAST_CAR(slot_def); slot_def = DFSCH_FAST_CDR(slot_def); if (!DFSCH_PAIR_P(slot_def)){ dfsch_error("Value expected for slot option", keyword); } value = DFSCH_FAST_CAR(slot_def); slot_def = DFSCH_FAST_CDR(slot_def); if(dfsch_compare_keyword(keyword, "accessor")){ dfsch_object_t* accessor = dfsch__make_slot_accessor_for_slot(klass, slot); dfsch_method_t* method = dfsch_make_method(accessor, NULL, dfsch_cons(klass, NULL), accessor); dfsch_define_method(env, value, method); } else if(dfsch_compare_keyword(keyword, "reader")){ dfsch_object_t* accessor = dfsch__make_slot_reader_for_slot(klass, slot); dfsch_method_t* method = dfsch_make_method(accessor, NULL, dfsch_cons(klass, NULL), accessor); dfsch_define_method(env, value, method); } else if(dfsch_compare_keyword(keyword, "write")){ dfsch_object_t* accessor = dfsch__make_slot_writer_for_slot(klass, slot); dfsch_method_t* method = dfsch_make_method(accessor, NULL, dfsch_cons(klass, NULL), accessor); dfsch_define_method(env, value, method); } else if(dfsch_compare_keyword(keyword, "initform")){ klass->initvalues = dfsch_cons(dfsch_list(2, dfsch_eval(value, env), slot), klass->initvalues); } else if(dfsch_compare_keyword(keyword, "initarg")){ klass->initargs = dfsch_cons(dfsch_list(2, value, slot), klass->initargs); } else if(dfsch_compare_keyword(keyword, "documentation")){ slot->documentation = dfsch_string_to_cstr(value); } } } i = DFSCH_FAST_CDR(i); } }