• CLとNixのプロジェクトテンプレートをリリースした話


    脱腸の痛みに耐えながら深夜テンションで書いてるので誤字・脱字やしっちゃかめっちゃかな記述があるかもしれません。

    多分後できちんと清書すると思います。もし清書したらその記事はZennとかに投稿すると思います。


    ここ最近取り組んでいたモダンCommon Lispについてある程度成果が得られたので、ここで一旦得られた成果を発表しようかと思います。

    使い方等はREADMEを参考にしてください。

    また、今気付いた点としてnix developで入ったshellで(asdf:load-system :mypkg)を実行する際はcloneしたディレクトリを~/common-lisp等に配置する必要があります。

    これはASDFの制約で、load-systemするsystemは必ずASDFのPATHに入っている必要があるからです。

    「配置」と書きましたが別に実物を~/common-lispに置く必要はなく、シンボリックリンクを貼るだけでも大丈夫です。 実際自分もシンボリックリンクを貼るに留めています。

    これについては後でREADMEにも書いておきます。

    イマドキのCommon Lispについて

    Common Lispは誕生からかれこれ50年くらい経っているため「古い言語」というイメージを持たれていると思いますが、Lispに備わっている拡張性から現代の開発でも使える言語だったりします。1

    ですが現代の開発にCommon Lispを使う知見はあまりなく、これまでは手当たり次第調べた情報を繋げていきながら開発を進めてきました。

    特にASDF32でリリースされたpackage-inferred-system3は理解にかなり苦しんだので、この現状をなんとかしたいと思っていました。

    cl-projectの存在

    Common Lispで新しいプロジェクトを作成する際はcl-projectを使うのが一般的だと思うのですが、このツールは自分が調べた限りだとpackage-inferred-systemに対応していません

    また、最近個人的に流行しているNixにも対応してません。

    Common Lispの開発ではroswellquicklispを使うことが多いですが、管理するツールや覚えることがいかんせん多いです。4

    また、これらのツールは(Nix以外のツールは大抵そうですが)ビルドにおいて冪等性が保証されていません。 Nixを使うことで安定した開発環境を整えられ、Nix1つで開発からデプロイまで一環してNixによる冪等性が担保された環境を維持できます。

    実際今回公開したテンプレートでは

    • ビルド
    • テストの実行
    • slynkサーバの起動コマンド

    など全てnixから始まるコマンドで実行可能です。

    これからの展望

    現状、このテンプレートの名前を変更するには自分でファイル名とファイルの中身を置換する必要があります。 作った自分が言うのもアレですがあまりにも面倒です

    そこで、cl-embを使うとプロジェクトテンプレートを作成できるそう(cl-projectも使用している)なので、これを使ってテンプレートを作成するツールを作ってみたいです。

    また、これはモダンCommon Lispを広める狼煙です。 と言うのも、Twitterでも発言している通り僕はモダンCommon Lispが現代的なWeb開発5に使えるということを証明したいと考えているので、これではまだまだ足りないからです。

    最終的には実稼働しているWebアプリケーションをみなさんにお見せできるところまで漕ぎつけたいと考えています。 それを持ってして「Common Lispは現代的なWeb開発に使える」と宣言することで、自分の目標は達成します。

    その目標を達成できるよう日々Lispしてきたいですね。

    最後に

    Common LispとNixの組合せを使っている人はかなり少ないです。

    またNix固有のトラブルに苦しめられる事もありましたが、そんな時でも耐えられたのはこの記事の存在があるからだと思っています。

    あとはPaul Graham氏のエッセイ諸々なども支えになったと感じています。

    個人的には「ハッカーと画家」が非常にオススメなので、気になった方はぜひ読んでみてください。 なんと邦訳が無料で読めます

    Common LispでWeb開発をする事例はまだまだ少ないので、もしこの記事を読んで気になった方は今回公開したテンプレートを使って実際にアプリケーションを書いてみてください。

    🙆 みんなで広げていこうCommon Lispの輪


    トラブルがあったら

    もし何がトラブルがあったら自分のTwitterアカウントメンションするか vim-jp(vim-jpのサイトに飛びます)のSlackにあるtimes-comamocaチャンネルなどで質問すれば出来る限り答えさせて頂きます。(最近はvim-jpにいるので恐らく後者の方が返答が速いです。)

    TwitterのDMは基本見ないので返信は返ってこないものだと思ってください。

    また、上記のどちらもハードルが高いと感じている方は質問をツイートしてくださればエゴサで勝手に探し出します。

    脚注

    1. 少なくとも自分はそう信じています ↩︎

    2. C言語で言うmakeみたいなものだと思ってください。 ↩︎

    3. ファイルの依存関係をファイル名から推測し、自動で読み込み順を解決する仕組み。 ↩︎

    4. Common Lispでの開発はとにかく覚えることが多い(特にツールの使い方)です。 ↩︎

    5. ここではRESTfulバックエンド/リッチなフロントエンド/DB等で構成される「よくある」Webアプリケーションを指します。 ↩︎