は、次のコードを考えてみましょう:継続はなぜ有用なものではないのですか?
(call-with-values
(lambda()
(call/cc (lambda (k)
(k k k))))
(lambda (x y)
(procedure-arity y)))
それはcall/cc
コールの時点での継続はとてもそのアリティはしかし2、戻り値である必要があり、右側のラムダであることをここでかなり明白です(ラケットで)上記の代わりに(arity-at-least 0)
です。
実際にGuile(をprocedure-arity
に置き換えて)で同様のコードを実行すると、継続が引数の数をいくつでも許していることがわかります。
だからこそ、なぜですか?私の理解が間違っていれば、正しいと思っている限り、継続のアリティはかなりわかりやすいです:call-with-values
という文脈を除いて1です。この場合は、右側のラムダのアリティが何であれです。 (どちらが、許可され、それがcase-lambda
などだ場合、複雑ませんが、あなたが直接(procedure-arity (case-lambda ...))
を呼び出した場合よりもより複雑にすることができます。)同じことを確認するために
IMO、それは継続が実際に呼び出されるまで、明示的な継続がコール/ ccで使用して作成されたときのように、コンテキストが不明である、任意の数の引数でなければなりません。仕様(R5/6)の「値」の定義はこれをうまくまとめていると思います。 – leppie
私は、どのように '値'が継続が任意のアリティを持っていることを意味するかについてはあまりよく分かりません。あなたは、継続がサポートしているものとは異なる数の値を返すことはできません。 :() '(+(値1 2 3)42)'は有効ではありません。このコンテキスト(R5RSで定義されている 'values 'を仮定)では、 –
また、 'call-with-values'では* consumer *がプロデューサ*ではなくアリティを決定します。 – leppie