逻辑层面别的答主已经解释得很详细了。
我想(不自量力地)尝试下给出一个比较直观简单的解释。
在Lisp等很多函数式语言中是没有return关键字的。
函数会将计算得到的值返回到调用它的位置(return关键字就是这样的意思),我们并不需要显式指定返回的位置(隐式地加了return):
(define(foo x)
;;other stms
(+x x))
(+(foo 3) 2);; 8
;;(foo 3)计算的结果为6,然后将6返回调用它的位置,即(+ _ 2)
如果lisp需要显式地加return关键字,这段代码会这样写
(define(foo x)
;;other stms
(return (+x x)))
当然,Lisp没有return关键字,事实上return关键字还是有用的,比如我们有时候需要提早返回的时候。
不过Lisp中可以用call/cc显式地指定它
(define(foo x)
(call/cc(λ(return)
;;other stms
(return (+x x)))))
这段代码跟上面的是一个意思(并不完全一样,这里的“return”其实并不是直接返回到外面,而是将值返回到对应的call/cc处),但我们可以为“return”起名字。仅仅是这样,我们就获得了比有return关键字的语言强大得多的能力了:
(define(div x y)
(call/cc
(λ(returnOk)
(let([err (call/cc
(λ(re