2012-01-17 6 views
2

アプリケーションの外部の場所に数学的ルールを指定して、アプリケーションで実行時にそれらを処理してアクションを実行させたい(外部から説明する)ことができます。これを行う最善の方法は何ですか?数学的ルールを動的に記述する

(a < b) & MyFunction2() & (myWord == "test"):以下はtrueと評価されたとき

は例えば、私は機能MyFunction1()を実行したい場合があります。

ご協力いただきありがとうございます。

(それがどんな関連性がある場合、私はC++、CまたはC++/CLIを使用したい)

+0

あなたは '&'ではなく、 '&&'を意味すると思います。 – celtschk

+0

@celtschk私はC/C++構文よりも論理記号を使用しています – JonaGik

+0

もちろん、*と*の論理記号は∧です。そして、平等のための数学的符号は=ではなく、==である。 – celtschk

答えて

3

私はホイールを改革しないと考えています---埋め込みスクリプトエンジンを使用してください。これは、アクションとロジックを記述するための標準形式を使用することを意味します。おそらくあなたのニーズに適しているいくつかの素晴らしいオプションがあります。

良いオプションが含まれます:

  1. JavascriptをGoogleのV8けれども。 (私は埋め込みの観点からこれを愛していませんが、 でもjavascriptは使いやすく、多くの人が既にそれを知っています)。

  2. ルアその速くてポータブル。構文はJavascriptほど良くないかもしれませんが、埋め込みは が簡単です。

  3. Python。クリーンな構文、多数のライブラリしかし、埋め込むことはあまり面白くない。

私はバインディングの生成を助けるためにSWIGの使用を検討しています...私はそれがPythonとluaで動作することはわかりますが、v8についてはわかりません。

+1

Boost.Pythonを使用すると、Pythonは簡単に埋め込むことができます。 –

+0

@PaulManta以前はboost.pythonにいくつか問題がありました。主に、PythonインタプリタをC++アプリケーションに埋め込むことを試みたことがありました(これは他の方法ではありませんが、これはもっと一般的です)。それは何年も前だったし、物事はそれ以来改善しているかもしれない。 –

+0

何年も変わったかもしれません。私はBoostを使って、過去数ヶ月にわたって私のC++アプリケーションにPythonを組み込みました。私はライブラリに問題はありませんでした。 –

1

私は外部の数学的な述語を呼び出す処理するcommandデザインパターン、および実行するFactoryデザインパターンになります外部定義コード。

0

あなたの数式言語は、uouがシンプル:例えば、それのために

expr = bin-op-expr | rel-expr | func-expr | var-expr | "(" expr ")" 

bin-op = "&" | "|" | "!" 
bin-op-expr = expr bin-op expr 

rel-op = "<" | ">" | "==" | "!=" | "<=" | ">=" 
rel-expr = expr rel-op expr 

func-args = "(" ")" 
func-expr = func-name func-args 

var-expr = name 

を文法を定義し、パーサーの文法の中にそれを変換することができることである場合。例えば。 Boost.Spiritを使用してDSLを提供し、C++コード内で文法を表現することができます。

0

この計算が内側のループで行われる場合、高いパフォーマンスが求められ、スクリプト言語は使用できません。

1)C++で方程式を表現し、実行時にg ++でコンパイルできるようにして、結果として得られるものにリンクすることができます共有オブジェクト。しかし、この方法はあらゆる段階で非常にプラットフォームに依存しています!必要なシステムコール、使用するコンパイラ、フラグ、共有オブジェクト(またはDLL)のロード...最終的には超高速ですが、特に方程式で最も内側のループをコンパイルする場合はそうです。この方程式はインライン展開されています。

2)同じ方法でjavaを使用できます。あなたはJavaで素晴らしいJavaコンパイラを得ることができます(私はEclipseの考えではありますが、簡単に埋め込むことができます)。このソリューションを使用すると、結果は多少遅くなります(テンプレートマジックがどれくらいかに応じて)。ほとんどの場合、2倍になります。しかし、このソリューションは非常に移植性があります。一度それを働かせれば、どこにも働かなくてもいい理由はありません。プログラムの外部には何も必要ありません。もう一つの欠点は、方程式をJavaの構文で書くことです。複雑な数学ではこれは醜いものです。演算子のオーバーロードが数式方程式に大きく役立つので、最初の解はその点ではるかに優れています。

3)私はC#についてよく分かりませんが、(2)と同様の解決策があります。もしあれば、私はC#で演算子のオーバーロードがあることを知っているので、あなたの方程式は書いたり見たりするのがより楽しいでしょう。

関連する問題