1
は、私がこのようなマクロがあるとしましょう:余分なかっこなしのマクロ内でのマッピングですか?
(define-syntax (choose stx)
(define data (syntax->datum stx))
(define args (cadr data))
(define body (cddr data))
(define output
`(apply (case (car ,args)
,(map (lambda (choice)
`((,(car choice)) ,(cadr choice)))
body)
(else (displayln "error")))
(cdr ,args)))
(println output)
#'(void))
私はこの(より多くのオプションがあるかもしれない)のようなもので、これを使用する場合:
(choose args
("run" runsomething)
("del" delsomethingelse))
それは
(apply
(case (car args)
((("run") runsomething)
(("del") delsomethingelse))
(else (displayln "error")))
(cdr args))
にそれを変換し
これは有効なコードではありません。マップが余分なカッコを付けたためです。代わりに、私にこのことを教えてください:
(apply
(case (car args)
(("run") runsomething)
(("del") delsomethingelse)
(else (displayln "error")))
(cdr args))
どうすればいいですか?
あなたはそれが 'syntax-> datum'は、語彙情報を削除しますが、それは' datum->はsyntaxの最初のパラメータ( 'ctxt')によって解決されていないと言いますか? – Wysaard
いいえ。datum->構文アプローチは、すべてのものに対して同じコンテキスト(選択フォームを使用する)を与えます。 argsとfun-exprsは異なるコンテキストを持つかもしれません。 – soegaard
例:あるマクロでargsを生成し、別のマクロでfun-exprsを生成すると、コンテキストは異なります。 – soegaard