3

SBCL が実行されるたびに Quicklisp が実行されるように設定し、priority-queueライブラリを使用しようとしているファイルの先頭に次の行を追加しました (以前の質問への回答で示唆されているように、Common Lisp の優先度キュー?)。しかし、使用しようとすると、SBCL からの関数priority-queueが定義されていないというエラーが表示されます。私は何が欠けていますか?

参考までに、以下のように書いてみました。

(ql:quickload "priority-queue")

(defparameter *heap* (make-pqueue #'<))

make-pqueueそして、それが定義されていないというエラーが表示されます。

4

1 に答える 1

5

一般的な Lisp では、名前が付けられたもの (変数、関数、マクロ) はすべてシンボルに関連付けられます。この場合、シンボル にアタッチされた関数がありますmake-pqueue。シンボルは、パッケージを使用して互いに分離されています。これにより、衝突が最小限に抑えられ、パッケージによってエクスポートされない内部変数/関数なども許可されます。

次の 3 つのいずれかを行う必要があるようです。

  1. 関数の前にパッケージ名を使用してください: (priority-queue:make-pqueue #'<). この方法は、ソースを読んでいる人に実行中のコードを正確に知らせたい場合に適しています。ただし、パッケージを何度も呼び出すと煩雑になる可能性があります。
  2. 現在のパッケージでパッケージを使用しpriority-queueます。

    (use-package :priority-queue)
    (make-pqueue #'<)
    

    これが行うことは、エクスポートされたすべてのシンボルをpriority-queueパッケージから現在のパッケージにインポートすることです (ほとんどの場合cl-user)。これはテストには適していますが、通常は独自のパッケージを作成します。次の項目を参照してください。

  3. priority-queue を使用する独自のパッケージを定義します。

    (defpackage :queue-test (:use :cl :priority-queue))
    (in-package :queue-test)
    (make-pqueue #'<)
    

独自のパッケージを定義することは、最初は大変な作業のように思えますが、特にコードのさまざまな部分を統合し始めると、得られる分離が好きになるでしょう。

于 2014-05-12T23:23:36.903 に答える