木構造をこねくり回す
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)))
うむ、うまく動いているようだ。
木構造をこねくり回している感覚が味わえた。
木構造すなわちソースコードをいじって、その結果ソースコードを取得するって、なんかメタプログラミングのニオイがするな。
マクロの背中が見えた気がする。