Code DOM で Expression を動的生成

昨日作った C# 3.0 の Expression Tree の記号計算ライブラリを更新。

http://ufcpp.net/study/csharp/source/Differential.zip

System.CodeDom とか Microsoft.CSharp あたりの機能を使って、文字列から動的に Expression を作るプログラムを作ってみた。ZIP ファイル中の Differential/Differential/CodeDom.cs の辺り。↓みたいに使う。

var f = (Expression<Func<double, double>>)CodeDom.GetExpressionFrom(
  "x => x * x"
  );

昨日作った Expression Tree のシンボリック微分と併せて、コンソールから式を入力 → 微分結果を表示というデモプログラムを作成。ConsoleCodeDom プロジェクトがそれ。
↓みたいな感じで実行できる。

x => x * x + 2 * x + 1
function  : x => (((x * x) + (2 * x)) + 1)
derivative: x => ((2 * x) + 2)
x => x * Math.Log(x) - x
function  : x => ((x * Log(x)) - x)
derivative: x => Log(x)
x => Math.Sin(x) * Math.Sin(x) + Math.Cos(x) * Math.Cos(x)
function  : x => ((Sin(x) * Sin(x)) + (Cos(x) * Cos(x)))
derivative: x => 0
x => Math.Log(Math.Cos(x))
function  : x => Log(Cos(x))
derivative: x => (-1 * (Sin(x) / Cos(x)))