考虑以下代码:
(call-with-values
(lambda ()
(call/cc (lambda (k)
(k k k))))
(lambda (x y)
(procedure-arity y)))
这里很明显,call/cc
调用点的延续是右侧的 lambda,所以它的 arity 应该是 2。但是,上面的返回值(在 Racket 中)是(arity-at-least 0)
相反的。
事实上,在 Guile 中运行类似的代码(代替procedure-minimum-arity
)procedure-arity
表明延续也应该允许任意数量的参数,即使很明显不是这种情况。
那么,这是为什么呢?据我所知(如果我的理解有误,请纠正我),延续的元数非常简单:它是 1 ,但在 的上下文中除外call-with-values
,在这种情况下,无论右侧 lambda 的元数是多少。(当然,如果它是 acase-lambda
或类似的,可能会很复杂,但不会比(procedure-arity (case-lambda ...))
直接调用更复杂。)