Sua*_*uan 4 scheme continuations short-circuiting
我试图找出如何在不使用顶级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)
Run Code Online (Sandbox Code Playgroud)
例如,在上面的代码,我想win返回test,如果when条件得到满足,否则返回0.但是,什么情况是,该过程将始终返回0,无论结果的when条件.
我以这种方式构造代码的原因是因为在这个过程中我需要做很多复杂的检查(类似于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)))
Run Code Online (Sandbox Code Playgroud)
一些方案定义了一个名为let/cc的宏,它可以让你删除lambda的一些噪音:
(define (example x)
(let/cc return
(when (< x 0) (return #f))
0))
Run Code Online (Sandbox Code Playgroud)
当然,如果你的方案没有,那么让/ cc写起来是微不足道的.
这是有效的,因为call/cc保存了它被称为延续的点.它将该延续传递给它的函数参数.当函数调用该延续时,Scheme放弃它到目前为止构建的任何调用堆栈,并从call/cc调用结束继续.当然,如果函数从不调用continuation,那么它只是正常返回.
直到您开始从该函数返回它们,或者可能将它们存储在全局数据结构中并稍后调用它们之前,Continuations不会真正令人费解.否则,它们就像任何其他语言的结构化goto语句一样(而/ for/break/return/continue/exceptions/conditions).
我不知道你的完整代码是什么样的,但最好还是使用cond并将复杂的检查分解为单独的函数.需要return并且let*通常是过于强制性的代码的症状.但是,call/cc方法应该让你的代码现在正常工作.