星にゃーんのブログ

ほとんど無害。

Common Lispのライブラリ事情

ANSI Common Lispでは、ライブラリのフォーマットについてあまりちゃんとした仕様が存在しません。

当然、ライブラリを扱えないのは不便極まりないことですから、その点をカバーするためのシステムが存在します。

  • REQUIRE, PROVIDE 現在非推奨の、ANSI Common Lispに存在する唯一のライブラリ管理システムです。

  • ASDF デファクトスタンダードのライブラリ管理システムです。

  • QuickLisp ASDFを使用したライブラリのコレクションです。 Rubyにおけるgem、HaskellにおけるHackageのような立ち位置です。

  • Roswell Common Lispの開発環境を管理するためのツールです。 ASDFの機能を拡張し、GithubからのライブラリDLなど、モダンな機能が追加されています。

REQUIRE, PROVIDE

ANSI Common Lispに存在するライブラリ管理システムです。 ‘(require :hoge)'でファイルを読み込み、そのファイルで’(provide :hoge)‘されていれば、2回目以降の’(require :hoge)‘では何も行われません。

これは無駄なロードを防ぐための仕組みです。

しかし、REQUIREがどこのファイルを読みにいくかは処理系の実装に依存しています。 処理系ポータブルなコードを書くには非常に不便です。

そこで、Common Lispでは主に"ASDF"というシステムをつかってライブラリを管理します。

ASDF

ASDFは、Common Lispソースコードをsystemとしてまとめ、ビルドし、ロードするためのツールです。

例えば、Makefile的なものを、(systemname).asdとして書いてASDFのロードパス下においておくと、

(in-package :cl-user)
(asdf:defsystem :foobar ;; 定義するsystem名
    :description "A sample Lisp system."
    :version "0.0.1"
    :author "Joe <joe@example.com>"
    :licence "Public Domain"
    :depends-on (:alexandria :serapeum) ;; 依存するパッケージ
    :components ((:file "foobar" :depends-on ("utils")) ;; systemに含まれる.lispファイルを、(systemname).asdからみた相対パスで
                 (:file "utils")))

次のようにロードすることができます。

* (require 'asdf)
* (require 'foobar)

require, ASDF, quicklispを正しく使う | κeenのHappy Hacκing Blog独学Common Lisp に詳しい内容があるので、そちらも参照することをおすすめします。

packageとsystemの違い

Packages, systems, modules, libraries - WTF?

TODO: ちゃんと書く

Quicklisp

Quicklispは、Rubyにおけるgem、HaskellにおけるHackageのようなシステムです。 次のようにsystemをロードできます。

* (ql:quickload :alexandria)
* (ql:quickload '(cl-annot trivia))

また、(ql:system-apropos substring)で検索、(ql:update-all-dists)でアップデート、(ql:update-client)でQuicklisp本体のアップデートができます。

QuickdocsにはQuicklispでロードできるすべてのsystemのドキュメント、プロジェクトページへのリンクなどが掲載されています。

TODO: Quicklispへ自分のsystemを追加する方法

Roswell

Roswellには、コマンドラインでQuicklispからライブラリやソフトウェアをダウンロードする機能があります。

$ ros install qlot        # Quicklispからダウンロードします。
$ ros install fukamachi/qlot # Githubからダウンロードします。

TODO: ASDFのdepends-onとかにもgithubリポジトリを指定できる様になったはずだけど試してないので試して書く

参考文献