Common Lispでシェルを便利に!「Shelly」をリリースしました
先日のKyoto.lisp Tech Talkでご紹介しましたが、「Shelly」というプロダクトを作りました。
まとめると、ShellyはCommon Lispの関数をシェルコマンドのように実行できるユーティリティです。
インストールは以下のコマンドを実行してください。「LISP_IMPL=ccl」の部分は使っている処理系に合わせて変更してください。LISP_IMPL=sbclとか。
$ curl -L http://xrl.us/shly | LISP_IMPL=ccl perl - install
もしくはREPLからShellyをロードしてください。
(ql:quickload :shelly) (shelly:install)
インストールが成功すると ~/.shelly にファイルがコピーされます。~/.shelly/bin/shly が実行ファイルなので、PATHを通しておいてください。
PATH=$HOME/.shelly/bin:$PATH
すると "shly" でコマンドを実行できるようになります。
使い方は shly --help を実行すると表示されます。
Usage: $ shly [options] [atom...] Options: -h, --help Show this help. -I, --impl [implementation] Tell what Lisp implementation to use. The default is $LISP_IMPL. -L, --load [library1,library2,...] Load libraries before executing the expression. --verbose Print some informations. --no-init Do not load the user init file. --debug This flag is for Shelly developers. Built-In Commands: install Install Shelly into your environment under "~/.shelly". run-repl Start Read-Eval-Print Loop for interactive execution. help Show a list of Built-In Commands. rm-core Remove saved core image file which created by `dump-core'. dump-core Dump Lisp core image file for faster startup.
想像する将来の姿としては、ライブラリが、シェルから実行することも想定してAPIを提供すること。試しにClackとかで2つ実装してみました。
このファイルを「app.lisp」とか名前をつけて保存しておいて、
;; app.lisp (in-package :cl-user) (defvar *app* (make-instance 'ningle:<app>)) (setf (ningle:route *app* "/") "Hello, ningle!") *app*
shlyで呼び出すとClackのHunchentootサーバが立ち上がります。
$ shly -Lclack,ningle clackup ./app.lisp --port 3000 ... Hunchentoot server is started. Listening on localhost:3000. #<CLACK.HANDLER:<HANDLER> #x3020019E0B9D>
他の例としては、Clackに同梱されてるClack.App.Directoryとか。start-serverを実行するとカレントディレクトリのファイル一覧がブラウザに表示されます。
$ shly -Lclack clack.app.directory:start-server
HTMLとJavaScriptだけのページをローカルで開きたいときとか便利なのかも。あとSSHでサーバに入ったときとか便利かも。
あとはいろんな処理系でテストを連続実行したいときとかは便利っぽいかも。
$ LISP_IMPL=ccl shly asdf:test-system :clack $ LISP_IMPL=sbcl shly asdf:test-system :clack $ LISP_IMPL=clisp shly asdf:test-system :clack
今のところ、個人的には便利に使ってるんだけど他の人の実用に耐えうるか分からないみたいな温度感です。興味がある方はぜひ使ってみてください。