Parcourir la source

<type>.eval methods are installed in all built-in object types when TYPECODES=1. println() prints object properties in alphabetical order.

master
Ian Piumarta il y a 1 an
Parent
révision
09c41142f3
1 fichiers modifiés avec 15 ajouts et 17 suppressions
  1. +15
    -17
      minproto.leg

+ 15
- 17
minproto.leg Voir le fichier

@ -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

Chargement…
Annuler
Enregistrer