Ianのやつ

Ianのやつを勉強中。Lispの世界とObjectの世界を行ったり来たりできるものの、数字も普通の数とタグつきのオブジェクトの世界で別だし、メッセージとして送るか式として評価するかによってシンタックスを変えなくてはいけないので、なかなか混乱します。mapを書くだけでも死ぬほど時間がかかって、ようやく

(define map
  (lambda (func list)
     (let ((s [list size])
           (ret [Array new: [list size]])
	   (idx '0)
	   (tmp 0))
	(while [idx < s]
	    (set tmp (func [list at: idx]))
	    [ret at: idx put: tmp]
	    (set idx [idx + '1]))
	ret)))

(define n '(1 2 3))
(define n (map (lambda (x) ['3 * x]) n))
[StdOut nextPutAll: [n printString]]

というものになりました。listは実はExpression型のオブジェクトで、Arrayのように振舞います。コンパイラの中間表現として使われているものです。