toge's diary

コンピュータ関連の趣味をつらつらと。

ExprEvalの導入 -定数・変数を設定・変更する-

ネタ切れがちな平日のために細切れにやっていきます。
今回は定数・変数に値を設定する方法です。もちろん、変数だけの式を評価してもいいんですが、違う方法がありますんで。
やり方はとても簡単。exprValListAdd()関数を呼び出すだけです。

// 変数リストを生成する
exprValList*  v = NULL;
exprValListCreate(&v);

// testVar変数を作成して、値を5.0にする。
exprValListAdd(v, "testVar", (EXPRTYPE)5.0); 

もし変数リストに"testVar"が既にある場合には値を更新します。
前回もちろっと話しましたが、定数リストと変数リストは同じデータ型です。なので定数リストに対しても同じ方法で定数に値を設定することも出来ます。
そういうことで、お分かりのように定数と言えどもExprEvalの式内で変更不可なだけで、ライブラリを経由ならばいくらでも変更可能です。

// 定数リストを生成する
exprValList*  c = NULL;
exprValListCreate(&c);

// 定数リストに標準定数を追加する
exprValListInit(c);

// testConst変数を作成して、値を3.1にする。
exprValListAdd(v, "testConst", (EXPRTYPE)3.1); 

以上のように設定した後で式内で定数・変数を参照すれば、ちゃんと値を参照出来ます。

// 式のパーズ
exprParse(e, "testVar = testVar * testConst;");

// パーズした式の評価
EXPRTYPE val;
exprEval(e, &val);

printf("result = %f\n", val); 

ちゃんと値は15.5になります。
いつもどおり、今回のコードを置いておきます。
http://toge.skr.jp/program/expreval/sample03.c

ちなみに式評価とのベンチマークをとってみました。コンパイルしたコードは以下の通り。
http://toge.skr.jp/program/expreval/sample04.c

> gcc-4.0.2 -I.. -lm -O3 -march=athlon-xp sample04.c ../*.c
> ./a.out
exprValListAdd span 6.350000
exprEval       span 5.120000 

うそっ、exprEval()の方が24%速いんだけど・・・、exprValListAdd()の意味ないじゃん。
以外な結果が出たところで次回に続く。