diff --git a/calc.leg b/calc.leg index e62b8aa..b3d300a 100644 --- a/calc.leg +++ b/calc.leg @@ -6,27 +6,13 @@ * run: ( echo a=2*3; echo b=3+4; echo c=a*b ) | ./calc */ -#define SYMBOL_PAYLOAD \ - oop value; \ - int defined - -#define SYMBOL_INITIALISE(S) \ - S.value = null; \ - S.defined = false - #include "object.c" // this is the global scope -oop globals; +// oop globals; // this should stay out of object.c because it manipulates Symbol members defined in this file -oop update_symbol_value(oop symbol, oop integer) -{ - set(symbol, Symbol, value, integer); - return symbol; -} - oop apply(oop function, oop parameters) { return get(function, Function, primitive)(parameters); @@ -40,7 +26,7 @@ YYSTYPE yylval; start = - e:exp { yylval = e } -exp = l:IDENT EQUAL p:exp { $$ = update_symbol_value(l, p) } +exp = l:IDENT EQUAL p:exp { $$ = variableSet(l, p) } | l:postfix DOT i:IDENT EQUAL p:exp { $$ = map_set(l, i, p) } | l:postfix LBRAC i:exp RBRAC EQUAL p:exp { $$ = map_set(l, i, p) } | s:sum { $$ = s } @@ -78,7 +64,7 @@ value = n:NUMBER { $$ = n } | s:symbol { $$ = s } | m:map { $$ = m } | NULL { $$ = null } - | i:IDENT { $$ = get(i, Symbol, value) } + | i:IDENT { $$ = variableGet(i) } | LPAREN i:exp RPAREN { $$ = i } string = SQUOTE < (!SQUOTE .)* > SQUOTE { $$ = makeString(yytext) } @@ -136,7 +122,8 @@ int main(int argc, char **argv) { globals = makeMap(); - set(intern(globals, "exit"), Symbol, value, makeFunction(prim_exit)); // map_set(globals, intern("exit"), makeFunction(prim_exit)); + variableSet(intern(globals, "exit"), makeFunction(prim_exit)); + // map_set(globals, intern("exit"), makeFunction(prim_exit)); while (yyparse()) { println(yylval); diff --git a/object.c b/object.c index 67c85b3..dfaf765 100644 --- a/object.c +++ b/object.c @@ -37,13 +37,12 @@ struct String { struct Symbol { type_t type; char *name; -#if defined(SYMBOL_PAYLOAD) - SYMBOL_PAYLOAD; -#endif // defined(SYMBOL_PAYLOAD) }; typedef oop (*primitive_t)(oop params); +oop globals; + struct Function { type_t type; primitive_t primitive; @@ -131,9 +130,6 @@ oop makeSymbol(char *name) oop newSymb = memcheck(malloc(sizeof(union object))); newSymb->type = Symbol; newSymb->Symbol.name = name; -#if defined(SYMBOL_INITIALISE) - SYMBOL_INITIALISE(newSymb->Symbol); -#endif // defined(SYMBOL_INITIALISE) return newSymb; } @@ -185,6 +181,13 @@ ssize_t map_search(oop map, oop key) return -1 - l; // negative result => 'not found', reflected around -1 instead of 0 to allow 'not found' at index 0 } +bool map_hasKey(oop map, oop key) +{ + assert(is(Map, map)); + assert(key); + return map_search >= 0; +} + oop map_get(oop map, oop key) { assert(is(Map, map)); @@ -257,6 +260,26 @@ oop map_append(oop map, oop value) return map_set(map, makeInteger(get(map, Map, size)), value); } +bool variableIsDefined(oop aSymbol) +{ + assert(is(Symbol, aSymbol)); + return map_hasKey(globals, aSymbol); +} + +oop variableSet(oop aSymbol, oop value) +{ + assert(is(Symbol, aSymbol)); + assert(value); + map_set(globals, aSymbol, value); + return value; +} + +oop variableGet(oop aSymbol) +{ + assert(is(Symbol, aSymbol)); + return map_get(globals, aSymbol); +} + void print(oop ast) { assert(ast); @@ -271,8 +294,7 @@ void print(oop ast) printf("'%s'", get(ast, String, value)); return; case Symbol: - printf("%s=", get(ast, Symbol, name)); - print(get(ast, Symbol, value)); + printf("%s", get(ast, Symbol, name)); return; case Function: printf("Function@%p", get(ast, Function, primitive));