2

私は、Scheme で Picolisp スタイルのlet式用のマクロを作成しようとしています。このマクロを と呼びましょうlet-slim。(Picolisp のように) より簡潔にするために、変数を 1 つだけ宣言するときに、その使用法を次のようにしたいと考えています。

(let-slim var-name initial-value
  (display var-name))

または、任意の数の変数を宣言するためのこのようなもの (これは疑似コードであり、実際には省略記号を含めないことに注意してください)

(let-slim (var-name-1 initital-value-1
           var-name-2 initital-value-2
           ...
           var-name-n initital-value-n)
  (+ var-name-1 var-name-2 ... var-name-n))

syntax-rules最初のユースケースは、一致するパターンを書くのはかなり簡単ですが、後者は苦労しています。

init繰り返されるだけなので、これは機能しません

(define-syntax let-slim
  (syntax-rules ()
    [(_ (var init ...) body ...)
     (let ((var init) ...)
       body ... )]))

間違った場所にある省略記号と見なされるため、これは機能しません

(define-syntax let-slim
  (syntax-rules ()
    [(_ (var ... init ...) body ...)
     (let ((var init) ...)
       body ... )]))

参照ポイントで括弧を使用する必要があるため、これは機能しません(つまり、組み込みと比較してまったく何も変更されませんlet

(define-syntax let-slim
  (syntax-rules ()
    [(_ (var init) ...) body ...)
     (let ((var init) ...)
       body ... )]))

では、2 つの変数を括弧で囲むことなく繰り返す方法はありますか、それとも別のマクロ システム (または)syntax-rulesを使用する必要がありますか?syntax-casedefmacro

4

2 に答える 2