fn ipow(a, b) { let 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() { let 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() { let n, body, i = 0; next(); n = tv; next(); body = grab(); while (i < n) { feed(qdup(body)); i++; } free(d*body); return 0; } fn main() { put_n(2 ** 10); put_c(' '); put_n(3 + 2 ** 3 * 2); put_c(10); unless (1 > 2) put_s("unless ok\n"); unless (2 > 1) put_s("wrong\n"); repeat 3 { put_c('r'); } put_c(10); let q = quote { put_n(40 + 2); put_c(10); return 7; }; put_n(q[0]); put_c(' '); put_n(eval(q)); put_c(10); let f = compile(q); put_n(f()); put_c(10); free(d*q); let defs = quote { fn sq(x) { return x * x; } }; load(defs); free(d*defs); put_n(evals("return sq(12);")); put_c(10); return 0; }