【发布时间】:2017-07-27 08:20:32
【问题描述】:
假设我有一个这样的宏:
(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))
我怎么能做这样的事情?
【问题讨论】: