Recursion 模式匹配中递归调用的强制求值

Recursion 模式匹配中递归调用的强制求值,recursion,scheme,pattern-matching,racket,Recursion,Scheme,Pattern Matching,Racket,我使用match lambda重写了一些更基本的函数。下面是一个示例,它获取表示let*调用的输入代码的字符串,并将其作为转换为嵌套一元let的字符串返回: (define let*→nested-unary-lets (match-lambda (`(let* (()) ,<exprs>) `(let () ,<exprs>)) (`(let* ((,<var> ,<val>)) ,<exprs>) `(l

我使用match lambda重写了一些更基本的函数。下面是一个示例,它获取表示let*调用的输入代码的字符串,并将其作为转换为嵌套一元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*→嵌套的一元let,以便输出字符串仅包含嵌套的let和requires,无需进一步计算


谢谢。

您已经在使用quasiquoting在递归情况下输出您的答案,所以只需在递归调用
let*->嵌套一元let
之前添加一个逗号(
),即可立即对其进行计算。quasiquotes中的
可以拼接到任何表达式的结果中,而不仅仅是变量。该行:

`(let ((,<var> ,<val>)) (let*→nested-unary-lets '(let* (,@<clauses>) ,<exprs>)))

这要求将
的匹配项更改为
允许多个。

非常感谢!结果证明它必须是:,(让我们*→嵌套的一元let`(let*(,@),)--但如果没有您的建议,我永远不会到达那里。:-)@Schemer:我在
之前添加了
以允许多个;如果您只匹配一个,则准静态输出中也不应包含
`(let ((,<var> ,<val>)) (let*→nested-unary-lets '(let* (,@<clauses>) ,<exprs>)))
`(let ((,<var> ,<val>)) ,(let*→nested-unary-lets `(let* ,<clauses> . ,<exprs>)))