diff options
| -rw-r--r-- | pez.c | 22 | ||||
| -rw-r--r-- | test.pez | 9 |
2 files changed, 19 insertions, 12 deletions
@@ -84,7 +84,6 @@ typedef struct Proto { char name[]; } Proto; - typedef struct Upval Upval; struct Upval { OBJHEADER; @@ -212,7 +211,6 @@ enum { }; #define VOID ((Val){0}) -#define _EMPTY ((Val){TAGEmpty}) #define _DELETED ((Val){TAGDeleted}) #define isvoid(v) ((v).r == 0) #define _isdeleted(v) (((v).r & 0xFF) == TAGDeleted) @@ -234,16 +232,15 @@ enum { #define box_cfn(x) ((Val){(uint64_t)(intptr_t)(x) << 2 | TAGCFn}) #define truthy(x) (!isvoid(x) && ((x).r == TAGBool ? unbox_bool(x) : 1)) -static Val length_sstr; +static Val len_sstr; static int typeof1(Val v) { if (isvoid(v)) return PEZ_TVoid; - if (isobj(v)) { + if (isobj(v)) return objtag(v); - } if (isnum(v)) return PEZ_TNumber; if (isbool(v)) @@ -1378,7 +1375,7 @@ apply(PezContext *cx, Val *ret, void *srcfn, int srcpc, Val recv, uint n) return runerr(cx, srcfn, srcpc, "array indexing takes one argument (got %d)", n), 0; } arg = args[0]; - if (arg.r == length_sstr.r) { + if (arg.r == len_sstr.r) { *ret = box_num(inttofix(arr->len)); return 1; } @@ -1399,7 +1396,7 @@ apply(PezContext *cx, Val *ret, void *srcfn, int srcpc, Val recv, uint n) return runerr(cx, srcfn, srcpc, "string indexing takes one argument (got %d)", n), 0; } arg = args[0]; - if (arg.r == length_sstr.r) { + if (arg.r == len_sstr.r) { *ret = box_num(inttofix(len)); return 1; } @@ -1437,7 +1434,7 @@ setapply(PezContext *cx, Val *ret, void *srcfn, int srcpc, Val recv, uint n, Val return runerr(cx, srcfn, srcpc, "array indexing takes one argument"), 0; } arg = args[0]; - if (arg.r == length_sstr.r) { + if (arg.r == len_sstr.r) { return runerr(cx, srcfn, srcpc, "cannot mutate array length"), 0; } TRY(checkindex(cx, &idx, srcfn, srcpc, "array", arr->len, arg)); @@ -1497,8 +1494,8 @@ exefn(PezContext *cx, Fn *fn, uint nargs) int n = code[ip++] + 1; Val *it = cx->stktop - n; assert(cx->stktop > cx->stack + n); - for (int i = 0; i < n; ++i ) { - TRY(push(cx, it[i])); + for (int i = 0; i < n; ++i) { + TRY(push(cx, it[i])); } } CASE(Odupbck) { @@ -3454,7 +3451,7 @@ setexpr(Comp *cm) break; case Olength: --code->len; - TRY(compconst(cm, length_sstr)); + TRY(compconst(cm, len_sstr)); argc = 1; opcode = Oapply; goto Oapply; @@ -3729,6 +3726,7 @@ forstmt(Comp *cm) resetlastops(cm); return compop(cm, Ovoid); } + static bool stmt(Comp *cm) { @@ -3907,7 +3905,7 @@ pez_new(PezAllocFn *alloc, void *userdata, size_t stacksize) if (!cx->stack) goto Err; cx->stktop = cx->stack; cx->stkend = cx->stack + stacksize; - if (!box_str(cx, &length_sstr, "length", 6)) assert(0); + if (!box_str(cx, &len_sstr, "len", 3)) assert(0); if (!initcore(cx)) goto Err; cx->gcthresh = stacksize * sizeof(Val)*5/2 + 128; @@ -42,3 +42,12 @@ printf["4+1+3: %a\n", add[4,1,3]] } printf["test %a\n", gather[-1, (), 'x]] + +@map: {[f, xs] + @ys: array#filled[xs.len, ()] + FOR [@i: 0][< xs.len][+ 1] + ys[i] = f[xs[i]] + ys +} + +printf["%a\n", map["abcd", #[1,2,0]]] |