延续与功能的区别是什么?

ayh*_*hid 5 lisp scheme continuations callcc

延续描述接下来会发生什么价值,对吧?这不仅仅是一个获取值并进行一些计算的函数吗?

(+ (* 2 3) 5)
Run Code Online (Sandbox Code Playgroud)

继续(* 2 3)(+ _ 5)

(define k (lambda (v) (+ v 5)))
Run Code Online (Sandbox Code Playgroud)

什么是使用的点call/cc在这里,而不是使用功能k

Syl*_*ter 6

真正.所有程序都有延续,直到它停止.一个延续通常是底层实现计算的一个步骤.

你的例子:

(+ (* 2 3) 5)
Run Code Online (Sandbox Code Playgroud)

组合+取决于组合*首先完成.因此(+ result 5)确实是延续(* 2 3).但是,这不是这种情况下的程序.有用的call/cc是当你有一个遗憾而后悔并想要做别的事情或者你想在以后回到这个时候.让我们做第一个:

(define g 0)
(call/cc 
  (lambda (exit)
    (/ 10 (if (= g 0) (exit +Inf.0) g))))
Run Code Online (Sandbox Code Playgroud)

很明显,当if的结果完成时,有一个除法是继续,但是自从exit运行以来,整个事物被短路以返回+ Inf.0.

你怎么会用一个程序做到这一点,而不是让它在之后进行划分?在这种风格,你不能.

由于Scheme将您的代码转换为Continuation Passing Style(= CPS)并且在CPS call/cc中没有特殊之处,因此这并不是真正的魔力.在CPS中编写代码并非易事.

这是CPS的定义 call/cc

(define (kcall/cc k consumer)
  (consumer k (lambda (ignore v) (k v))))
Run Code Online (Sandbox Code Playgroud)