問題タブ [trampolines]

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.

0 投票する
1 に答える
390 参照

scala - ファンクターとしてのトランポリン

Functor として Trampoline[+A] をデモンストレーションしようとしています (つまり、map[B](f: A = >B) を提供します)。Stackless Scalaで説明されているように、トランポリンのモナドとしての古典的な実装を理解しています。
ただし、 Trampoline の Done および More サブクラスのみを使用してmap関数 (flatMap ではない)を実装する方法はありますか、それとも Flatmap サブクラスも追加する必要がありますか?

0 投票する
2 に答える
421 参照

c++ - テンプレートを使用したインスタンス メソッドのトランポリン関数への static のコーディング

やや醜いテンプレートコーディングを書き直そうとしています。

参考までに、オリジナルはこちら: https://codereview.stackexchange.com/questions/69545/recode-cc-trampoline-function-macros-using-templates

私のコードは CPython (C ライブラリ) とインターフェイスします。Python ランタイムは "myInst.foo" を認識し、テーブルで "foo" を検索して呼び出します。

(静的メソッドを C 関数ポインターに型キャストできることに注意してください)

FooHandler は、Final の正しいインスタンスの Foo メソッドにトランポリンします。

実際には、ハンドルはそれほどきれいではなく、それぞれが同一のハンドラーを必要とするメソッドが多数あります (ただし、関数アドレスは異なります)。

ハンドラーメカニズムを次のような基本クラスに抽象化しようとしています:

現在、コンパイラ エラー ( http://ideone.com/vOtbcD ) でスタックしているため、この手法が有効かどうかさえわかりません。

これを行う方法はありますか、それとも本当にマクロが必要な場合の 1 つにすぎませんか?

参考までに、オリジナルはこちら: https://codereview.stackexchange.com/questions/69545/recode-cc-trampoline-function-macros-using-templates

ご覧のとおり、オリジナルはかなり醜いマクロを使用しています。

0 投票する
2 に答える
332 参照

javascript - 「トランポリン」方式の違い

私は最近 JS の学習を始めましたが、関数型言語の領域に飛び込むのはこれが初めてです。

npm モジュールで「トランポリン」の演習を行っていたfunctional-javascript-workshopところ、自分のソリューションと公式のソリューションの間に興味深い違いがありました。どちらも完全に正常に動作しますが、実際の違いが正確に何であるかについては途方に暮れています。私は自分のソリューションをかなりよく理解していますが、他のソリューションも機能する理由を正確には理解していません。

私の解決策

公式ソリューション

具体的には、最後の部分に興味があります-公式のソリューションは、単に渡すのではなく、匿名関数を作成するのはなぜrepeatですか?

0 投票する
3 に答える
622 参照

c++ - Lambda/Template/SFINAE を使用してトランポリン関数の try/catch セーフガードを自動化する

私は100個ほどのトランポリン機能を持っています。try/catch ブロック内でそれぞれを自動ラップすることが可能かどうかを知りたいです。

簡単な質問ではありませんので、あらかじめご了承ください。まず、(単純化された) コードで問題を説明し、次に、読者がどこにいるのかを理解できるように、以下でできる限り答えようとします。

Foo には関数ポインタ テーブルがあります。

EDIT : これはC 関数のポインタテーブルです。だからそれは受け入れることができましたstatic W::w
署名はこちら: http://svn.python.org/projects/python/trunk/Include/object.h

編集:ここでテストケースを試みました:

特定のスロットが「ロード」されている場合、これはそれにロードされるものです:

これらすべてを個別に定義する必要がないように、ラムダを使用してこれを達成しようとしていますfunc53。このようなもの:

ただし、これはエラーをトラップできません。return ステートメントの周りに try/catch を配置する必要があります。

ただし、これにより多くの混乱が生じます。私ができればいいのですが:

trap私の質問は: この関数を (#define を使用せずに)記述する方法はありますか?


これは私がこれまでに思いついたものです:

これにより、必要なすべての情報が渡されると思います。

トラップの定義は次のようになります。

これにより、非常にクリーンな構文が可能になる場合があります。

現時点では、いくつかの法律が違反されているかどうかさえわかりません。 table->fp_53有効な C 関数ポインターでなければなりません。

非静的メンバー関数 ( ) のアドレスを渡しても、&Base::f53>これはテンプレート パラメーターであり、署名には影響しないため、これに違反しません。trap

同様に、...C では varargs が許可されているので問題ありません。

これが実際に有効である場合、クリーンアップできますか?

私の考えは次のとおりです。

1) おそらく ... をパックとしてテンプレート パラメータに戻す必要があります。
2) トラップの戻り値の型を推測し、1 つのテンプレート パラメータを保存することは可能かもしれません。

