Section 17Want more of a challenge? View in iconic form (experimental)

# HACK describe changes to the implicit interpreter to allow new special forms
[hear] (define base-translate / translate);

[hear] (define translate /
? x /
if (= (x) 10) 15 (base-translate / x));

[hear] (= 10 15);

[hear] (= (+ 10 15) 30);

[hear] (define translate / base-translate);

[hear] (not / = 10 15);

[hear] (= (+ 10 15) 25);

# now can create a special form for lists
[hear] (define translate /
? x /
if (number? /
x)
(base-translate /
x)
(if (= (head / x) vector)
(translate /
prepend
((list 2) list (list-length / tail / x))
(tail /
x))
(base-translate /
x)));

[hear] (= (vector 1 2 3) ((list 3) 1 2 3));

# now to desugar let expressions
[hear] (define translate-with-vector / translate);

[hear] (define translate-let-form /
? x /
? body /
if (= (list-length / x) 0)
(translate /
body)
(translate-let-form
(tail /
x)
(vector
tail /
x))));

[hear] (define translate /
? x /
if (number? /
x)
(translate-with-vector /
x)
(if (= (head / x) let)
(translate-let-form
tail /
x)
tail /
tail /
x))
(translate-with-vector /
x)));

[hear] (let ((x 20)) (= (x) 20));

[hear] (let ((x 50) (y 20)) (= (- (x) (y)) 30));

# the is-list function is now on dubious ground
# this stuff will be replaced with typing ASAP
[hear] (define is-list /
? x /
not /
number? /
x);

[hear] (is-list / (list 2) 1 3);

[hear] (is-list / (list 0));

[hear] (not / is-list 23);

[hear] (is-list /
(list 3) ((list 2) 2 3) 1 (? x / + (x) 10));