私はCommon LispからChicken Schemeに移動しようとしていますが、問題はたくさんあります。チキンスキームマクロから他のマクロを呼び出すには?
現在の問題は次のとおりです。他のマクロを呼び出すマクロ(おそらくdefine-syntax
を使用していますか?)を書くにはどうすればよいですか?スキームでは、同等のコードが動作しないのに対し
(defmacro append-to (var value)
`(setf ,var (append ,var ,value)))
(defmacro something-else()
(let ((values (list))
(append-to values '(1)))))
:Common Lispの中で、私はこのような何かを行うことができますたとえば
、
(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
モジュールを使用しようとしました。
確かにマクロの全体の目的は、それらがコードの繰り返しを避けるために、他のマクロに基づいて構築されていることです。もしマクロが孤立して書かれなければならないのであれば、私の心にはあまり意味がありません。
私は他のSchemeの実装を調査しましたが、それ以上の運がありませんでした。それは単にできないと思われる。
誰か助けてもらえますか?
'syntax-rules'マクロよりも複雑なことは、非標準的なSchemeなので、あなたがしたいことは多くの* specific * Schemesでかなり可能ですが、行う方法は多分様々です。この種の質問をしたいのであれば、具体的なSchemeの実装を選び、それをどのように複製するかを尋ねるほうが良いでしょう。 –
@AlexisKingありがとう、私は1つの実装にもっと焦点を当てるように私の質問を修正しました。 –
私はその質問をよく理解していません。おそらく、あなたはCHICKENで作業することができないCommon Lispの例を与えることができますか? – sjamaan