無事に卒研発表もおわり、とりあえず余裕ができました。
今回はIronSchemeというライブラリの紹介をします。
今回はIronSchemeというライブラリの紹介をします。
IronSchemeはIronRubyやIronPythonなどと同様にDLR上で動作する、Schemeの実装です。
CodePlexにプロジェクトがあります。
http://ironscheme.codeplex.com/
導入方法は、まず上のページの右側のDownloadからインストーラをダウンロードそしてインストール。
デスクトップにショートカットが作成されるので、それでコンソールのインタプリタが起動します。
普通にSchemeができます。まぁ僕あまりSchemeできないんですけどね。
.NET Frameworkのライブラリにアクセスしてフォームを作ったりとかもできるようですが
僕はうまくできませんでした。そっちの紹介してる人もいるみたいなので調べてみてください。
C#からIronSchemeを実行する方法を紹介します。
インストール先にはいくつかdllがありますがとりあえず参照するのはIronScheme.dllだけでいいです。
そして
Schemeの式を書いた文字列でEvalを実行することで結果がobjectとして返ってきます。
リストだとかその他文字列に表せないデータはこの方法で使うことになります。
例えば以下の例。
CodePlexにプロジェクトがあります。
http://ironscheme.codeplex.com/
導入方法は、まず上のページの右側のDownloadからインストーラをダウンロードそしてインストール。
デスクトップにショートカットが作成されるので、それでコンソールのインタプリタが起動します。
普通にSchemeができます。まぁ僕あまりSchemeできないんですけどね。
.NET Frameworkのライブラリにアクセスしてフォームを作ったりとかもできるようですが
僕はうまくできませんでした。そっちの紹介してる人もいるみたいなので調べてみてください。
C#からIronSchemeを実行する方法を紹介します。
インストール先にはいくつかdllがありますがとりあえず参照するのはIronScheme.dllだけでいいです。
そして
using IronScheme;と書けばstringの拡張メソッドとしてEvalというメソッドが使えます。
Schemeの式を書いた文字列でEvalを実行することで結果がobjectとして返ってきます。
Console.WriteLine(Console.ReadLine().Eval());こんな感じで使えます。
"(+ {0} {1})".Eval(1, 2);このようにSchemeの式の引数をC#側でEvalメソッドの引数に渡すこともできます。
リストだとかその他文字列に表せないデータはこの方法で使うことになります。
例えば以下の例。
var environment = "(new-interaction-environment)".Eval(); var builtInSymbols = "(environment-symbols {0})".Eval<Cons>(environment); Console.WriteLine(builtInSymbols.PrettyPrint);
Consはリストを表すクラスで、IronScheme.Runtime名前空間にあります。
(new-interaction-environment)ではデフォルトの環境を取得できます。
(environment-symbols env )でenvで定義されているシンボル一覧を取得します。
Evalメソッドにはジェネリックに対応したものもあり、指定した型で値を返します。
(new-interaction-environment)ではデフォルトの環境を取得できます。
(environment-symbols env )でenvで定義されているシンボル一覧を取得します。
Evalメソッドにはジェネリックに対応したものもあり、指定した型で値を返します。
ConsクラスのToStringはオーバーライドされておらず、PrettyPrintというプロパティがあるので、これでリストの内容を表示できます。
IronSchemeについて全て説明するには大変ですし、 僕も全部理解できてはいません。
というかまだ開発中で正しいはずの式がエラー出すこともあったりして案外役に立ちません。
とりあえず 今日のところはここまで。
IronSchemeについて全て説明するには大変ですし、 僕も全部理解できてはいません。
というかまだ開発中で正しいはずの式がエラー出すこともあったりして案外役に立ちません。
とりあえず 今日のところはここまで。