読者です 読者をやめる 読者になる 読者になる

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 ...

ソースコード

ソースコードは以下で全部です。
このコードの肝は、一番下のCreateExecutor()メソッドになります。

C# Interactive interpreter-like console app