Implement 5.52 translate Scheme to C
This commit is contained in:
@@ -1,3 +1,8 @@
|
||||
#ifndef DATUM_H
|
||||
#define DATUM_H
|
||||
|
||||
#include <stdint.h>
|
||||
|
||||
enum datum_type {
|
||||
datum_type_i32,
|
||||
datum_type_bool,
|
||||
@@ -8,53 +13,22 @@ enum datum_type {
|
||||
typedef struct datum {
|
||||
enum datum_type type;
|
||||
int32_t value;
|
||||
void* (*primitive_procedure) (void**);
|
||||
void* compiled_pr;
|
||||
struct datum* (*primitive_procedure) (struct datum*);
|
||||
void* compiled_procedure_entry;
|
||||
void* env;
|
||||
struct datum *next;
|
||||
} datum;
|
||||
|
||||
typedef struct procedure {
|
||||
} procedure;
|
||||
datum* cons(datum *e, datum *xs);
|
||||
datum* const_i32(int32_t value);
|
||||
datum* const_bool(int32_t value);
|
||||
datum* const_primitive_proc(datum* (*primitive_procedure) (datum*));
|
||||
int primitive_procedure(datum* d);
|
||||
int is_false(datum *d);
|
||||
int datum_eq(datum *a, datum *b);
|
||||
int datum_lt(datum *a, datum *b);
|
||||
void print_datum(datum* d);
|
||||
void* compiled_procedure_entry(datum* d);
|
||||
|
||||
|
||||
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;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
Reference in New Issue
Block a user