2

我有这个宏:

(define-syntax inspect
  (syntax-rules ()
    [(_ x) (printf "~a is: ~a\n" 'x x)]))

像这样工作:

(let ([x 2]) (inspect x))
>> x is: 2

但我想做的是扩展它,以便我拥有

(_ x ...)

并遍历提供的各种值,相应地打印出它们的变量名称和值。

IE

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

任何帮助表示赞赏。

谢谢。

4

2 回答 2

3

不需要有两种模式的规则——你可以用 a 来做所有的事情begin

(define-syntax-rule (inspect x ...)
  (begin (printf "~a is: ~a\n" 'x x) ...))
于 2013-01-10T13:27:56.033 回答
2

这是一个解决方案:

(define-syntax inspect
  (syntax-rules ()
    [(_ x) (printf "~a is: ~a\n" 'x x)]
    [(_ x y ...) (begin (inspect x) (inspect y ...))]))

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

于 2013-01-10T02:46:27.353 回答