4
我有不上表達一些處理功能:從宏觀球拍Unquoting
(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))))
雖然上述作品,這是我的信念,這是使用宏的不正確的方法。什麼是首選方法?