SICP 読み (274) 5.3 記憶の割り当てとごみ集め

なんと言えば良いか分かりませんが、バイナリアンな考え方が脳に微妙にフィットしてません。大昔に見た超長い basic のコードにアレルギーがあるのかも (何

問題 5.21

ようやく a.の解に至りました。正しいかどうか不明。しかも (not (pair tree)) なソレはスルーでお願いします。

(controller
 (assign cont (label done))
 loop
 (test (op null?) (reg tree))
 (branch (label null))
 (test (op not-pair?) (reg tree))
 (branch (label leaf))
 (save cont)
 (save tree)
 (assign cont (label right))
 (assign tree (op car) (reg tree))
 (goto (label loop))
 right
 (restore tree)
 (assign tree (cdr tree))
 (assign cont (label left))
 (save val)
 (goto (label loop))
 left
 (assign n (reg val))
 (restore val)
 (restore cont)
 (assign val (op +) (reg val) (reg n))
 (goto (reg cont))
 leaf
 (assign val (const 1))
 (goto (reg cont))
 null
 (assign val (const 0))
 (goto (reg cont))
 done)

一応ちょっとした検証にはパスしてるんですが、もう少しチェックな必要あり、と見ています。

追記

こんなにシンプルな書き方ができるのは、cons とか car とか car に込められた魔法なのだろうか、とタワ言を述べてみたり (何
# ってシンプルなのかなぁ (を