我有这个宏:
(define-syntax inspect
(syntax-rules ()
[(_ x) (printf "~a is: ~a\n" 'x x)]))
其中的作用如下:
(let ([x 2]) (inspect x))
>> x is: 2
但我想做的是扩展它以便我有
(_ x ...)
并循环提供各种值,相应地打印出它们的变量名和值。
即
(let ([x 2] [y 3]) (inspect x y))
>> x is: 2
y is: 3
我有点卡在这一部分。
例如,有这样的事情:
(define-syntax (inspect stx)
(datum->syntax
stx
(for ([i (cdr (syntax->list stx))])
(printf "~a is: ~a" (syntax->datum i) i))))
我不确定如何在最后一行获得i的值。
感谢任何帮助。
感谢。
答案 0 :(得分:3)
没有必要使用双模式规则 - 您可以使用begin
执行整个操作:
(define-syntax-rule (inspect x ...)
(begin (printf "~a is: ~a\n" 'x x) ...))
答案 1 :(得分:2)
这是一个解决方案:
(define-syntax inspect
(syntax-rules ()
[(_ x) (printf "~a is: ~a\n" 'x x)]
[(_ x y ...) (begin (inspect x) (inspect y ...))]))
请注意,子句的排序很重要。