3) そのBase::Funcテンプレート パラメータは不正な構文です。そして、それは合法的なものにさえ近づいていないと思います。これは、アプローチ全体を台無しにする可能性があります。

0 投票する
2 に答える
602 参照

c++ - 例外的に安全なトランポリンの設計パターン

この質問はここから続きます。しかし、前の質問の言い回しが非常に悪かったため (実際には間違っていました)、最初からもう一度質問するよう提案されました。

C 関数ポインターのテーブルがあります。

一部の C コード (lib-X と呼びましょう) には、基本的な構成要素 (X オブジェクトと呼びましょう) があります。各 X オブジェクトは、このテーブルの関数を呼び出すことができます。

これらのテーブル関数は、通常、異なるシグネチャを持ちます (ここの typedef を参照)。ただし、複数の関数が同じシグネチャを共有することは可能です。表には、これらの関数が約 100 あります。

C++ では、各 X オブジェクトに関連付けられた Final:Base クラスがあります。

そして、これらの呼び出しを X オブジェクトの対応する C++ Final インスタンスに転送したいのですが、C++ コンシューマーがバグのある Final を提供する可能性があるため、これを try/catch 内に囲みたいと思います。

したがって、テーブルの各エントリに対して仮想関数を持つ C++ 基本クラスがあります。

次に、基本クラスから派生した C++ Final クラス (多くの場合、Final1 Final2 Final3 など) があります。

だから今、私はハンドラーを書く必要があります

  1. 最初の「self」パラメーターを取得します (これは常に、関数を呼び出した X オブジェクトへのポインターになります)

  2. 関連する C++ 基本クラス インスタンスを取得します。

  3. try catch ブロック内で、対応する仮想関数を呼び出し、残りのすべてのパラメーターを転送します。

  4. ...実際に Final でオーバーライドを呼び出します。

これは、インセプションのプロットを理解しようとするようなものです。lib-X は実際には Python ランタイムですが、私は物事を一般的なものにしようとしています。

問題は、これらの関数が数十あることです。これにより、非常に面倒で保守不可能な C++ コードが作成されます。それぞれのトランポリン関数を手動で作成する必要がある場合は、次のようになります。

(ソースはこちら

私は、この例外的に安全なトランポリンを可能にするコンパクトなデザインを考え出そうとしています.

現在の進捗状況は [削除済み、下記の回答を参照]

0 投票する
1 に答える
253 参照

scala - Scala: トランポリン関数の拡張構文が末尾再帰を壊す

これは、末尾再帰関数を解釈するためのトランポリンを実装するための「Scala での関数型プログラミング」の第 13 章の演習です。

runTrampoline2末尾再帰ではなく、テスト入力でスタックをオーバーフローさせます。さらに、tailrec注釈は のコンパイラ エラーを示しrunTrampoline2ます。 runTrampoline末尾再帰であり、注釈のコンパイル時チェックに合格します。

私の最善の策は、これら 2 つのトランポリンの違いは、次のvalようにユニットをキャプチャする方法とキャプチャしない方法にあるということです。

そうでなければ、これらの 2 つのトランポリンは私には同じように見えます。Free モナドと、Suspend、Return、および FlatMap コンストラクターのコードが、この質問にとって重要であると誰かがコメントした場合は含めますが、そうではないと思います。の末尾再帰はrunTrampoline2、s から漏れる副作用によって壊れていvalますか? ありがとう!

型注釈が末尾再帰を壊すことについて、1 か月前に同様の質問をしました: Scala: 型注釈により末尾再帰チェックが失敗する


Aiveanによって解決されました。これはトランポリンの修正版です。各再帰呼び出しは、それを含むケースの最後にあります。