概要
まあまあやり尽くされたネタではありますが、JScriptのREPLを作ります。ES3のREPLなんか誰も嬉しくないってつっこみはナシです。
REPLとはRead-Eval-Print Loopとのことで、たいていのスクリプト言語に付属しているやつです。たとえばNode.jsでは、引数なしでnode
を実行することでREPLに入ることができます。
やりたかったこと
せっかく後発なので、Node.js風に使えるかっちょいいものにしました。
TypeScriptで書く
そこそこのサイズになりそうです、さすがにES3では書きません。構成はこの記事に準じます。
色を付ける
numberは黄、stringは緑、undefinedは灰色 ... 出力に色を付けます。
エスケープシーケンスを用いるのですが、\e
\033
\x1b
のうちcscript.exeで使えるものは\033
と\x1b
であり、\033
はTypeScriptのコンパイルが通りません。\x1b
を使いましょう。
ところでせっかくモジュールが使えるのだから、chalkなどの既存のパッケージを使えばいいのにと思われることでしょう。残念ながら、JScriptのバグ謎実装などのせいでほとんどのライブラリはBabelを通しても使うことができません。
書き途中の改行を検出する
上の画像において下から3行目で書いている通り、Node.jsのREPLは途中の改行を自動で検出して繋げてくれます。
きっと抽象構文木を解析しているのだと思います。それはさすがにJScriptには荷が重過ぎるので、実行する前にきちんと括弧が閉じているかだけ検出してお茶を濁します。実装はこちらを参考にしました。
ところでASTの解析も既存のライブラリがありますが以下略。くやしい ...
Dot commandsを実装する
Node.jsのREPLには.
から始まる特殊なコマンドが用意されています。
cscript.exeではCtrl+Cを入力するとスクリプト自体が終了してしまうことから、入力を取り消す.break
.clear
は実装しておきたいですね。.help
.exit
も簡単そうなので、ついでにやりましょう。.exit
は無意味ですけど。
できなかったこと
.save
.load
ヘルプに書くなら実装しなさい。
正確な字句解析
括弧の対応を調べているだけなので、文字列リテラル内やコメントで括弧を使うと閉じた判定になってしまいます。
気が向いたら直しておこうと思います。字句解析の勉強をちゃんとしなきゃ ...
タブ補完
Enterを入力するまで進まないので、仕様的に厳しそうです。
サジェスト
同上。Node.js風でないものなら、考えよう次第では実現できたかもしれません。
まとめ
どうでしょうか、ぱっと見わからないくらいのいい感じのREPLができて、個人的には満足です。
ES3のREPLが必要になる(屈辱的な)シチュエーションがありましたら、ぜひご利用ください。