MITスキームでこの些細な(Common Lispの)マクロに相当するものを作成しようとすると困惑します:
(defmacro funcify (exp)
`(lambda (x) ,exp))
これは、2回目のSICP講義で構築された関数に基づく数値方程式ソルバーである、単純な個人プロジェクト用です。このマクロが「安全」または「衛生的」でないことや、expが'x以外の記号を参照している場合に変数をキャプチャすることは気にしません。書けるようになりたい
(solv '(* 60 x) '(* 90 (- x 1)))
ここで、solvは次のとおりです。
(define (solv lh-exp rh-exp)
(solve (funcify lh-exp) (funcify rh-exp)))
入力する代わりに
(solve (lambda (x) (* 60 x)) (lambda (x) (* 90 (- x 1))))
しかし、MITスキームの構文規則を使用してこれを行う方法を理解することはできません。
私はこれを試しましたが、機能しません:
(define-syntax funcify
(syntax-rules ()
((funcify y) (lambda (x) y))))
;Value: funcify
(funcify x)
;Value 17: #[compound-procedure 17]
((funcify x) 10)
;Unbound variable: x
私はおそらく言及する価値のない他のことを試みましeval
たが、役に立たなかったのです。
また、Schemeのマクロシステムに関する優れたチュートリアル(参照ではない)への参照は、小さな簡単な例から始まり、十分な解説付きで構築され、特にバッククォート-コンマスタイルのLISPマクロ(私にとっては非常に直感的です)をに変換する方法を示していますスキームの構文マクロシステムは素晴らしいでしょう。