common-lisp
lisp
roswell

Roswell scriptで良い感じのREPLを書いた(書きたい)

はじめに

Common Lispは流行っていません.流石に数あるLisp方言の中では最も使われている部類と思いますが,それでも流行っているとは言いがたいと思います.なぜCommon Lispが流行らないかというと,S式がどうとかカッコがどうとか以前にインフラストラクチャが整っていない(ように見える)からだと個人的には考えています.例えばパッケージマネージャのデファクトスタンダードはQuicklispですが初心者にとって馴染みやすいものではないと思います.

しかしながら最近はRoswellの登場もあってかなり改善されていて,以前に比べればCommon Lispを始めるハードルはほとんど近代的な言語(例えばPython,Ruby)のそれに追いついてきているように思います.また,Roswellのおかげでポータブルなスクリプトも書きやすくなりました.

それではRoswellがもっと浸透すればCommon Lispは流行るのかというとまだ一つ不十分なところがあると考えています.ずばりそれはREPLです.Common Lispの開発サイクルにはREPLとの密な連携が不可欠であり,それをまさに体現しているのがSLIMEだと思います.しかしながら,各処理系に標準で付属しているREPLは初見殺しの感が強く,使いやすいものとは思いません.例えばSBCLを初めてインストールした時に矢印キーを押して^]]Aとか表示されてなんじゃこりゃとなったり,On Lispを見ながらREPLで写経していてタイポして謎の画面(デバッガ)に飛ばされて焦ってctrl-d連打したりというのは初学者の誰もが通る道だと思います.

PythonにはIPythonという高級なREPLがあり,標準のものは貧弱ですがIPythonさえあれば事足ります.Common Lispにはこれに相当するものが(SLIMEがそうなのかもしれませんが)ありません.少なくとも私は知りません.ということで誰か開発してくれれば良いわけですがその兆しもないので試しに自分で作ってみたというのが今回の本題です.

私のCommon Lisp力は非常に貧弱なので誰かが触発されてより良い物を作ってくれないかなという打算もあります.というか誰か作ってください….

CL-REPL - Common Lisp REPL for Roswell

今回作成したものです.Roswellスクリプトとして書いています.Githubにソースコードを上げています.思いついた端からザッと書いたコードに落としたのでかなり汚いコードですが,そのうち整理すると思います.

作成にあたって注意したポイント(というか私がより良いREPLに求める点)としては以下のとおりです.

  • 処理系に非依存.
  • 最低限色がついていないと見難い.
  • タブ補完とかEmacs的キーバインド(要はGNU Readline的なもので出来てる)
  • シェルコマンドを呼べると何かと嬉しい.
  • 導入が簡単

一応上記の点はすべて解決しているつもりです.
インストールはRoswellから可能で以下のコマンド一発で入ります.

CL-REPLのインストール
$ ros install koji-kojiro/cl-repl

当たり前ですがros use 処理系で実装を入れ変えればちゃんと反映されます.基本的に処理系間でのちがいが極力無いようにしていますが,エラーメッセージは処理系依存です.またタブ補完はSBCLだけサポートしています.ちなみにANSIカラーサポートでない端末では鬼のように文字化けするのでご注意ください.

2017/07/27追記
なんだか急激にPVが増えているので変更点を書いておきます.

  • Roswellのサブコマンド化しました.ros replで動きます.Roswellにはros-hogeという名前のスクリプトが~/.roswell/bin/に配置されているとros hogeで実行できる機能があるようです.
  • TAB補完はSBCL以外でも動くようになりました. 補完関数のregisterをcl-readlineのAPIを通さずにcffiから直に叩くと何故か動きました.謎.
  • SBCLだけの機能としては環境変数EDITORで指定されたエディタを開いての編集を実装しました.IPythonの%editマジックですね.

実際に使用している様子が以下になります.見ての通りIPythonとSLIMEをかなり意識しています.本当はシンタックスハイライトも入れたかったのですが力尽きました….使い方はGithubのREADMEにあります.一応英語ですがほぼ日本語のような英語なのでそちらをご拝読ください.

cl-repl.gif

拙作CL-REPLの紹介は以上です.よければ使ってみて不満点を指摘するなり,強Lisperな方は是非より良いREPLを開発してみてください.
ここまで読んでいただきありがとうございました.