パッケージとライブラリとシステムと、区別がついていないので調べつつメモ。
だいぶまとまってきた気がするのですがいかがでしょうか?指摘歓迎です!
(追記 *package*
とlist-all-packages
とrequire
、asdf:load-op
、asdf:load-system
について追記しました)
「現在のパッケージ」という考え方
cwd(Current Working Directory)のように、現在どのパッケージを利用しているか。という考え方がある。
プロンプトに現在のパッケージ名が表記される処理系があったり、そういう挙動にするパッケージがあったりする。
(追記
*package*
に現在のパッケージが入ります。
)
パッケージの変更と作成
cd(Change Directory)のような動きが (in-package :package-name)
*1。
変更後にintern
やexport
したものはそのパッケージに対して実施される。
mkdir(MaKe DIRectory)のような動きが defpackage
やmake-package
。
パッケージの利用
あるパッケージのpublicなもの(export
されたもの)をすべて利用するなら use-package
、指定した名前/シンボルのみを利用するならimport
。
どちらもパッケージ名を省略できるようになる。つまり現在のパッケージと名前が衝突する可能性がある。
処理系がdefpackage
やmake-package
を評価してパッケージを作成していれば、
パッケージ名を省略せずに利用出来る。(export
されていればpackage:symbol
、export
されていないものを無理やり参照するならpackage::symbol
)
defpackage
やmake-package
を評価するタイミングがどこなのかまだわかっていない。
(追記
(list-all-packages)
で出力されるパッケージに含まれているものが参照できるようになっている。
require
やasdf: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
でシステムを定義し、依存関係を記述できる。
(追記
@peccul 規格ではrequireの実装は任されているのでasdfの機能と繋っているのは必然ではない、互換性を気にするなら依存できない。load-systemはoperate load-opの後に作られたもので中身は一緒。古いasdfに対応したいなら…
— Masatoshi SANO (@snmsts) December 19, 2016
require
は処理系依存で、asdf:load-system
はasdf: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.lisp
にin-package
とdefpackage
を記述して、.asd
のdefsystem
で:components ((:file "package"))
を書くと、asdf:load-system
やql:quickload
のタイミングで.asd
が評価される*3?
ゆえにdefpackage
が評価されるのでそのパッケージが利用可能((use-package パッケージ名)
やパッケージ名:シンボル名
で参照できる)となる。
uiop:define-package
。。。?
調べていたら新キャラがでてきた。。。
参考文献
(追記
CLHS: Function PROVIDE, REQUIRE
)