【发布时间】:2019-04-17 17:32:38
【问题描述】:
我试图或多或少地通过syntax-rules 重新创建一个let 构造,但它似乎因使用两个椭圆而绊倒。
我试着写成这样:
(define-syntax if-let
(syntax-rules ()
[(_ (([binding value] ...)
([binding2 funct value2])
([binding3 value3] ...)) then else) (let ([binding value] ...
[binding2 value2]
[binding3 value3] ...)
(if (funct binding2) then else))]))
我认为[binding2 funct value2] 中间的不同模式将能够在模式方面提供一个清晰的划分,即第一个模式何时结束以及第二个模式何时开始,但我一直在返回错误标题。
预期的结果是能够做类似的事情
(if-let ([var1 1]
[diff null? '(1 2 3 4 5)]
[var2 2])
var1
var2)
并返回2,但能够在diff 之前和之后拥有尽可能多的vars,因此最终使用的变量的顺序并不重要。
我是否遗漏了一些明显的东西?这种模式是否可以用卫生宏来完成?感谢您的帮助!
【问题讨论】:
标签: macros scheme guile syntax-rules