我试图或多或少地let
通过重新创建一个构造,syntax-rules
但它似乎在使用两个椭圆时绊倒了。
我试着这样写出来:
(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
,但能够在远程需要var
之前和之后拥有尽可能多的 s,diff
因此最终使用的变量的顺序无关紧要。
我错过了一些明显的东西吗?这种模式是否可以用卫生宏来完成?谢谢你的帮助!