lisp 标记形心_如何解释 Lisp 中 call/cc 的概念?

Lisp等函数式语言中无return关键字,但call/cc提供了一种显式控制返回的方式。call/cc允许创建可传递的延续(current-continuation),即函数返回的上下文,用于实现复杂的控制流,如错误处理、回溯等。虽然与throw-catch类似,但call/cc的'return'是第一类公民,可存储和传递。call/cc的概念源自λμ-calculus,通过显式标记控制流提供更强大的功能,常用于处理一些特殊的控制流问题。
摘要由CSDN通过智能技术生成

逻辑层面别的答主已经解释得很详细了。

我想(不自量力地)尝试下给出一个比较直观简单的解释。

在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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值