問題タブ [expression-trees]
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.
reflection - Linq 式ツリー MethodCallExpression ノードを介して F# 関数を呼び出しますか?
特定のモジュールで F# 関数への関数呼び出しを含む式ツリーを作成しようとしています。ただし、System.Linq.Expressions.Expression.Call()ヘルパー関数が提供している関数を見つけることができないため、何かが欠けています。
Call() 呼び出しにより、InvalidOperationExceptionが返されます: 「タイプ 'TestReflection.Functions' のメソッド 'myFunction' は、指定された引数と互換性がありません。」
私が間違っていることについて誰かが私にヒントを与えることができれば、それは非常に役に立ちます。
以下のコードを参照してください。
よろしく、リッカード
c# - iQueryableおよび式ツリー
非常に基本的な例を提供して、C#で(1)iQueryable(2)式ツリーを使用する方法を誰かに説明してもらえますか?両方は相関していません。2つの別々の質問をする代わりに、1つの質問で疑問を解消したいと思います。
高度な感謝。
c# - ラムダ パラメータがスコープ外です -- バイナリ ラムダ式の作成中
手動でラムダ式を作成すると、「パラメーターが範囲外」という例外が発生します。
私が間違っていることについてのアイデアはありますか?
c# - .NET の式ツリーを理解するのは少し興味があります
式ツリーに関するいくつかの記事といくつかのstackoverflow.comの投稿を読みました。理解するのに頭がいっぱいです。
質問:
1) DOM (Document Object Model) と同様に、ロジックのメモリ内表現ですか?
2) 実行可能コードをデータに変換するメカニズムであり、それを使用してコードを表すデータ構造を生成できると誰かが説明しました。
ユーザー定義パターンを設計するために式ツリーが使用されるということですか?
3) 例のほとんどは、デリゲートまたは他のデリゲートと組み合わせて式ツリーを示しFunc<>
ています。そのため、デリゲートや他のプログラミング構造を使用しても、式ツリーが提供するのと同じことを達成することはできません。
初心者にも分かりやすい説明は大歓迎です。
c# - リファクタリング機能式に>
現在、パラメーターとして を受け取るメソッドがFunc<Product, string>
ありますが、それを にする必要がありますExpression<Func<Product, string>>
。AdventureWorks を使用して、Func を使用してやりたいことの例を次に示します。
次のようにしたいと思います。
ただし、私が直面している問題は、それmyExpression(product)
が無効であることです (コンパイルされません)。他の投稿を読んだ後、その理由がわかりました。そして、キーの 2 番目の部分に変数が必要であるという事実がなければ、product
おそらく次のように言うことができます。
しかしproduct
、キーの 2 番目の部分 (ProductNumber) が必要なので、変数が必要です。だから私は今何をすべきか本当にわかりません。問題が発生するため、Func のままにしておくことはできません。product
変数に渡す方法がわからないため、式の使用方法がわかりません。何か案は?
編集:メソッドを呼び出す方法の例を次に示します。
c# - プロパティから式を取得し、式ツリーに追加する
実際のコードはもっと複雑なので、この例を単純化しようとしました。この例はばかげているように見えるかもしれませんが、ご容赦ください。たとえば、AdventureWorks データベースを操作していて、いくつかの場所で使用したいコードを含む式を返すテーブルに呼び出さBlarg
れるプロパティを追加することにしました。Product
私がやりたいのは、式の式ツリーを作成し、Product.Blarg から Expression を取得し、結果によってグループ化することです。このようなもの:
明らかgroupExpression
に間違っています (例外についてはコードのコメントを参照してください) が、どうすればよいかわかりません。私が言っていると思ったのは、「 から Expression を取得し、product.Blarg
それを実行して、文字列の結果を返す」ということです。でも、それは私が実際に言っていることではないと思います。私はまだ式ツリーを理解しようとしています。どうすればこれをやってのけることができますか?
c# - MemberExpressionからオブジェクトを取得しますか?
したがって、C#で次の式があるとします。
fooへの参照を引き出すにはどうすればよいですか?
.net - .NET 式ツリーを新しいアセンブリにリンクする
コンパイラがどのように機能するかをよりよく理解するために、自分のおもちゃ My Toy Language -> MSIL コンパイラを作成しようとしています。構文解析と字句解析が機能し、式ツリーを構築し、System.Linq.Expressions 式ツリー API を使用して、機能するインタープリターを取得しました。ここで、実際の MSIL アセンブリを出力したいと思います。
問題は、これらのアセンブリを実際に構築する方法がわからないことです。MethodBuilderクラスは生の MSIL メソッド本体のみを受け入れるため、式ツリーの生の MSIL を取得する必要があります。Expression.Compile()を呼び出すと、作業デリゲートが返されますが、基になる MSIL を取得できません。MethodInfo.GetMethodBody()を呼び出すと、その特定の子クラスに実装されていないため、InvalidOperationException がスローされます。
そのデリゲートを新しいアセンブリにリンクするにはどうすればよいですか?
.net - DLR での不要なボクシングの回避
私はそれをよりよく理解するためにDLRで遊んでいます。私はまだそのすべての概念とその用語に完全に精通しているわけではないので、私の質問に用語または概念上の誤りがあったことをお詫びします。
基本的に、私が理解している方法は、式ツリーでオブジェクトを渡しますが、オブジェクトの動的機能を他の DLR 対応言語に公開するためにバインダーを使用するということです。したがって、式ツリー (With Expression.Add) で直接追加を行う代わりに、必要なときにいつでも呼び出しサイトによって呼び出されて追加を行うバインダーを作成します。
ただし、オブジェクトを渡すため、加算操作の最後に (たとえば、オペランドが 2 つの Int32 値である場合)、結果の Int32 をオブジェクトにボックス化する必要があります。サイトは期待しています。この一定のボックス化/ボックス化解除がランタイムのパフォーマンスに多少影響するのではないかと少し心配しています。
これは本当に(すべてのボックス化/ボックス化解除で)動作するはずの方法ですか、それとも何か不足していますか?
c# - 多項式評価のために生成されたメソッド
生成された多項式を処理するためのエレガントな方法を考え出そうとしています。この質問で(排他的に)焦点を当てる状況は次のとおりです。
- orderは、 n次の多項式を生成するためのパラメーターです。ここで、n:= order+1です。
- iは、0..nの範囲の整数パラメーターです。
- 多項式はx_jにゼロがあります。ここでj=1..nおよびj≠iです(この時点で、StackOverflowに新しい機能が必要であるか、それが存在し、私にはわかりません)
- 多項式はx_iで1と評価されます。
この特定のコード例ではx_1..x_nが生成されるため、コード内でそれらがどのように検出されるかを説明します。ポイントは等間隔に配置されます。x_j = j * elementSize / order
ここで、n = order + 1
。
Func<double, double>
この多項式を評価するためにを生成します¹。
問題: ψ'=dψ/dxも評価する必要があります。これを行うには、ψ= scale×(x_0 --x)(x_1 --x)×..×(x_n-x)/(x_i --x)をψ=α_n×x ^n+α_n×xの形式に書き換えることができます。 ^(n-1)+..+α_1×x+α_0。これにより、ψ'=n×α_n×x^(n-1)+(n-1)×α_n×x ^(n-2)+ ..+1×α_1が得られます。
Math.Pow
計算上の理由から、 ψ'= x×(x×(x×(..)-β_2)-β_1)-β_0と書くことにより、呼び出しなしで最終的な答えを書き直すことができます。
このすべての「トリッケリー」(すべて非常に基本的な代数)を行うには、次のことを行うためのクリーンな方法が必要です。
- 因数分解された
Expression
包含ConstantExpression
とParameterExpression
葉および基本的な数学演算を展開します(最終的には演算BinaryExpression
にNodeType
設定されます)-ここでの結果には、全体を通して特別な方法で処理するInvocationExpression
要素をMethodInfo
含めることができます。Math.Pow
- それから私はいくつかの指定されたに関して導関数を取ります
ParameterExpression
。の呼び出しの右側のパラメーターが定数2であった結果の項は、左側の値を掛けたものにMath.Pow
置き換えられます(の呼び出しは削除されます)。xに関して一定であるためにゼロになる結果の項は、削除されます。ConstantExpression(2)
Math.Pow(x,1)
ParameterExpression
次に、の呼び出しの左側のパラメーターとして発生する特定のインスタンスを除外しますMath.Pow
。呼び出しの右側ConstantExpression
が値でaになると、呼び出しをそれ自体1
に置き換えます。ParameterExpression
¹将来的には、そのパラメータに基づいて評価されるaを取得しParameterExpression
て返すメソッドが必要です。Expression
そうすれば、生成された関数を集約できます。私はまだそこにいません。²将来的には、記号計算としてLINQ式を操作するための汎用ライブラリをリリースしたいと考えています。