下面是卢克·蒂尔尼的代码工具包中的一小块R:
if (! exists("callCC"))
callCC <- function(fun) {
value <- NULL
delayedAssign("throw", return(value))
fun(function(v) { value <<- v; throw })
}有人能给我解释一下吗?特别是,为什么用throw来搞恶作剧而不只是写return(value)?
原件在这里:https://gitlab.com/luke-tierney/codetools/-/blob/master/R/codetools.R
发布于 2022-05-06 17:59:54
你看过帮助页了吗?
callCC提供了一种非本地退出机制,可用于早期终止计算。callCC用一个参数,一个退出函数来调用乐趣。exit函数接受一个参数,即预期的返回值。如果乐趣主体调用退出函数,那么对callCC的调用将立即返回,其值将作为callCC返回的值提供给退出函数。
不调用return(value)的原因是它会从错误的位置返回,或者返回错误的值。如果密码是
callCC <- function(fun) {
value <- NULL
return(value)
fun(function(v) { value <<- v; throw })
}它总是返回NULL。如果是
callCC <- function(fun) {
value <- NULL
fun(function(v) { value <<- v; return(value) })
}它将从匿名函数返回,并在fun中继续。真正的callCC所做的就是完全退出callCC。
https://stackoverflow.com/questions/72145195
复制相似问题