八発白中

技術ブログ、改め雑記

Common Lispでシェルを便利に!「Shelly」をリリースしました

先日のKyoto.lisp Tech Talkでご紹介しましたが、「Shelly」というプロダクトを作りました。

Shelly
View more presentations from fukamachi


まとめると、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

今のところ、個人的には便利に使ってるんだけど他の人の実用に耐えうるか分からないみたいな温度感です。興味がある方はぜひ使ってみてください。