なんちゃってMathematicaを作る - その3 [なんちゃってMathematica]
昨日なぜそんなものを作ろうとするのかということを説明した。ようするに、まあいいじゃん好きにすれば、ということ。こういうのを「バカじゃない?」と言う人もいるとは思うけど。いいんだよ、ほっとけよ。お前らみたいに賢くないんだよ、僕は。
何を怒ってるのかよくわからなくないな。ということでもう少し中身に対して突っ込んでみる。
まあ、それでもやりかたはあるので後で考えよう。
また、lexとyaccを使うと、どうしてもyaccが出力したコードを中心に動作を書く必要がある。ようするにイベントドリブンなソフトと同じような書き方が必要になる。ユーザインターフェイスとしてのイベントドリブンな場合は、一つのイベントに対して一つの処理がだいたい対応するので、処理ごとの独立性は高く、それおほどごちゃごちゃしないけど、yaccの場合はちょうどSAXでxml文書を解析するときのような感じになる。構文解析の内部状態に従って処理をかえる、ということが必要になる。
そこで、yaccには、式(Expression)を構築するところまでだけを独立にやらせて、評価エンジンはそれを受け取って評価する、という2段階方式にしたい。式の構築だけならそれほど難しくなく比較的小さなコードですますことができると考えられる。このあたりはもういちどシンタクスを具体的に考えるところで再考する。
そしてgslの結果に従って出力を作る。数値などの文字列だけの場合はそのままフォーマッタに渡す。グラフィクスはグラフィクス用のデータ構造を作ってプロットエンジンに渡す。
何を怒ってるのかよくわからなくないな。ということでもう少し中身に対して突っ込んでみる。
4 おおまかな内部構造
構造を大まかに考えておく。4.1 入出力フォーマッタ
これはユーザからの入力を受けて、編集できるように表示し、出力をそのあとに表示する部分。Mathematicaでは「ノートブック」と呼ばれている。文字出力とグラフィックを混在させる必要があるのでちょっと面倒かもしれない。でもApp kitがあるのでなんとかなりそうな気はする。4.2 字句解析
これは、糖衣構文をどれだけサポートするかにもよるけど、lexとyaccを使うのが一番簡単。しかし、lexとyaccの組み合わせでは通らないMathematicaのシンタクスもある。例えばとじ括弧が二つならんだ]]は、これだけでは引数の入れ子の終わりの部分か、要素を取り出す2重括弧なのか、というのはわからない。lexではそれを区別できず、構文解析の状態変数を参照しないといけない。
まあ、それでもやりかたはあるので後で考えよう。
また、lexとyaccを使うと、どうしてもyaccが出力したコードを中心に動作を書く必要がある。ようするにイベントドリブンなソフトと同じような書き方が必要になる。ユーザインターフェイスとしてのイベントドリブンな場合は、一つのイベントに対して一つの処理がだいたい対応するので、処理ごとの独立性は高く、それおほどごちゃごちゃしないけど、yaccの場合はちょうどSAXでxml文書を解析するときのような感じになる。構文解析の内部状態に従って処理をかえる、ということが必要になる。
そこで、yaccには、式(Expression)を構築するところまでだけを独立にやらせて、評価エンジンはそれを受け取って評価する、という2段階方式にしたい。式の構築だけならそれほど難しくなく比較的小さなコードですますことができると考えられる。このあたりはもういちどシンタクスを具体的に考えるところで再考する。
4.3 評価エンジン
評価エンジンは実際に入力式を解釈するところ。解釈してデータ構造を作り、gslに渡して実行させる。スカラ数の四則演算などはgslまで渡さずに自分で計算してしまえばいい。データ構造は基本的にはgslが使うベクトルやマトリクスなどが主になるはずである。そしてgslの結果に従って出力を作る。数値などの文字列だけの場合はそのままフォーマッタに渡す。グラフィクスはグラフィクス用のデータ構造を作ってプロットエンジンに渡す。
4.4 プロットエンジン
プロットエンジンは、独自実装する。これはまえやってほったらかしにしてたプロットライブラリを仕上げることになる。結局これが一番手間かもしれない。2011-11-01 21:39
nice!(0)
コメント(0)
トラックバック(0)
コメント 0