Esempio n. 1
0
File: object.c Progetto: leia/dfsch
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;
}
Esempio n. 2
0
File: rrd_mod.c Progetto: adh/dfsch
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);
  }
}
Esempio n. 3
0
File: tk-gui.c Progetto: adh/dfsch
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);
}
Esempio n. 4
0
File: object.c Progetto: leia/dfsch
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);
  }
}