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();