2

私はこのマクロを持っています:

(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 の値を取得する方法がわかりません。

どんな助けでも大歓迎です。

ありがとう。

4

2 に答える 2

3

2つのパターンのルールを設定する必要はありません。すべてをbegin:で実行できます。

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

これが1つの解決策です:

(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 に答える