static dfsch_slot_t* make_slots(dfsch_object_t* slot_desc){ dfsch_object_t* i = slot_desc; size_t slot_count = dfsch_list_length_check(slot_desc); dfsch_slot_t* slots = GC_MALLOC((slot_count + 1) * sizeof(dfsch_slot_t)); dfsch_slot_t* j = slots; while (slot_count && DFSCH_PAIR_P(i)){ dfsch_object_t* name; dfsch_object_t* type; if (DFSCH_PAIR_P(DFSCH_FAST_CAR(i))){ dfsch_object_t* args = DFSCH_FAST_CAR(i); DFSCH_OBJECT_ARG(args, name); } else { name = DFSCH_FAST_CAR(i); } j->type = DFSCH_OBJECT_SLOT_TYPE; j->name = dfsch_symbol(name); j->documentation = NULL; j++; slot_count--; i = DFSCH_FAST_CDR(i); } j->type = NULL; j->name = NULL; j->access = DFSCH_SLOT_ACCESS_RW; j->documentation = NULL; return slots; }
static char* convert_arg(dfsch_object_t* obj){ if (dfsch_keyword_p(obj)){ char* str = dfsch_symbol(obj); if (strlen(str) == 1){ return dfsch_saprintf("-%s", str); } else { return dfsch_saprintf("--%s", str); } } else if (dfsch_string_p(obj)) { return dfsch_string_to_cstr(obj); } else { return dfsch_object_2_string(obj, 10, 1); } }
char* dfsch_tcl_quote_list(dfsch_object_t* list){ dfsch_str_list_t* sl = dfsch_sl_create(); dfsch_object_t* i; while (DFSCH_PAIR_P(list)){ dfsch_sl_append(sl, " "); i = DFSCH_FAST_CAR(list); if (dfsch_string_p(i)){ dfsch_sl_append(sl, dfsch_tcl_quote(dfsch_string_to_cstr(i))); } else if (dfsch_keyword_p(i)){ dfsch_sl_append(sl, dfsch_saprintf("-%s", dfsch_symbol(i))); } else if (DFSCH_PAIR_P(i)){ dfsch_sl_append(sl, dfsch_tcl_quote(dfsch_tcl_quote_list(i))); } else { dfsch_sl_append(sl, dfsch_tcl_quote(dfsch_object_2_string(i, 10, 1))); } list = DFSCH_FAST_CDR(list); } return dfsch_sl_value(sl); }
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); } }