方案:如何在不带括号的语法规则中扩展具有多个变量的模式

Cha*_*lim 3 macros scheme syntax-rules

我正在尝试在 Plan 中为 Picolisp 样式表达式编写一个宏let,我们称这个宏为let-slim。为了更简洁(如 Picolisp),我希望在仅声明一个变量时它们的用法看起来像这样

(let-slim var-name initial-value
  (display var-name))
Run Code Online (Sandbox Code Playgroud)

或者类似的东西来声明任意数量的变量(请注意,这是伪代码,我实际上不会包含省略号)

(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))
Run Code Online (Sandbox Code Playgroud)

第一个用例编写匹配模式相当简单syntax-rules,但后者我正在努力解决。

这不起作用,因为只会init重复

(define-syntax let-slim
  (syntax-rules ()
    [(_ (var init ...) body ...)
     (let ((var init) ...)
       body ... )]))
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为它被认为是放错位置的省略号

(define-syntax let-slim
  (syntax-rules ()
    [(_ (var ... init ...) body ...)
     (let ((var init) ...)
       body ... )]))
Run Code Online (Sandbox Code Playgroud)

这不起作用,因为我需要在参考点使用括号(这意味着与内置相比,它绝对没有任何变化let

(define-syntax let-slim
  (syntax-rules ()
    [(_ (var init) ...) body ...)
     (let ((var init) ...)
       body ... )]))
Run Code Online (Sandbox Code Playgroud)

那么,有没有办法重复 2 个变量syntax-rules而不需要将它们包装在括号中,或者我是否需要使用不同的宏系统(即syntax-casedefmacro)?

Syl*_*ter 6

使用 执行此操作并不是最佳选择syntax-rules,但由于它是图灵完备的,所以可以这样做:

(define-syntax let-slim
  (syntax-rules (pair)
    ((_ pair bindings () body)
     (let bindings . body))
    ((_ pair (acc ...) (k v . rest) body)
     (let-slim pair (acc ... (k v)) rest body))
    ((_ (elements ...) . body)
     (let-slim pair () (elements ...) body))))
Run Code Online (Sandbox Code Playgroud)