【发布时间】:2016-10-02 17:47:27
【问题描述】:
我有一个对表达式进行一些处理的函数:
(struct sym (s) #:transparent)
(define (foo-fn ex)
(match ex
[(? symbol? s) `(sym (quote ,s))]
[(? list? xs) (cons (car xs) (map foo-fn (cdr xs)))]
[x x]))
此功能按预期工作:
> (foo-fn '(cons x y))
'(cons (sym 'x) (sym 'y))
现在我正在尝试创建一个宏,它采用它给出的表达式并将其替换为foo-fn 的结果。我已经设法获得了一些方法
(define-syntax-rule (foo ex)
(foo-fn (quote ex)))
但是,这个宏仍然给出了引用的表达式,我想要表达式本身。也就是说,虽然我当前的代码给出了
> (foo (cons x y))
'(cons (sym 'x) (sym 'y))
我希望结果是
> (foo (cons x y))
(cons (sym 'x) (sym 'y))
我已经设法通过使用 eval 找到了解决方法,但我很确定这不是宏的使用方式(如果我错了,请纠正我)
(define-syntax-rule (foo ex)
(eval (foo-fn (quote ex))))
虽然上述方法有效,但我认为这是使用宏的错误方式。首选的方法是什么?
【问题讨论】: