Implement datum support and add make for ex-5.52
This commit is contained in:
60
shared/scm2c/datum.h
Normal file
60
shared/scm2c/datum.h
Normal file
@@ -0,0 +1,60 @@
|
||||
enum datum_type {
|
||||
datum_type_i32,
|
||||
datum_type_bool,
|
||||
datum_type_primitive_proc,
|
||||
datum_type_compiled_proc,
|
||||
};
|
||||
|
||||
typedef struct datum {
|
||||
enum datum_type type;
|
||||
int32_t value;
|
||||
void* (*primitive_procedure) (void**);
|
||||
void* compiled_pr;
|
||||
} datum;
|
||||
|
||||
typedef struct procedure {
|
||||
} procedure;
|
||||
|
||||
|
||||
datum* const_int(int32_t value) {
|
||||
datum* r = malloc(sizeof(datum));
|
||||
if (!r) exit(-1);
|
||||
r->type = datum_type_i32;
|
||||
r->value = value;
|
||||
}
|
||||
|
||||
int primitive_procedure(datum* d) {
|
||||
if (d->type == datum_type_primitive_proc) {
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
datum* add(datum** args) {
|
||||
size_t i = 0;
|
||||
int32_t result = 0;
|
||||
|
||||
while (args[i] != NULL) {
|
||||
if (args[i]->type != datum_type_i32) {
|
||||
printf("ADD - invalid type\n");
|
||||
exit(-1);
|
||||
}
|
||||
result += args[i]->value;
|
||||
i += 1;
|
||||
}
|
||||
|
||||
return const_int(result);
|
||||
}
|
||||
|
||||
void* compiled_procedure_entry(void* p) {
|
||||
return compiled_procedure_entry;
|
||||
}
|
||||
|
||||
datum* lookup_variable_value(char* c, void* e) {
|
||||
datum* r = malloc(sizeof(datum));
|
||||
if (!r) exit(-1);
|
||||
r->type = datum_type_primitive_proc;
|
||||
r->primitive_procedure = (void*) &add;
|
||||
return r;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user