私はDebiansqueezeでSBCL1.0.56を使用しており、cl-swank / slime 1:20120420-2(Debianバージョン番号)を使用しています。これらはすべて、unstableの現在のバージョンです。
サードパーティのCLパッケージのロードで問題が発生しています。DebianでCLを使用するためのドキュメント(そして実際にLinuxでのより一般的なCLの使用法のドキュメント)は大雑把で矛盾していて時代遅れなので、私が知っていることを要約します。これが私がいるところです。
Debianはバイナリパッケージ(例、cl-split-sequence)をにインストールします
/usr/share/common-lisp/source
。分割シーケンスの場合、これは
/usr/share/common-lisp/source/cl-split-sequence
です。
.asdファイル(ここ
/usr/share/common-lisp/source/cl-split-sequence/split-sequence.asd
)は、私が理解しているように、バージョンと依存関係についてCL実装に指示を与えます。
;;; -*- Lisp -*- mode
(defpackage #:split-sequence-system (:use #:cl #:asdf))
(in-package :split-sequence-system)
(defsystem :split-sequence
:version "20011114.1"
:components ((:file "split-sequence")))
これで、スライムを実行するときに、REPLで次の2行を入力しても問題なく機能します
(require :split-sequence)
(split-sequence:SPLIT-SEQUENCE #\, "foo,bar")
(require :split-sequence)
呼び出しは(私が思うに)SBCL内のASDFの組み込みコピーを呼び出します。これはおそらく。を調べますsplit-sequence.asd
。これはおそらくSBCL固有です。Debianマニュアルの第3章-ライブラリのCommonLispを参照してください。このページは、私が出会ったものと同じくらい便利で詳細であり、CLC(Common Lisp Controller)を頻繁に参照していますが、Debianはこれから離れつつあるようです。私が完全には理解していないCommonLispControllerの再設計を参照してください
。とにかく、CLCを使用するための文書化されたコマンドはどれも私には機能しません。ただし、CLCはDebianでも引き続き利用できます。また、ユーザーのメーリングリストは機能していません。Clc-usersアーカイブを参照してください。
初めて(require :split-sequence)
呼び出され、コンパイルされ、(私のシステムでは、おそらくDebian固有の)結果fasl
がに配置されます
~/.cache/common-lisp/sbcl-1.0.56.0.debian-linux-x86/usr/share/common-lisp/source/cl-split-sequence/split-sequence.fasl
つまり、ファイルは元のソースの場所を反映したファイルシステムのキャッシュの下に配置されます。明らかな問題は、システムがパッケージを探す場所をどのように知るかということです。これは私がよくわからないことの1つです。ASDF Debianパッケージの一部であるで検索パスを指定する必要があるよう
/etc/common-lisp/source-registry.conf.d
ですが、最も近いのは
01-common-lisp-controller.conf
、です。
(:directory #p"/usr/share/common-lisp/systems/")
多分これはどこかに配線されていますが、私は知りたいです。
とにかく、このASDFファイルがキャッシュに入ると、再度コンパイルされることはありませんが、スライムの起動後、もう一度コンパイルしない限り、REPLはそれを認識しません
require
。
さて、線を引くと
(require :split-sequence)
(split-sequence:SPLIT-SEQUENCE #\, "foo,bar")
たとえば、ファイルで、seq.lisp
Cc Ckを使用してREPLにロードすると、エラーとトレースバックが発生します。
The name "SPLIT-SEQUENCE" does not designate any package.
[Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR]
したがって、パッケージが正しくロードされていないと結論付けます。私は次のようなバリエーションを試しました
(asdf:oos 'asdf:load-op :split-sequence)
と
(asdf:load-system :split-sequence)
しかし、サイコロはありません。奇妙なことに、私たちがちょうどラインを持っていると仮定します
(require :split-sequence)
ファイル内-require.lisp
わかりやすくするためにこれを呼び出します。次に、ロード
require.lisp
してもエラーは発生せず、次のように入力します
(split-sequence:SPLIT-SEQUENCE #\, "foo,bar")
REPLで動作します!ただし、をロードrequire.lisp
しないと、前の行を入力してもREPLでは機能しません。
では、結論として、スクリプトでパッケージを正常にロードするにはどうすればよいでしょうか。ASDFが/usr/share/common-lisp/source/
場所を見つける方法について、上記の問題にも興味がありますが、それは副次的な問題です。