Implement 5.52 translate Scheme to C

This commit is contained in:
2021-06-12 19:49:53 -04:00
parent 15057b52d4
commit 90a1f8a573
12 changed files with 808 additions and 199 deletions

View File

@@ -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