Macros Racket宏,打印变量名及其值的列表
我有一个宏:Macros Racket宏,打印变量名及其值的列表,macros,racket,Macros,Racket,我有一个宏: (define-syntax inspect (syntax-rules () [(_ x) (printf "~a is: ~a\n" 'x x)])) 其工作原理如下: (let ([x 2]) (inspect x)) >> x is: 2 但我想做的是扩展它,以便 (_ x ...) 并循环提供各种值,相应地打印出它们的变量名和值 即 我对这部分有点迷恋 例如,对于类似以下内容: (define-syntax (inspect stx) (
(define-syntax inspect
(syntax-rules ()
[(_ x) (printf "~a is: ~a\n" 'x x)]))
其工作原理如下:
(let ([x 2]) (inspect x))
>> x is: 2
但我想做的是扩展它,以便
(_ x ...)
并循环提供各种值,相应地打印出它们的变量名和值
即
我对这部分有点迷恋
例如,对于类似以下内容:
(define-syntax (inspect stx)
(datum->syntax
stx
(for ([i (cdr (syntax->list stx))])
(printf "~a is: ~a" (syntax->datum i) i))))
在最后一行,我不确定如何得到I的值
感谢您的帮助
谢谢。这里有一个解决方案:
(define-syntax inspect
(syntax-rules ()
[(_ x) (printf "~a is: ~a\n" 'x x)]
[(_ x y ...) (begin (inspect x) (inspect y ...))]))
请注意,子句的顺序很重要。不需要有两种模式规则——您可以使用
开始执行整个操作:
(define-syntax-rule (inspect x ...)
(begin (printf "~a is: ~a\n" 'x x) ...))
谢谢我还试图了解更多关于模式变量方面的信息。我会在问题的底部添加一个编辑,这样你就能明白我的意思了。
(define-syntax-rule (inspect x ...)
(begin (printf "~a is: ~a\n" 'x x) ...))