【发布时间】:2011-07-04 03:33:13
【问题描述】:
作为一个练习,我尝试将表示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>)
clauses 项仅匹配第二个子句(c d)。在我看来,它应该将所有剩余的(var val) 子句作为列表((c d) (e f))。无论如何,我需要它这样做。
感谢任何建议。
让我感到困惑的是 exprs 会匹配一个表达式列表,所以我想不出任何为什么 clauses 不会这样做。
【问题讨论】:
-
这是this one的后续问题。
标签: scheme racket let rewriting