作为一个练习,我正在尝试重写表示源代码的字符串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将匹配表达式列表,所以我想不出任何原因子句也不会这样做。