木構造をこねくり回す

7章4節の最後に、lambdaを使った関数定義とMIT形式の変換をやる関数が紹介されている。
特に練習問題ではないけど、自分で書いてみないと気が済まないのでやってみた。

gosh> (define primitive->mit
        (lambda (expr)
          (list (car expr)
                (cons (car (cdr expr))
                      (car (cdr (car (cdr (cdr expr))))))
                (car (cdr (cdr (car (cdr (cdr expr)))))))))
primitive->mit
gosh> (primitive->mit '(define function (lambda (a b c) ((a b) c))))
(define (function a b c) ((a b) c))

gosh> (define mit->primitive
        (lambda (expr)
          (list (car expr)
                (car (car (cdr expr)))
                     (list 'lambda
                           (cdr (car (cdr expr)))
                           (car (cdr (cdr expr)))))))
mit->primitive
gosh> (mit->primitive '(define (function a b c) ((a b) c)))
(define function (lambda (a b c) ((a b) c)))

うむ、うまく動いているようだ。
木構造をこねくり回している感覚が味わえた。
木構造すなわちソースコードをいじって、その結果ソースコードを取得するって、なんかメタプログラミングのニオイがするな。


マクロの背中が見えた気がする。