私は、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-case
defmacro