|
@ -1,6 +1,6 @@ |
|
|
# minproto.leg -- minimal prototype langauge for semantic experiments |
|
|
# 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 nil (&_nil) |
|
|
|
|
|
|
|
|
|
|
|
#define UNDEFINED 0 |
|
|
|
|
|
|
|
|
enum type getType(oop obj) |
|
|
enum type getType(oop obj) |
|
|
{ |
|
|
{ |
|
|
# if TAGS |
|
|
# if TAGS |
|
@ -393,7 +395,7 @@ oop newSymbol(char *name) |
|
|
{ |
|
|
{ |
|
|
oop obj = make(Symbol); |
|
|
oop obj = make(Symbol); |
|
|
_set(obj, Symbol,name, strdup(name)); |
|
|
_set(obj, Symbol,name, strdup(name)); |
|
|
_set(obj, Symbol,value, nil); |
|
|
|
|
|
|
|
|
_set(obj, Symbol,value, UNDEFINED); |
|
|
return obj; |
|
|
return obj; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -566,7 +568,7 @@ oop Object_get(oop obj, oop key) |
|
|
if (ind >= 0) return _get(o, Object,properties)[ind].val; |
|
|
if (ind >= 0) return _get(o, Object,properties)[ind].val; |
|
|
o = _getDelegate(o); |
|
|
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; |
|
|
return nil; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -577,7 +579,9 @@ oop getvar(oop obj, oop key) |
|
|
if (ind >= 0) return _get(obj, Object,properties)[ind].val; |
|
|
if (ind >= 0) return _get(obj, Object,properties)[ind].val; |
|
|
obj = _getDelegate(obj); |
|
|
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) |
|
|
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 self = eval (Object_get(exp, sym_self ), env); |
|
|
oop meth = Object_get(exp, sym_method ) ; |
|
|
oop meth = Object_get(exp, sym_method ) ; |
|
|
oop iargs = evargs(Object_get(exp, sym_arguments), env); |
|
|
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); |
|
|
return apply(ifunc, self, iargs, env); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|