diff --git a/minproto.leg b/minproto.leg index 8de41cd..a6e5432 100644 --- a/minproto.leg +++ b/minproto.leg @@ -1,6 +1,6 @@ # minproto.leg -- minimal prototype langauge for semantic experiments # -# last edited: 2024-05-09 11:30:35 by piumarta on zora-1034.local +# last edited: 2024-05-09 13:59:36 by piumarta on zora-1034.local %{ ; @@ -160,6 +160,8 @@ union object _nil = { Undefined }; #define nil (&_nil) +#define UNDEFINED 0 + enum type getType(oop obj) { # if TAGS @@ -393,7 +395,7 @@ oop newSymbol(char *name) { oop obj = make(Symbol); _set(obj, Symbol,name, strdup(name)); - _set(obj, Symbol,value, nil); + _set(obj, Symbol,value, UNDEFINED); return obj; } @@ -566,7 +568,7 @@ oop Object_get(oop obj, oop key) if (ind >= 0) return _get(o, Object,properties)[ind].val; o = _getDelegate(o); } - fatal("%s.%s is undefined", storeString(obj, 0), storeString(key, 0)); + fatal("undefined property: %s.%s", storeString(obj, 0), storeString(key, 0)); return nil; } @@ -577,7 +579,9 @@ oop getvar(oop obj, oop key) if (ind >= 0) return _get(obj, Object,properties)[ind].val; obj = _getDelegate(obj); } - return is(Symbol, key) ? _get(key, Symbol,value) : nil; + oop value = _get(key, Symbol,value); // asserts is(Symbol,key) + if (!value) fatal("undefined variable: %s", storeString(key, 0)); + return value; } oop setvar(oop obj, oop key, oop val) @@ -1250,8 +1254,7 @@ oop Invoke_eval(oop exp, oop env) oop self = eval (Object_get(exp, sym_self ), env); oop meth = Object_get(exp, sym_method ) ; oop iargs = evargs(Object_get(exp, sym_arguments), env); - oop ifunc = Object_get(self, meth); - if (nil == ifunc) fatal("%s.%s is undefined", storeString(self, 0), storeString(meth, 0)); + oop ifunc = Object_get(self, meth); // fails if property not defined return apply(ifunc, self, iargs, env); }