2 * A header file that defines the basic Scheme data types, etc. Used
3 * with the scheme->c compiler.
4 * Programmer: Mayer Goldberg, 2000
11 #define NULL ((void *)0)
14 typedef enum SchemeType {
16 SCHEME_TYPE_FIRST = SCHEME_VOID,
26 SCHEME_TYPE_END /* not to be used */
29 /* basic support for scheme objects */
31 typedef struct SchemeIntData {
35 typedef struct SchemeCharData {
39 typedef struct SchemeBoolData {
43 typedef struct SchemeStringData {
48 typedef struct SchemePairData {
49 struct SchemeObject *car, *cdr;
52 typedef struct SchemeVectorData {
54 struct SchemeObject **vec;
57 typedef struct SchemeSymbolData {
58 struct SymbolEntry *sep;
61 typedef struct SchemeClosureData {
62 struct SchemeObject **env;
66 typedef union SchemeObjectData {
67 struct SchemeIntData sid;
68 struct SchemeCharData scd;
69 struct SchemeBoolData sbd;
70 struct SchemeStringData ssd;
71 struct SchemePairData spd;
72 struct SchemeVectorData svd;
73 struct SchemeSymbolData smd;
74 struct SchemeClosureData scld;
77 typedef struct SchemeObject {
79 SchemeObjectData *schemeObjectData;
82 #define VOID(x) ((void *) (x))
83 #define SOB(x) ((SchemeObject *) (x))
84 #define SOD(x) ((SchemeObjectData *) (x))
85 #define SOB_TYPE(x) SOB((x))->type
86 #define SOB_DATA(x) SOB((x))->schemeObjectData
88 #define IS_SOB_VOID(x) (SOB((x))->type == SCHEME_VOID)
89 #define IS_SOB_INT(x) (SOB((x))->type == SCHEME_INT)
90 #define IS_SOB_CHAR(x) (SOB((x))->type == SCHEME_CHAR)
91 #define IS_SOB_BOOL(x) (SOB((x))->type == SCHEME_BOOL)
92 #define IS_SOB_STRING(x) (SOB((x))->type == SCHEME_STRING)
93 #define IS_SOB_NIL(x) (SOB((x))->type == SCHEME_NIL)
94 #define IS_SOB_PAIR(x) (SOB((x))->type == SCHEME_PAIR)
95 #define IS_SOB_VECTOR(x) (SOB((x))->type == SCHEME_VECTOR)
96 #define IS_SOB_SYMBOL(x) (SOB((x))->type == SCHEME_SYMBOL)
97 #define IS_SOB_CLOSURE(x) (SOB((x))->type == SCHEME_CLOSURE)
99 #define SOB_INT_VALUE(x) SOB_DATA((x))->sid.value
100 #define SOB_CHAR_VALUE(x) SOB_DATA((x))->scd.value
101 #define SOB_BOOL_VALUE(x) SOB_DATA((x))->sbd.value
102 #define SOB_STRING_LENGTH(x) SOB_DATA((x))->ssd.length
103 #define SOB_STRING_VALUE(x) SOB_DATA((x))->ssd.value
104 #define SOB_STRING_REF(x, i) SOB_STRING_VALUE((x))[i]
105 #define SOB_STRING_SET(x, i, c) SOB_STRING_VALUE((x))[i] = c
106 #define SOB_PAIR_CAR(x) SOB_DATA((x))->spd.car
107 #define SOB_PAIR_CDR(x) SOB_DATA((x))->spd.cdr
108 #define SOB_VECTOR_LENGTH(x) SOB_DATA((x))->svd.length
109 #define SOB_VECTOR_VALUE(x) SOB_DATA((x))->svd.vec
110 #define SOB_VECTOR_REF(x, i) SOB_VECTOR_VALUE((x))[i]
111 #define SOB_VECTOR_SET(x, i, sob) SOB_VECTOR_VALUE((x))[i] = sob
112 #define SOB_SYMBOL_ENTRY(x) SOB_DATA((x))->smd.sep
113 #define SOB_SYMBOL_HAS_VALUE(x) SOB_SYMBOL_ENTRY((x))->isDefined
114 #define SOB_SYMBOL_NAME(x) SOB_SYMBOL_ENTRY((x))->name
115 #define SOB_SYMBOL_VALUE(x) SOB_SYMBOL_ENTRY((x))->sob
116 #define SOB_CLOSURE_ENV(x) SOB_DATA((x))->scld.env
117 #define SOB_CLOSURE_CODE(x) SOB_DATA((x))->scld.code
119 #define SOB_BOOL_FALSE(x) (IS_SOB_BOOL(x) && (SOB_BOOL_VALUE(x) == 0))
121 SchemeObject *makeSchemeObject();
122 SchemeObject *makeSchemeVoid();
123 SchemeObject *makeSchemeInt(int n);
124 SchemeObject *makeSchemeChar(char c);
125 SchemeObject *makeSchemeBool(int b);
126 SchemeObject *makeSchemeString(int n, char c);
127 SchemeObject *makeSchemeStringFromCString(char *s);
128 SchemeObject *makeSchemeNil();
129 SchemeObject *makeSchemePair(SchemeObject *car, SchemeObject *cdr);
130 SchemeObject *makeSchemeVectorInit(int n, SchemeObject *initSob);
131 SchemeObject *makeSchemeSymbol(char *s);
132 SchemeObject *makeSchemeClosure(void* env,void* code);
134 char *sobToString(SchemeObject *sob);
136 /* I am too lazy to think up a good hash function, so I'm not using a
137 * hash table but rather a binary tree. Of course, the performance for
138 * free variable look up will not be as good, but the implementation
139 * details are hidden behind an API, and can therefore be changed
143 typedef struct SymbolEntry {
149 typedef struct SymbolNode {
151 struct SymbolNode *left, *right;
154 #define SYM_ENTRY(symNode) ((SymbolNode *)symNode)->sym
155 #define SYM_NAME(symNode) SYM_ENTRY((symNode))->name
156 #define SYM_HAS_VALUE(symNode) SYM_ENTRY((symNode))->isDefined
157 #define SYM_VALUE(symNode) SYM_ENTRY((symNode))->sob
158 #define SYM_LEFT(symNode) ((symNode))->left
159 #define SYM_RIGHT(symNode) ((symNode))->right
161 SymbolEntry *probeSymbolDefined(char *name, SymbolNode *t);
162 SymbolEntry *getSymbol(char *name, SymbolNode *t);
164 /* this is intended for future support for the garbage collector */
166 void *autoMalloc(int n);
167 void autoFree(void *p);
169 /* this is the name of the function created by our compiler */
171 void schemeCompiledFunction();