1

作为一个练习,我正在尝试重写表示源代码的字符串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>)

term子句只匹配第二个子句(c d)。在我看来,它应该将所有剩余的(var val)子句作为一个列表((c d) (e f))。无论如何,我需要它这样做。

任何建议表示赞赏。

令我困惑的是,expr将匹配表达式列表,所以我想不出任何原因子句也不会这样做。

4

1 回答 1

2

您将需要. ,<clauses>,因为您想匹配列表的其余部分,而不仅仅是单个元素。出于同样的原因,该,<exprs>部分也需要。. ,<exprs>我相信还有其他专门用于匹配列表的语法,但使用.很简单,并且与列表在内部实现的方式相匹配。

于 2011-02-25T08:26:57.437 回答