toge's diary

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

ExprEvalの導入 -標準関数・定数を設定する-

前回に続いてcos, logみたいな標準的な関数とかM_PIみたいなよく使う定数が使えるようにしましょう。
といってもとっても簡単で、それぞれ一つずつ関数を呼び出すだけです。

実際に前回作成した初期化コードに、必要な関数呼び出しを追加してみます。

// 関数リストを生成する
exprFuncList* f = NULL; 
exprFuncListCreate(&f);

// [新規]関数リストに標準関数を追加する
exprFuncListInit(f);

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

// 定数リストを生成する(変数リストと定数リストのデータ構造は同一)
exprValList*  c = NULL; 
exprValListCreate(&c);

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

// 式オブジェクトを生成する(後ろの3つの引数は今は無視しましょう)
exprObj*      e = NULL; 
exprCreate(&e, f, v, c, NULL, NULL, 0);

"新規"と書いてある2行が追加したコードです。
これだけでcos, sinとかM_PIとかが使えるようになります。
この追加のための関数呼び出しですが、関数は式をパーズする前であればどこで読んでも構いません。
定数は更に遅く、式を評価する直前で構いません。
このゆるさが、ExprEvalの柔軟性に繋がるのですが、それはまた後程。

一つ気をつけることは、定数リストに"evalValListInit()"することです。
定数リストと変数リストは同じデータ型です。このため変数リストに対して"evalValListInit()"することも出来てしまい、その場合"M_PI"などが数式内で変更可能になってしまいます。

以上、殆ど変わりばえしないですが、今回のコードを置いておきます。
http://toge.skr.jp/program/expreval/sample02.c

たった2関数の呼び出しで大分使いやすくなりました。
次回は更に使いやすくすべく、C言語のコードで変数に値を設定したり、取得したり出来るようにします。