fixed SP restoration.
[bugg-scheme-compiler.git] / src / c / scheme.h
blobc61f0ed23496106ff68bc174f0b8322c8cbc4c58
1 /* scheme.h
2 * A header file that defines the basic Scheme data types, etc. Used
3 * with the scheme->c compiler.
4 * Programmer: Mayer Goldberg, 2000
5 */
7 #ifndef __SCHEME_H
8 #define __SCHEME_H
10 #ifndef NULL
11 #define NULL ((void *)0)
12 #endif
14 typedef enum SchemeType {
15 SCHEME_VOID,
16 SCHEME_TYPE_FIRST = SCHEME_VOID,
17 SCHEME_INT,
18 SCHEME_CHAR,
19 SCHEME_BOOL,
20 SCHEME_STRING,
21 SCHEME_NIL,
22 SCHEME_PAIR,
23 SCHEME_VECTOR,
24 SCHEME_SYMBOL,
25 SCHEME_CLOSURE,
26 SCHEME_TYPE_END /* not to be used */
27 } SchemeType;
29 /* basic support for scheme objects */
31 typedef struct SchemeIntData {
32 int value;
33 } SchemeIntData;
35 typedef struct SchemeCharData {
36 char value;
37 } SchemeCharData;
39 typedef struct SchemeBoolData {
40 int value;
41 } SchemeBoolData;
43 typedef struct SchemeStringData {
44 int length;
45 char *value;
46 } SchemeStringData;
48 typedef struct SchemePairData {
49 struct SchemeObject *car, *cdr;
50 } SchemePairData;
52 typedef struct SchemeVectorData {
53 int length;
54 struct SchemeObject **vec;
55 } SchemeVectorData;
57 typedef struct SchemeSymbolData {
58 struct SymbolEntry *sep;
59 } SchemeSymbolData;
61 typedef struct SchemeClosureData {
62 struct SchemeObject **env;
63 void *code;
64 } SchemeClosureData;
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;
75 } SchemeObjectData;
77 typedef struct SchemeObject {
78 SchemeType type;
79 SchemeObjectData *schemeObjectData;
80 } SchemeObject;
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
140 * later.
143 typedef struct SymbolEntry {
144 char *name;
145 int isDefined;
146 SchemeObject *sob;
147 } SymbolEntry;
149 typedef struct SymbolNode {
150 SymbolEntry *sym;
151 struct SymbolNode *left, *right;
152 } SymbolNode;
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();
173 #endif