問題タブ [thunk]
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.
exception - サンクの結果として例外が発生した場合、その例外はサンクの結果として保持されますか?
私は、最終的に例外で失敗する長時間実行サンクを作成するこの小さなプログラムを作成しました。次に、複数のスレッドがそれを評価しようとします。
スレッドの数を増やしても、明らかに計算に影響はありません。これは、失敗したサンクが結果として例外を保持することを示唆しています。本当ですか?この動作はどこかに文書化/指定されていますか?
更新:forkFinally
行を次のように変更します
各スレッドが例外で失敗することを確認します。
javascript - function(){return x} よりも簡潔な遅延評価?
遅延評価に大きく依存する Python コードをいくつか移植しています。これはthunksによって実現されます。より具体的には、<expr>
遅延評価が必要な Python 式は、Python の「ラムダ式」、つまりlambda:<expr>
.
私の知る限り、これに最も近い JavaScript はfunction(){return <expr>}
.
私が取り組んでいるコードはそのようなサンクで完全にあふれているため、可能であれば、それらのコードをより簡潔にしたいと考えています。この理由は、文字を節約するため (JS に関しては無視できない考慮事項) だけでなく、コードをより読みやすくするためでもあります。私が言いたいことを理解するには、次の標準の JavaScript フォームを比較してください。
と
最初の形式では、実質的な情報、つまり式は、周囲の...fetchx()
によって誤植的に隠されています。2 番目の形式1では、 「遅延評価マーカー」として( ) 文字が 1 つだけ使用されます。これが最適なアプローチだと思います2。function(){return
}
\
AFAICT によると、この問題の解決策は次のカテゴリに分類されます。
eval
遅延評価をシミュレートするために使用します。- 私が知らない特別な JavaScript 構文がいくつかありますが、それは私が望むことを実現します。(私は JavaScript について非常に無知なので、この可能性は非常に現実的に見えます。)
- プログラムによって正しい JavaScript に処理される非標準の JavaScript でコードを記述します。(もちろん、このアプローチは最終的なコードのフットプリントを減らすことはありませんが、少なくとも読みやすさの向上を維持する可能性があります。)
- 上記のどれでもない。
最後の 3 つのカテゴリの回答を聞くことに特に興味があります。
PS: eval
(上記のオプション 1) の使用が JS の世界で広く推奨されていないことは承知していますが、FWIW、以下にこのオプションのおもちゃの図を示します。
アイデアは、遅延評価のためにプレーンな文字列を JavaScript コードとしてタグ付けすることだけを目的とするプライベートラッパー クラスを定義することです。C
次に、短縮名 ( 「CODE」など) を持つファクトリ メソッドを使用して、次のように削減します。
に
まず、ファクトリC
とヘルパー関数の定義maybe_eval
:
get
次の関数と関数の比較はlazyget
、上記がどのように使用されるかを示しています。
obj
どちらの関数も、 object 、 key key
、および default 値の3 つの引数を取り、 が に存在する場合は両方とも、存在しないobj[key]
場合はデフォルト値を返します。key
obj
2 つの関数の唯一の違いは、 のデフォルト値がlazyget
thunk になる可能性があることです。その場合、key
が にない場合にのみ評価されobj
ます。
これら 2 つの関数の動作を確認するには、次のように定義します。
次に、上記を評価し、(たとえば) Firefox + Firebug を使用した後、次のようにします。
プリントアウト
1 ...Haskell プログラマーにとっては奇妙になじみ深いものかもしれません。:)
2遅延評価マーカーの必要性を完全に回避する別のアプローチがあり、Mathematica などで使用されています。このアプローチでは、関数の定義の一部として、非標準評価用の仮引数のいずれかを指定できます。タイポグラフィ的には、このアプローチは確かに最大限控えめですが、私の好みには少し多すぎます。\
その上、それは、たとえば遅延評価マーカー
として使用するほど柔軟ではありません。
promise - サンク、フューチャー、プロミスの違いは何ですか?
それらに関する wiki 記事があります: ( http://en.wikipedia.org/wiki/Futures_and_promises、http://en.wikipedia.org/wiki/Thunk_(delayed_computation) )。しかし、プログラミング言語の概念としての3つの正確な違いは何ですか? future と promise は並行プログラミングでのみ適用できますか?
sml - SML でサンクを記述する方法は複数ありますか?
基本的な初心者の質問:
遅延評価する必要があるデータがあります。これを行う最も一般的な方法は、thunk
s;を作成することです。私が慣れている方法は次のようなものです:
しかし、Standard ML のすべてのガイドでは、次のように行われていると教えてくれます。
だから私の質問は:それは本当に重要ですか?とにかく出力は同じではありませんか?関数を作成することと、ラムダを値にバインドすることの違いは何ですか?
c++ - x64 用の単純な Windows コールバック サンク
多くの人は、ウィンドウ作成などの ATL サンクに精通しています。これを機能させるクラス CStdCallThunk は、WindowProc呼び出しを対象としています。本質的には、グローバル コールバックを C++ オブジェクトのメンバー関数に変換します。
このタイプのサンクは、最初のパラメーターをそのまま必要とするSetWindowsHookEx コールバックでは機能しません。32 ビット Windows の場合、 ATL/AUXライブラリの一部である CAuxThunk で適切な解決策を見つけました。残念ながら、これはネイティブの 64 ビット実行可能ファイルでは機能しません。
この CAuxThunk にパッチを当てて 64 ビット ウィンドウで動作するようにしたり、この __stdcall コールバックをメンバー関数に変換する同等のサンクを作成したりできる x64 アセンブリの第一人者がいるのだろうか?
ありがとう、
ニコス
haskell - :ポリモーフィック値のスプリント?
この場合、なぜ:sprint
報告するのか疑問に思っています。xs = _
しかし、この場合ではありません:
注: で実行ghci
してい-XNoMonomorphismRestriction
ます。xs
の型が最初のケースでは多形的であるが、2番目のケースではそうではないという事実と関係がありますか? 内部で何が起こっているのか知りたいです。
haskell - サンクをシリアル化またはファイルに保存するにはどうすればよいですか?
Haskell では、完全に計算するのではなく、サンクを使用するため、無限リストを使用できます。データのサンクをシリアル化するか、ファイルに保存する方法があるかどうか疑問に思っています。たとえば、 list があるとします[0..]
。次に、いくつかの処理を行います (私は主にtail
andに興味がありますが、 orの実行も(:)
サポートする必要があります)。ここに、私が探しているものの例を示します。filter
map
と
node.js - コールバックをサンクに変換
私はkoa.jsでマングースを使用しています(おそらく悪い選択ですが、それに固執する必要がありました)。私の最初のコールバック関数は次のとおりです。
これは通常のエクスプレスの世界では機能するはずでしたが、後でサンクの形で書き直す必要があることに気付いたので、現在の試みは
しかし、これは最初のマングース呼び出しの User.findone からユーザーの詳細を返します。他のものは無視されているようです。ありがとう
haskell - Haskell はコンパイル時に特定のサンクを展開しますか?
実行時に Haskell に特定のサンクを展開させる方法はありますか。たとえば、私が持っているとしましょう
goldRatio
コンパイル時に評価するにはどうすればよいですか。たとえば、
頭が弱くてもいいしControl.Deepseq.force
、あとはなんとかなる。テンプレート Haskell でできると聞いたのですが、よくわかりません。
注: 現在 GHC を使用しています。
javascript - thunkify / yield が常に配列を返すのはなぜですか?
私はlogInlinethunk
と呼ばれています( Coのドキュメントから適応)。
thunkifiedget
は常にyield
配列のように見えます。これは設計によるものですか?これthunkify
を行っていますか、それとも の標準部分yield
ですか?
ここで変数 'google' は常に配列であることに注意してください。なんで?request.get
通常は返されることに注意してくださいerr, response
(つまり、配列はありません)。
スクリプト、BTW、200
または google.com が返すその他の応答コードが返されます。
残念ながら、利回りのドキュメントはかなりまばらな ATM です。
編集:サンクは常に配列を返すとは限りません。例var readFile = thunkify(fs.readFile);
:
この場合、fileContents は配列内では返されません。では、なぜ google は配列の中にあったのでしょうか? サンクが返すものを制御するサンク化に何かがあるようです