5

Peter Seibel の本Practical Common Lispを読んでいるときに、Emacs の SLIME および quicklisp と組み合わせて Common Lisp パッケージ システムを処理する方法を理解するのに苦労しました。彼が提供するプロジェクトの構造は次のとおりです。

  • spam.lispは、他の 2 つのパッケージにcom.gigamonkeys.spam依存しています。cl-ppcrecom.gigamonkeys.pathnames
  • pathnames.lispパッケージにcom.gigamonkeys.pathnames
  • spam.asdcom.gigamonkeys.spamパッケージの依存関係を説明します
  • pathnames.asdcom.gigamonkeys.pathnamesパッケージの依存関係を説明します

最終的なターゲットである spam.lisp をビルドするために私が現在見つけた唯一の方法は、次のとおりです。

  1. pathnames.asdSLIME を使用してファイルをコンパイルおよびロードします ( C-x C-k)
  2. REPL でcom.gigamonkeys.pathname入力してパッケージをロードします(asdf:operate 'asdf:load-op 'spam)
  3. REPL でcl-ppcre入力してパッケージをロードします(ql:quickload "cl-ppcre")
  4. spam.asdSLIME を使用してファイルをコンパイルおよびロードする
  5. REPL でcom.gigamonkeys.spam入力してパッケージをロードします(asdf:operate 'asdf:load-op 'spam)

これは、単一のファイル ( ) で定義された関数を使用するために必要な非常に多くの作業のように思えますspam.lisp。何か間違ったことをしているに違いありません。spam.lispより少ないコマンドで、再帰的にその依存関係をロードする方法はありますか?

4

2 に答える 2

10

ソース + 全文

簡単に言えば、パッケージはシンボルの袋であり、システムはファイルと他のシステム間の関係を記述します。

したがって、ここで構造を使用すると、単純なシステム定義になります。

(asdf:defsystem #:spam-filter
  :serial t
  :description "Simple Spam Filter"
  :author "PCL"
  :depends-on (#:cl-ppcre
               #:com.gigamonkeys.pathnames)

  :components ((:file "package")
               (:file "spam")))

ここで、システムcom.gigamonkeys.pathnamesが に ~/src/lisp/com/gigamonkeys/pathnames/あり、スパム フィルター が にあるとします~/src/lisp/spam-filter/

  1. M-xslimeRET
  2. ,cd~/src/lisp/com/gigamonkeys/pathnamesRET
  3. (push (truename ".") asdf:*central-registry*)
  4. ,cd~/src/lisp/spam-filterRET
  5. (push (truename ".") asdf:*central-registry*)
  6. (ql:quickload :spam-filter)

Quicklisp は ASDF に依存してシステムをロードするため、システム ディレクトリを ASDF 検索パスに追加する必要があります。

システムを に追加することで、システムを Quicklisp の検索パスに入れることもできます~/quicklisp/local-projects/。そこにコードを保存するか、シンボリック リンクを使用できます。

PS:の代わりに 書くことができるスライム ショートカットをここで見つけることができます 。,addRET(push (truename ".") asdf:*central-registry*)

そして、システムをクイックロードするための別のスライムショートカットのすぐ下にあります。( ,qlsome-system-nameRET)

于 2012-11-18T09:04:02.393 に答える
3

ちょっとした用語:

  • パッケージは Common Lisp の標準機能です。パッケージは、シンボルの名前空間です。これ以上何もない。それはファイルでも、モジュールでも、ライブラリでもなく、そのようなものとは関係ありません。関数、変数、またはクラスの名前空間でさえありません。シンボルのためだけに。パッケージをセットアップする定義を独自のファイルに入れる規則があります。しかし、それは単なる慣例です。

  • システムは、ソフトウェア ライブラリまたはアプリケーションを構成するすべてのファイルを定義、ロード、およびコンパイルするために使用されます。システムのアイデアは古い (30 年以上)。ASDF (Another System Definition Facility) は、そのアイデアの人気のある無料の実装です。Kent Pitman は 1984 年にThe Description of Large Systemsについて書いています。

このようなシステム機能の一部はレジストリであり、そこからすべてのシステムを見つけることができます。システム定義は、それを構成するファイルと、それが依存するすべてのシステムを記述します。通常、このようなレジストリは、ファイル システム内のディレクトリおよび/または実行中の Lisp 内のレジストリ (変数など) です。

特定のシステムをロードすると、システム ツールはレジストリを調べてそれを見つけ、定義をロードし、必要なすべてのシステムを再帰的にロードしてから、すべてのファイルをロードします。

ASDF マニュアルを参照してください: ASDF を構成してシステムを検出する

于 2012-11-18T09:04:46.510 に答える