gpt4 book ai didi

方案早期 "short circuit return"?

转载 作者:行者123 更新时间:2023-12-04 23:33:04 25 4
gpt4 key购买 nike

我试图找出如何在不使用顶级 if 的情况下在方案程序中进行“提前返回”。或 cond像构造。

(define (win b)
(let* ((test (first (first b)))
(result (every (lambda (i) (= (list-ref (list-ref b i) i) test))
(enumerate (length b)))))
(when (and (not (= test 0)) result) test))
0)

例如,在上面的代码中,我想要 win返回 test如果 when条件满足,否则返回0。然而,不管 when的结果如何,过程总是返回0。健康)状况。

我以这种方式构建代码的原因是因为在这个过程中我需要进行大量复杂的检查(类似于示例中的 let* 的多个块)并将所有内容放入一个大的 cond 中。会很笨重。

最佳答案

这里是如何使用 call/cc 来构建 return你自己。

(define (example x)
(call/cc (lambda (return)
(when (< x 0) (return #f))
; more code, including possible more calls to return
0)))

一些 Scheme 定义了一个名为 let/cc 的宏,它可以让你删除 lambda 的一些噪音:
(define (example x)
(let/cc return
(when (< x 0) (return #f))
0))

当然,如果您的 Scheme 没有,那么编写 let/cc 就很简单了。

这是有效的,因为 call/cc 将调用它的点保存为延续。它将延续传递给它的函数参数。当函数调用那个延续时,Scheme 放弃它到目前为止建立的任何调用堆栈,并从 call/cc 调用的末尾继续。当然,如果函数从不调用延续,那么它只是正常返回。

直到您开始从该函数返回它们,或者将它们存储在全局数据结构中并稍后调用它们之前,延续不会真正令人费解。否则,它们就像任何其他语言的结构化跳转语句(while/for/break/return/continue/exceptions/conditions)。

我不知道您的完整代码是什么样的,但最好使用 cond 并将复杂的检查分解为单独的函数。需要 returnlet*通常是过于命令式代码的症状。但是, call/cc 方法现在应该可以让您的代码正常工作。

关于方案早期 "short circuit return"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2434294/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com