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-arity
为procedure-arity
)显示,延续也理应允许任何数量的参数,即使它很显然不是这样.
那么,为什么呢?据我所知(如果我的理解是错误的,请纠正我),延续的优点非常简单:除了在上下文中它是1 call-with-values
,在这种情况下,它是右手lambda的arity.(如果它是一个case-lambda
或类似的话,被授予可能很复杂,但没有比你(procedure-arity (case-lambda ...))
直接打电话更复杂.)
查看相同内容的更简单方法是:
\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;; 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