diff options
Diffstat (limited to 'docs/history/10-zc/code/tests/meta.zc')
| -rw-r--r-- | docs/history/10-zc/code/tests/meta.zc | 46 |
1 files changed, 0 insertions, 46 deletions
diff --git a/docs/history/10-zc/code/tests/meta.zc b/docs/history/10-zc/code/tests/meta.zc deleted file mode 100644 index 9c81616..0000000 --- a/docs/history/10-zc/code/tests/meta.zc +++ /dev/null @@ -1,46 +0,0 @@ -fn ipow(a, b) { var r = 1; while (b > 0) { r *= a; b--; } return r; } -// a parse word that adds an operator to the compiler's tables -immediate fn pow_op() { next(); add_binop("**", 11, "ipow c"); return 0; } -pow_op - -// unless (cond) stmt: a parse word that emits code itself -immediate fn unless() -{ - var a; - next(); - expect(intern("(")); rval(); plainuse(expr()); rval(); expect(intern(")")); - emitseq(useq[0], ulen[0]); // not - a = hole(); op(O_JZ); // skip the body when the condition was true - substmt(); - setlit(a, here); - return 0; -} -// repeat N { body }: a macro, built from token lists -immediate fn repeat() -{ - var n, body, i = 0; - next(); n = tv; next(); - body = grab(); - while (i < n) { feed(qdup(body)); i++; } - free(body as d); - return 0; -} -fn main() -{ - putn(2 ** 10); putc(' '); putn(3 + 2 ** 3 * 2); putc(10); - unless (1 > 2) puts("unless ok\n"); - unless (2 > 1) puts("wrong\n"); - repeat 3 { putc('r'); } - putc(10); - var q = quote { putn(40 + 2); putc(10); return 7; }; - putn(q[0]); putc(' '); - putn(eval(q)); putc(10); - var f = compile(q); - putn(f()); putc(10); - free(q as d); - var d = quote { fn sq(x) { return x * x; } }; - load(d); - free(d as d); - putn(evals("return sq(12);")); putc(10); - return 0; -} |
