Racket Macro,打印变量名称及其值的列表

时间:2013-01-10 00:59:58

标签: macros racket

我有这个宏:

(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的值。

感谢任何帮助。

感谢。

2 个答案:

答案 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 ...))]))

请注意,子句的排序很重要。

相关问题