NixでCommon Lispの開発環境を整える
Nixで整えるメリット
Common Lispの環境管理ツールは複数ある
asdf(ビルト担当)
quicklisp(パッケージマネージャ)
qlot(プロジェクトローカルなパッケージ管理)
roswell(処理系&ライブラリ管理)
それぞれの特性を理解して使う必要があるのでめちゃくちゃややこしい。
けれどNixを使うとASDFとNixのみで環境構築ができる。
また、先述したツールはCommon Lispのライブラリしか管理しないけど、
NixならCのライブラリを含めた環境を用意に構築できる。
Common Lispはライブラリが少ないゆえにCの資産を使いたくなる機会が多いけれど、
Nixなら用意にCのライブラリを含めた環境を作れる。
また、quicklispは一ヶ月に一回しかリポジトリが更新されない(ultralispというレジストリは毎日更新される)ので、
最新のバージョンを使いたいならgit cloneするしかないがNixならfetchFromGitHubなり使ってfetchすれば良いので
最新のライブラリを使用するコストが下がる。
これは逆に自身のライブラリをNix(Flake)で提供すれば、他者が自身のライブラリの最新版を用意に使える環境を提供できるという事でもある。
NixでCommon Lispの環境構築をする
現状nix-common-lispを使うのがベスト。
このテンプレートはとても良く出来ていて、
flake-partsベース(services-flakeなどの便利なモジュールが容易に使える)
複数処理系のサポート
テストの実行
と言った特徴がある。
使い方
git clone https://github.com/tani/nix-common-lispでリポジトリをcloneする。
rename.shを編集する。
NEWNAME="fibonacci"のfibonacciを任意の名前に書き換える。
./rename.shを実行する。
これでプロジェクト名が書き換えられる。
ここ自動化できたら良いよねComamoca.icon
提供しているコマンドの実行方法
nix developで開発シェルを起動する。
nix run .#test-sbclでsbclでのテストを実行できる。
sbclの箇所を各Lisp処理系に置き換えればそのLisp処理系でのテストを実行できる。
例えば、cclでテストを実行したかったらnix run .#test-cclとなる。
プロジェクトに依存を追加する
flake.nixの
code:nix
## Dependencies
lispLibs = lisp: with lisp.pkgs; fiveam ;
となっている箇所にライブラリを記述していく。
具体的にはsbclPackages
が指定できる。
それ以外の依存は
code:nix
## Non-Lisp dependencies
nativeLibs = with pkgs; ;
で指定できる。
サポートする処理系を変更する
flake.nixの以下の箇所を編集する。
code:nix
## Supported Lisp implementations
lispImpls = [
"sbcl"
"clasp-common-lisp"
"abcl"
"ecl"
"ccl"
"mkcl"
"clisp"
"cmucl_binary"
];
使わない処理系があるなら単にコメントアウトすれば良い。
テストフレームワーク
デフォルトではfiveamが使用されているけど、roveやparachuteなどのフレームワークももちろん使用できる。
基本的にはasdファイルでテストを実行する関数をtest-opに指定し、(asdf:test-system :pkgname)でテストが実行されるようにすれば問題ないはず。
asdfのテストまわりについてはこの記事が詳しい。
REPLの起動
先述したlispLibsにswankやslynk等のパッケージをインストールする。
nix developしたシェルでLispインタプリタを起動して、各パッケージのサーバーを起動するS式を実行する。
自分はslynkをメインで使っているので以下のコマンドを使用している。
swankと基本的な関数名は同じはずだから、slynkをswankに置き換えても使えるはず。
code:shell
sbcl --dynamic-space-size 1024 --eval "(require :asdf)" \
--eval "(asdf:load-system :slynk)" \
--eval "(slynk:create-server :dont-close t :style :spawn)"
#common-lisp