强制评估模式匹配中的递归调用

发布于 2024-10-19 10:21:33 字数 883 浏览 2 评论 0原文

我正在使用 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*→nested-unary-lets 的示例:

(let*→nested-unary-lets '(let* ((a 1) (b (+ a 1)) (c (+ a b))) (displayln c)))
'(let ((a 1))
   (let*→nested-unary-lets
    '(let* ((b (+ a 1)) (c (+ a b)))
       (displayln c))))

我想知道是否有任何方法强制对 let*→nested-unary-let 的递归调用求值,以便输出字符串仅包含嵌套的 let 并且不需要进一步求值。

谢谢。

I am using match-lambda to rewrite certain functions in terms of more basic ones. Here is an example that takes strings representing input code for let* calls and returns them as strings converted to nested unary lets:

(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>))))))

Here is an example of a call to let*→nested-unary-lets:

(let*→nested-unary-lets '(let* ((a 1) (b (+ a 1)) (c (+ a b))) (displayln c)))
'(let ((a 1))
   (let*→nested-unary-lets
    '(let* ((b (+ a 1)) (c (+ a b)))
       (displayln c))))

I was wondering if there is any way to force the evaluation of the recursive call to let*→nested-unary-lets so that the output string contains only nested lets and requries no further evaluation.

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

想你的星星会说话 2024-10-26 10:21:33

您已经在递归情况下使用准引用来输出答案,因此只需在递归调用 let*->nested-unary-lets,) > (与 之前的一样),因此会立即对其进行评估。准引号中的 , 可以拼接任何表达式的结果,而不仅仅是变量。该行:

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

还有一些其他问题:为了使 ,@ 工作,内部 let* 之前的 ' 需要被<代码>`。这是我建议的版本:

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

这需要将 的匹配更改为 。 , 允许多个表达式。

You are already using quasiquoting to output your answer in the recursive case, so just add a comma (,) before the recursive call to let*->nested-unary-lets (like the ones before <var> and <val>) so it is evaluated immediately. The , in quasiquotes can splice in the result of any expression, not just variables. The line:

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

has some other problems as well: in order for the ,@ to work, the ' before the inner let* needs to be `. Here is the version I suggest:

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

That requires that the match for <exprs> be changed to . ,<exprs> to allow more than one.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文