Common Lisp からChicken Schemeに移行しようとしていますが、多くの問題があります。
define-syntax
私の現在の問題は次のとおりです:他のマクロを呼び出すマクロ (おそらく ? を使用) を作成するにはどうすればよいですか?
たとえば、Common Lisp では、次のようなことができます。
(defmacro append-to (var value)
`(setf ,var (append ,var ,value)))
(defmacro something-else ()
(let ((values (list))
(append-to values '(1)))))
一方、Scheme では、同等のコードは機能しません。
(define-syntax append-to
(syntax-rules ()
((_ var value)
(set! var (append var value)))))
(define-syntax something-else
(syntax-rules ()
((_)
(let ((values (list)))
(append-to values '(1))))))
マクロからマクロを呼び出すことはappend-to
できませんsomething-else
。append-to
「変数」が未定義であるというエラーが表示されます。
私が Google や他の情報源から収集したすべての情報によると、マクロは他のコードにアクセスすることなく、閉じた環境で評価されます。基本的に、組み込みの Scheme 関数とマクロを除いて、マクロが評価されるときは何も存在しません。er-macro-transformer
、syntax-case
(とにかくChickenでは非推奨になっています)、さらにはprocedural-macros
モジュールを使用してみました。
確かに、マクロの全体的な目的は、コードの繰り返しを避けるために、他のマクロの上に構築されることです。マクロを単独で作成する必要がある場合、それらはほとんど役に立たない、と私は考えています。
私は他のスキームの実装を調査しましたが、もう運がありませんでした。それは単にできないようです。
誰かがこれを手伝ってくれますか?