@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

Common Lispのパッケージ、ライブラリ、システム

パッケージとライブラリとシステムと、区別がついていないので調べつつメモ。

だいぶまとまってきた気がするのですがいかがでしょうか?指摘歓迎です!

(追記 *package*list-all-packagesrequireasdf:load-opasdf:load-systemについて追記しました)

「現在のパッケージ」という考え方

cwd(Current Working Directory)のように、現在どのパッケージを利用しているか。という考え方がある。

プロンプトに現在のパッケージ名が表記される処理系があったり、そういう挙動にするパッケージがあったりする。

(追記 *package*に現在のパッケージが入ります。 )

パッケージの変更と作成

cd(Change Directory)のような動きが (in-package :package-name) *1

変更後にinternexportしたものはそのパッケージに対して実施される。

mkdir(MaKe DIRectory)のような動きが defpackagemake-package

パッケージの利用

あるパッケージのpublicなもの(exportされたもの)をすべて利用するなら use-package、指定した名前/シンボルのみを利用するならimport。 どちらもパッケージ名を省略できるようになる。つまり現在のパッケージと名前が衝突する可能性がある。

処理系がdefpackagemake-packageを評価してパッケージを作成していれば、 パッケージ名を省略せずに利用出来る。(exportされていればpackage:symbolexportされていないものを無理やり参照するならpackage::symbol)

defpackagemake-packageを評価するタイミングがどこなのかまだわかっていない。

(追記

(list-all-packages)で出力されるパッケージに含まれているものが参照できるようになっている。 requireasdf:load-systemで読み込むと(list-all-packages)に含まれた。

)

システム

ASDFがシステムと呼んでいる気がする。ASDFはビルド用のツール/仕組み。インストール(ダウンロード)はQuicklispの領域。

(require :system-name)(asdf:load-system :system-name)(asdf:operate 'asdf:load-op :system-name)(違いは。。。?)でasdf:*central-registry* に登録されたディレクトリに配置されたシステムが利用可能。

ros run したREPLでは ~/.roswell/lisp/quicklisp/quicklisp/asdf:*central-registry*だった。

defsystemでシステムを定義し、依存関係を記述できる。

(追記

require処理系依存で、asdf:load-systemasdf:load-opの後継で中身は同じとのこと。

本の索引で見つからないからASDFかと思い込んでいたが、CLHSには項目があった。

CLHS: Function PROVIDE, REQUIRE

)

Quicklisp

QuicklispはASDF互換でfree licenseであればよく、ASDFシステムに:author:license:descriptionの指定があることが推奨されているとのこと。

Perhaps the only two hard requirements are ASDF compatibility and a free (ex: Public Domain, MIT, BSD or similar) license. It's also strongly recommended to supply at least :author (ex: :author "Full Name or Nickname email@address.tld"), :license and :description options in the ASDF system.

(ql:quickload :system-name)ql:*quicklisp-home*の配下にあるディレクトリに配置されたシステムが利用出来る。

もしローカルにないシステムなら、ASDFで指定されている依存システム*2含めダウンロードしてくる。

ros run したREPLでは ~/.roswell/lisp/quicklisp/ql:*quicklisp-home*だった。

(ql:register-local-projects)~/.roswell/lisp/quicklisp/local-projectsに設置したasdファイルの一覧が更新されてql:quickloadで読み込めるようになる。

ロードとは

ファイルを上からevalしていくのだと思っているのだけれど、違うのだろうか?

defpackageのタイミング

package.lispin-packagedefpackageを記述して、.asddefsystem:components ((:file "package"))を書くと、asdf:load-systemql:quickloadのタイミングで.asdが評価される*3

ゆえにdefpackageが評価されるのでそのパッケージが利用可能((use-package パッケージ名)パッケージ名:シンボル名で参照できる)となる。

uiop:define-package 。。。?

調べていたら新キャラがでてきた。。。

参考文献

www.asahi-net.or.jp

qiita.com

qiita.com

(追記

CLHS: Function PROVIDE, REQUIRE

d.hatena.ne.jp

)

*1: (in-package 'package-name)でも同じ?キーワードとしてパッケージ名を探すか、インターンされた名前で探すかの違い?

*2:defsystemの:depends-onをみている?

*3:asdf:load-systemやql:quickloadに対する:componentsの扱いがまだ不明