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) ...))