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
不可以。數據 - >語法方法給所有東西都提供相同的上下文(即選擇表單)。參數和fun-exprs可能有不同的上下文。 – soegaard
示例:如果參數由一個宏產生,fun-exprs由另一個宏產生,則上下文不同。 – soegaard