3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

ぼくがかんがえたさいきょうのREPLを作る(JScript)

Last updated at Posted at 2022-05-28

概要

まあまあやり尽くされたネタではありますが、JScriptのREPLを作ります。ES3のREPLなんか誰も嬉しくないってつっこみはナシです。

REPLとはRead-Eval-Print Loopとのことで、たいていのスクリプト言語に付属しているやつです。たとえばNode.jsでは、引数なしでnodeを実行することでREPLに入ることができます。

image.png

やりたかったこと

せっかく後発なので、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

ヘルプに書くなら実装しなさい。

image.png

正確な字句解析

括弧の対応を調べているだけなので、文字列リテラル内やコメントで括弧を使うと閉じた判定になってしまいます。

image.png

気が向いたら直しておこうと思います。字句解析の勉強をちゃんとしなきゃ ...

タブ補完

Enterを入力するまで進まないので、仕様的に厳しそうです。

サジェスト

同上。Node.js風でないものなら、考えよう次第では実現できたかもしれません。

まとめ

image.png

どうでしょうか、ぱっと見わからないくらいのいい感じのREPLができて、個人的には満足です。

ES3のREPLが必要になる(屈辱的な)シチュエーションがありましたら、ぜひご利用ください。

3
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
2

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?