dfsch_object_t* dfsch_make_class(dfsch_object_t* superclass, char* name, dfsch_object_t* slots){ class_t* klass = (class_t*)dfsch_make_object(DFSCH_CLASS_TYPE); klass->standard_type.name = name; klass->standard_type.slots = make_slots(slots); klass->standard_type.flags = DFSCH_TYPEF_USER_EXTENSIBLE; if (superclass){ class_t* super = DFSCH_ASSERT_INSTANCE(superclass, DFSCH_CLASS_TYPE); klass->standard_type.superclass = (dfsch_type_t*)super; klass->standard_type.size = adjust_sizes(klass->standard_type.slots, klass->standard_type.superclass->size); klass->initvalues = super->initvalues; klass->initargs = super->initargs; } else { klass->standard_type.superclass = NULL; klass->standard_type.size = adjust_sizes(klass->standard_type.slots, sizeof(dfsch_object_t)); } klass->standard_type.write = instance_write; /* klass->standard_type.equal_p = class_equal_p; klass->standard_type.apply = class_apply; klass->standard_type.hash = class_hash;*/ return (dfsch_object_t*)klass; }
dfsch_object_t* dfsch_make_instance(dfsch_object_t* klass, dfsch_object_t* args){ dfsch_object_t* obj; class_t* c = DFSCH_ASSERT_INSTANCE(klass, DFSCH_CLASS_TYPE); obj = dfsch_make_object((dfsch_type_t*)c); call_initialize_instance(obj, c, args); return obj; }
void dfsch_close_file_port(dfsch_object_t* port){ file_port_t* p = (file_port_t*)DFSCH_ASSERT_INSTANCE(port, (dfsch_type_t*)DFSCH_FILE_PORT_TYPE); p = (file_port_t*) port; if (p->close && p->open){ fclose(p->file); p->open = 0; } }
dfsch_object_t* dfsch_process_close_port(dfsch_object_t* port){ process_port_t* p = DFSCH_ASSERT_INSTANCE(port, DFSCH_PROCESS_PORT_TYPE); int r; if (p->open){ p->open = 0; r = pclose(p->file); if (r == -1){ dfsch_error("Error while closing process port", dfsch_make_string_cstr(strerror(errno))); } return DFSCH_MAKE_FIXNUM(r); } return NULL; }