为什么延续没有用处?

Chr*_*ung 5 scheme continuations racket

请考虑以下代码:

(call-with-values
    (lambda ()
      (call/cc (lambda (k)
         (k k k))))
  (lambda (x y)
    (procedure-arity y)))
Run Code Online (Sandbox Code Playgroud)

这里很明显,在call/cc调用点的延续是右边的lambda,所以它的arity应该是2.但是,上面的返回值(在Racket中)是(arity-at-least 0)相反的.

事实上,在狡诈运行类似的代码(替换procedure-minimum-arityprocedure-arity)显示,延续也理应允许任何数量的参数,即使它很显然不是这样.

那么,为什么呢?据我所知(如果我的理解是错误的,请纠正我),延续的优点非常简单:除了在上下文中它是1 call-with-values,在这种情况下,它是右手lambda的arity.(如果它是一个case-lambda或类似的话,被授予可能很复杂,但没有比你(procedure-arity (case-lambda ...))直接打电话更复杂.)

Eli*_*lay 2

查看相同内容的更简单方法是:

\n\n
(call-with-values\n  (lambda () (error \'arity "~v" (procedure-arity (call/cc (\xce\xbb (k) k)))))\n  (lambda (x y) (procedure-arity y)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

甚至更简单:

\n\n
(procedure-arity (call/cc (\xce\xbb (x) x)))\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于你的问题 - 很明显,在第一种情况下,延续需要两个输入,但这样的情况并不太常见。例如,它们通常是这样的示例,而“真实代码”将使用define-values或具有一些未知的延续,其中创建的延续call/cc可以具有不同的数量,具体取决于它们创建的上下文。这意味着尝试找出这些连续性已知的罕见情况没有多大意义。

\n\n

脚注:

\n\n
;; nonsensical, but shows the point\n(define (foo) (call/cc (\xce\xbb (x) x)))\n(define x (foo))\n(define-values [y z] (foo))\n
Run Code Online (Sandbox Code Playgroud)\n