問題タブ [callcc]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
haskell - call/cc の実装?
call/cc の実装方法を見つけようとしています。私が見つけた最高のものは、このHaskellスニペットです:
これは私が望むほど単純ではありませんがCont
とrunCont
. 実際のコードほど明確ではありませんが、それが何をするかの説明も見つけました。
では、最も単純な形で実装するにはどうすればよいでしょうか。これらは私が好む2つの言語であるため、これにSchemeとHaskellのタグを付けています。
functional-programming - call / ccを使用して再帰を実装することは可能ですか?
関数自体を本体で呼び出さずに再帰関数を定義することは可能でしょうか。代わりに、どういうわけかcall / ccを使用しますか?ありがとう。
scheme - ベテランのスキーマーの get-first、get-next、waddle 関数
「The Seasoned Schemer」という本に精通していない人にとっては、get-first
、get-next
、および(最後の 2 つはここでは定義されていません) は、葉のみを生成するために渡されたツリーを反復処理するコルーチンwaddle
を明らかにモデル化するための手順です。最後から 2 番目の再エントリでの yield の直前に、純粋な値のみを返す場所に再エントリ ポイントを設定します。つまり、yield の代わりにisの実際の値をずっと純粋な機能。 waddle
waddle
'()
'()
waddle
'()
get-first
これを念頭に置いて、何が設定されているかを見ることができます... waddle
"実際に" を返すとき、それはincall/cc
の中にあり、その値は(そして、これは最後の繰り返しでに戻ることを意図しています。したがって、の「実際の」リターンを行うのは) です。 get-first
(leave (quote ()))
get-first
leave
get-next
get-next
'()
では、なぜ 2 番目のバージョンは同等ではないのですか?waddle
の値は'()
の引数になります。leave
ruby - callcc を使用する Ruby Enumerator が終了しない
Enumerable#take
列挙子が与えられたときに終了しない理由を理解するのに苦労しています:
enum.cをざっと見てみると、おそらくargs[1]のカウンターが要求された最初の長さにリセットされ、反復が2019行で終了しないように見えます。私の理解では、列挙子の内部ファイバーが (でyielder << x
)降伏したときにスタックを復元する必要c.call ...
があるため、問題になることはありません (一時的args[1]
に元の長さの引数に戻っているにもかかわらず)...しかし、それはそうではないようです場合があります。
fib.take(n)
一部の n > 1 で終了しない理由を誰か説明できますか? callcc
私がおそらくここで見逃している仕組みについての基本的なことはありますか?
注:これは Ruby 1.9.3 に関するものです。そして、はい、私の使用法はちょっとcallcc
ばかげていることに気づきました:)。
scheme - スキーム、呼び出し/cc
だから私はcall/cc
Schemeでこのすべてを理解しようとしています。以下は私が取り組んでいるコードです:
ここで、最初の括弧内に 2 つの引数を追加し始めます。1
熱心な評価のために評価しなければならない残りの部分。そのため、call/cc
引数を 1 つ受け入れる関数があり、call/cc
呼び出しによって評価されます。(私は正しいですか?) 同時に、これまでに起こったことの残りの部分が最初の括弧内に保持されます。つまり(+ 1 [])
、これは「継続」です。(私は正しいですか?) それでk
、先ほど説明したように、継続でlambda を呼び出します(+ 1 [])
。関数では、これが数字であるかどうかを尋ねますが、そうではなく、「then」を実行します。ここで「道に迷った」のですが、この秒は何をしcall/cc
ますか? (k 4)
この全体を評価するために、何が呼び出され5
ますか?
scheme - リターン機能を実装する
return
Scheme R6RS で関数を実装しようとしています。私はそのようなものが欲しい:
を実行し(do-some-job-before)
、実行しない (do-some-job-after)
で、ラムダ関数の最終的な値をsome-value
.
私は継続を使用する必要があると思います。私は試した:
しかし、うまくいきません。例えば
これどうやってするの?
scheme - スキーム: ネストされた call/cc はコルーチンに対してどのように機能しますか?
http://community.schemewiki.org/?call-with-current-continuationからのコルーチンの次の例を見ています。
余分な作業:
call/cc を初めて使用する場合、コンテキストはどのようなものになるはずですか? コンテキストとは、callcc のジャンプの結果、どこに「戻る」べきかということです。
私が理解していることから、最初に call/cc を呼び出すと、do-other-stuff は本質的に余分な計算のコードを実行し、set の直後のポイントにジャンプするプロシージャになります! (ポイントA)。2 回目は、「ポイント B にジャンプ」動作を「ポイント A にジャンプしてコンテキストを実行するか、ポイント A に続く任意のコード」をラップします。これは正しいです?
セットの場合、このコードは機能しないようです。実際に起こりました。それともセットですか!このコードが機能するために必要ですか?
何が起こっているかを視覚的に表現することは本当に役に立ちます。
math - スキームの魔方陣
私はまだSchemeに不慣れで、call/ccとamb演算子を使用して魔方陣を解こうとしています。現在、印刷中です:
なぜそれらの数字だけを使っているのか理解できません。それは私の区別ですか?手順?これが私のコードです:
scheme - call/cc を使用してループを作成します。開始する
次のコード ブロックは両方とも (私の考えでは) 無限ループである必要があります
これは機能します
これは動作しません:
唯一の違いは、ラムダを使用するものと開始ブロックを使用するものです。2 番目のコード ブロックが機能しないのはなぜですか?
ありがとう