LISP语法:call/cc(call-with-current-continuation)

今天发现一道EssProgLan上比较鬼畜的题目:
在这里插入图片描述
看完这道题完全不知道想让我干什么。经过一番查阅发现原来是想让我实现 lisp语言中的call/cc函数,在知乎上看了一番,发现解释得太理论了看不懂,于是试了一个例子,基本能理解了。

其用法是:(call/cc f) 等价于 (f p),其中p是一个逃逸函数(这个名字比较奇怪,其实就是一个保存continuation的函数,调用这个函数就可以返回到调用call/cc的语境中)。

这个函数初看很难理解,不过通过两个例子基本上就能感受到了,首先附上我解释器的代码(实现了letcc和throw的版本,另外一版明天补上):
https://paste.ubuntu.com/p/QjWqTkx782/

我们来看两个例子,第一个例子是:

(run "let call-with-current-continuation = proc (p) letcc cont in (p proc(v) throw v to cont)
      in let y = proc (x) list((x 4),5)
         in -(3,(call-with-current-continuation y))")

返回值为-1,这是因为在调用(call/cc y)时保留了continuation,也就保留了上下文语境-(3,[])&#

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值