Scheme让*作为嵌套的一元让

作为练习,我试图重写代表
let*
的源代码的字符串作为嵌套的unary let。这是我的最大努力:
(define let*→nested-unary-lets
  (match-lambda
   (`(let* (()) ,<exprs>)
   `(let () ,<exprs>))
   (`(let* ((,<var> ,<val>)) ,<exprs>)
   `(let ((,<var> ,<val>)) (let () ,<exprs>)))
   (`(let* ((,<var> ,<val>) ,<clauses>) ,<exprs>)
   `(let ((,<var> ,<val>)) (let*→nested-unary-lets '(let* (,@<clauses>) ,<exprs>))))))
我目前遇到的问题是模式:
`(let* ((,<var> ,<val>) ,<clauses>) ,<exprs>)
与以下字符串不匹配:
'(let* ((a b) (c d) (e f)) <expressions>)
术语条款仅匹配第二个条款
(c d)
。在我看来,它应该将所有剩余的
(var val)
条款作为列表
((c d) (e f))
。无论如何,我需要它这样做。 任何建议表示赞赏。 令我感到困惑的是,exprs将匹配一个表达式列表,所以我想不出任何理由为什么条款也不会这样做。     
已邀请:
你需要
. ,<clauses>
,因为你想匹配列表的其余部分,而不仅仅是一个元素。出于同样的原因,
,<exprs>
部分需要为
. ,<exprs>
。我相信还有其他语法专门用于匹配列表,但使用
.
很简单,并且匹配列表在内部实现的方式。     

要回复问题请先登录注册