From 09c41142f324b63ea8ad3e87884085b0137efc50 Mon Sep 17 00:00:00 2001 From: Ian Piumarta Date: Tue, 21 May 2024 09:10:34 +0900 Subject: [PATCH] .eval methods are installed in all built-in object types when TYPECODES=1. println() prints object properties in alphabetical order. --- minproto.leg | 32 +++++++++++++++----------------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/minproto.leg b/minproto.leg index 4e5f423..dfb8c89 100644 --- a/minproto.leg +++ b/minproto.leg @@ -1,6 +1,6 @@ # minproto.leg -- minimal prototype langauge for semantic experiments # -# last edited: 2024-05-18 08:41:26 by piumarta on zora +# last edited: 2024-05-21 08:45:20 by piumarta on zora %{ ; @@ -108,8 +108,6 @@ oop printOn(oop buf, oop obj, int indent); doProtos(declareProto); #undef declareProto -#if TYPECODES - #define declareTypecode(NAME) t##NAME, enum typecode { UNDEFINED_TYPECODE, @@ -117,8 +115,6 @@ enum typecode { }; #undef declareTypecode -#endif // TYPECODES - #define makeProto(NAME) oop p##NAME = 0; doTypes(makeProto); #undef makeProto @@ -1178,7 +1174,7 @@ oop storeOn(oop buf, oop obj, int indent) break; } case Object: { - String_append(buf, '['); + String_appendAll(buf, "["); oop *elts = _get(obj, Object,indexed); int size = _get(obj, Object,isize); int i = 0; @@ -1187,14 +1183,17 @@ oop storeOn(oop buf, oop obj, int indent) codeOn(buf, elts[i], indent); ++i; } - struct property *kvs = _get(obj, Object,properties); - size = _get(obj, Object,psize); + oop names = sortObject(keys(obj, indent > 0), "print"); + size = _get(names, Object,isize); + elts = _get(names, Object,indexed); for (int j = 0; j < size; ++j) { - if (kvs[j].key == prop_delegate && kvs[j].val == pObject) continue; + oop key = elts[i]; + oop val = Object_getLocal(obj, key); + if (key == prop_delegate && val == pObject) continue; if (i++) String_appendAll(buf, ", "); - codeOn(buf, kvs[j].key, indent); + codeOn(buf, key, indent); String_appendAll(buf, ": "); - codeOn(buf, kvs[j].val, indent); + codeOn(buf, val, indent); } String_append(buf, ']'); break; @@ -3062,7 +3061,7 @@ enum typecode getTypecode(oop exp) return is(Symbol, name) ? _get(name, Symbol,typecode) : UNDEFINED_TYPECODE; } -#else // !TYPECODES +#endif // !TYPECODES #define defineEval(NAME) \ static inline oop prim_##NAME##_eval(oop func, oop exp, oop args, oop env) { \ @@ -3073,8 +3072,6 @@ doProtos(defineEval) #undef defineEval -#endif // !TYPECODES - #define defineCodeOn(NAME) \ static inline oop prim_##NAME##_codeOn(oop func, oop exp, oop args, oop env) { \ NAME##_codeOn(exp, getArgType(args, 0, String, #NAME".codeOn"), env); \ @@ -3440,13 +3437,14 @@ int main(int argc, char **argv) # define defineEvaluator(NAME) \ _set(intern(#NAME), Symbol,typecode, t##NAME); -#else // !TYPECODES -# define defineEvaluator(NAME) \ - Object_put(p##NAME, prop_eval, newPrimitive(prim_##NAME##_eval, newString(#NAME".__eval__"))); +# undef defineEvaluator #endif // !TYPECODES +# define defineEvaluator(NAME) \ + Object_put(p##NAME, prop_eval, newPrimitive(prim_##NAME##_eval, newString(#NAME".__eval__"))); + doProtos(defineEvaluator); # undef defineEvaluator