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言語のコードで変数に値を設定したり、取得したり出来るようにします。