let
それ自体を使用して再実装するマクロを Lisp で作成しようとしています。これは実用的な目的のない些細な演習です。しかし、関連する質問に回答した後、おそらくマクロについてもっと学ぶべきだと気づきました。これらは Lisp の優れた点の 1 つとしてもてはやされていますが、私はめったに使用しません。
とにかく、これが私が最初に試したことです:
(defmacro mylet (args &rest exp) `(let ,args (dolist (x ,exp) x)))
しかし、次のようなことを試みると:
(mylet ((a 5) (b 2)) (print (+ a b)))
これはエラーをスローします:
#1=(PRINT (+ A B)) is not a symbol or lambda expression in the form (#1#) .
args (a と b) は適切に設定されていますが、print ステートメントは機能しません。マクロ内で作成した変数を参照するという、2 つのレベルの間接参照を使用しているためだと思います。しかし、私はそれを修正する方法を理解できないようです!何か案は?