次のコードを検討してください。
(call-with-values
(lambda ()
(call/cc (lambda (k)
(k k k))))
(lambda (x y)
(procedure-arity y)))
ここでは、call/cc
呼び出しのポイントでの継続が右側のラムダであることが非常に明白であるため、そのアリティは2である必要があります。ただし、上記の戻り値(Racket)は(arity-at-least 0)
代わりになります。
実際、Guileで同様のコードを実行すると(の代わりprocedure-minimum-arity
にprocedure-arity
)、明らかにそうではない場合でも、継続によって任意の数の引数が許可されることが示されます。
それで、それはなぜですか?私が理解している限り(私の理解が間違っている場合は訂正してください)、継続のアリティは非常に単純です。のコンテキストを除いて1ですcall-with-values
。この場合、右側のラムダのアリティは何でもかまいません。(これは、当然のことながら、などの場合は複雑になる可能性がありますが、直接case-lambda
電話をかけている場合ほど複雑ではありません。)(procedure-arity (case-lambda ...))