今天发现一道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,[])&#