Roslynで作ってみた。C#インタプリンタ(もどき)
C# インタプリンタもどき
Roslyn を使うと「アプリケーション実行時にソースコードをコンパイルして、その場で実行」みたいな処理が簡単にできるようです。 これを利用してC#の対話式インタプリンタ(のようなもの)を作ってみました。
Microsoft.CodeAnalysis.CSharp
Roslyn プロジェクトのうちMicrosoft.CodeAnalysis.CSharp
のパッケージを使用しています。
NuGetでインストールします。
PM> Install-Package Microsoft.CodeAnalysis.CSharp -Pre
Roslyn Scripting API というのもあり、本格的に作り込む場合はこちらを使った方がよさそうですが、今回は簡易実装という事で。
アプリケーションの仕組み
今回作成したアプリケーションは、コンソールアプリケーションで実装されています。
基本的な仕組みは超単純で、
- アプリケーション実行時に以下のようなコードを生成
- 生成したコードコンパイルして
ICodeExecutor.Execute()
を実行する
だけです。
ユーザがコンソールに入力したコードはExecute()
内、もしくはクラス定義部にそのまま挿入されます。
using System; using System.Collections; using System.Collections.Generic; using System.Linq; namespace ConsoleApplication1 { //クラス定義部 //クラスの定義等はここに挿入される public class GeneratedExecutor: ICodeExecutor { //このメソッドが実行される public void Execute() { //入力したコードがここに挿入される } } }
コマンド
コードの挿入場所の指定やコードの編集、実行などを制御するための特殊コマンドを使用しています。
@run
書いたコードを実行します@using namespace
指定したnamespaceをusingします@type
次のラインから@end
コマンドまでに入力したコードはクラス定義部に挿入されます。@clear
Execute()メソッド内のコードをクリアします@clearAll
追加したすべてのコードをクリアします@list
生成されるソースコード全体を表示します@delete lineNum
ソースコードの指定した行を削除します@insert lineNum
ソースコードの指定した行に1行分のコードを挿入します@replace lineNum
ソースコードの指定した行と、次に入力するコードを置換します
デモ
実際に使ってみた感じを動画にしてみました。 Visual Stadioのインテリセンスになれてしまった私はタイピングが遅いので、2倍速とかにしてみてください。
CSharp Interactive interpreter-like console app ...