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のリポジトリを指定できる様になったはずだけど試してないので試して書く