common lisp で何か書いてみる(その1)

いつもの如く、唐突に common lisp の勉強をしようと思い立ち、色々見ながら環境設定をしたのでメモ。

思い付きで行動したので、あちこちで袋小路に突き当たりまくっているのは相変らずである。

■alpine linux で環境設定してみた

始まる前から後のことを考え、docker コンテナで動かすと面白そうということで virtualbox で新しく VM を作って alpine linux をインストールした。
debian とか ubuntu と違って、ISO 起動でインストーラが走ってくれるわけではなくて、Wiki を見ながら何とか導入。
パッケージは sbcl と clisp があったから「apk add」で簡単に入った。
ちなみに何度も「apt install」と入力してしまったのはご愛嬌。

問題はここからで、common lisp のパッケージ管理ライブラリ quicklisp を入れてみたが動かない。
ライブラリ自体の読み込みはできるけれど、そこから他のライブラリの自動ロードをするとデバッグモードになってしまう。
しばらく格闘してみたが、このまま環境設定で時間を食ってもアレなので、alpine は放置することにした。

■debian GNU/Linux で環境設定してみた

というわけで、愛用の debian GNU/Linux の VM を立ち上げて、こっちで環境設定してみた。
慣れ親しんだ「apt-get install」で、あっと言う間に sbcl のインストールが完了。
cl-quicklisp というパッケージもあったので、それも入れた。

で、プロジェクトごとにパッケージ管理をしてくれる(ruby の bundler みたいな) qlot というのを入れてみた。
これもすんなりと入ったので「よーし、これでコードが書けるぜー」とか思いながら、web フレームワークの caveman2 を入れ「ようとし」てみた。
…入ったよ、うん、結果的には。それだけで 1時間かかったのを気にしなければ。

その経緯

  1. qlot が初期化できない
    qlot が入った。ql:quickload でロードした。qlfile 書いた。
    さあ (qlot:install :myproj) …あれ?
    エラーした。
    qlfile を空にしてみてもエラーした。
    ライブラリ取得先を ql から git に変えてみてもエラーした。
    …よし、一旦放置。

  2. ql:quickload で caveman2 をロードできない
    さすがに直接 ql:quickload すれば動くだろう… あれ?
    エラーした。パッケージ名の書き方間違ったっけ?
    文字列で “caveman2” … エラー。
    キーワード形式で :caveman2 … エラー。
    クォートして ‘caveman2 … エラー。

    …落ち着け、キーボードは投げるもんじゃない。
    近場には HHK2Lite(英語) は売ってないんだ。
    それに買ったばかりのディスプレイに当たったらどうする。
    とりあえずお茶でも飲んで落ち着くんだ。

    (30分経過)…ふぅ、今日の茶菓子は美味かった。
    お、よく見たらエラーファイル名あるじゃん。cffi?
    とりあえず「apt-cache search」して… cl-cffi …って、そのまんまかい!
    駄目元でインストールっと。これで直ったら微妙だなぁ…
    (ql:quickload :caveman2) Enter!
    え、通るの?原因これだけ?私の30分を返せ!(←責任転嫁:嫁居ないけど)

  3. 改めて qlot
    んー、これなら qlot も動きそうな気がする。
    (qlot:install :myproj) っと。ん、エラー?
    …落ち着け、深呼吸だ。吸ってー、吐いてー、吐いてー、吐…けるかボケェ!吸わんと死ぬわ!
    ……やめよう、一人ボケツッコミは寂しすぎる…

    そうだ、さっきと同じくダイイングメッセージにヒントがあるに違いない。エラーでプロセス死んでるしな。
    死体は語る、犯人は現場に戻る(違)
    えーと…

    error while parsing arguments to DESTRUCTURING-BIND:
    invalid number of elements in
    ("caveman2:latest")」

    …待て、google 翻訳に頼るんじゃない。たぶん翻訳しても、そんなに変わらんし。
    一つずつ順番に行こう。

    • エラー
    • ↓している間
    • 解釈
    • 引数
    • ↓のため
    • DESTRUCTURING-BIND
    • (区切り)
    • 不正な
    • ↓の
    • 要素
    • ↓の中の
    • “caveman2:latest”

    まとめると
    「DESTRUCTURING-BIND のため(に)引数(を)解釈している間(に)エラー」
    「”caveman2:latest” の中の要素の数(が)不正」
    …ん?「caveman2:latest」って qlfile の書き間違い?
    あー、うん。たしかに違うわ。スペース必要なのね。

    よーし、これで動くはず。今日のおやつを賭けてもいい。
    (qlot:install :myproj) …エラー?え、おやつ抜き?えぇっ?
    くそぅ、この恨み晴らさでおくべきか。(←自業自得)
    二度ある事は三度あるのであるからしてヒントはエラーメッセージにあるのである。
    というわけでチェック!
    Component "myproj" not found
    うん、myproj は見付からないよね、今から作ろうと思ってるんだから。
    ……… もしかして :myproj の部分いらない?
    (qlot:install) っと… あー、うん。動いたね。動いちゃったね。
    私のおやつ返せ!(←再度の責任転嫁:もちろん嫁は居ない)

補足:没収されたおやつはスタッフ(= 私)がおいしくいただきました。