2

SLIME を使用して、Common Lisp (正確には SBCL) エディターとして Emacs を使用しています。こちらの手順に従って Quicklisp をセットアップし、それが SLIME の外部で動作するかどうかを確認しました。すべて問題ありませんでした。コードを取得してダウンロードし、それを含めることができました。

ここで、Emacs で Compile/Load File コマンドを使用して、ソース ファイルの先頭に次の行を追加しようとしました。

(ql:quickload "priority-queue")

(defpackage :tournament
  (:use :cl :priority-queue))

(in-package :tournament)

繰り返しになりますが、 SLIME ではなく、これでうまくいきました。ただし、SLIME では、次の形式のエラーが発生します。

The name "PRIORITY-QUEUE" does not designate any package.
  [Condition of type SB-KERNEL:SIMPLE-PACKAGE-ERROR]

もちろん、バックトレースも。特に何か不足していますか?私は Emacs を使用してスライムをインストールpackage-installしました。設定するために .emacs ファイルに次のコードがあります。

(setq inferior-lisp-program "/usr/local/bin/sbcl")
(require 'slime)
(slime-setup)
4

1 に答える 1

4

これは、コンパイルとロードが別々の時間に行われるために発生しています。

コンパイル時に、プレーンな関数呼び出し ( などql:quickload) は評価されません。コンパイラがdefpackageフォーム (単純な関数呼び出しではなく、コンパイル時に副作用を持つマクロ) を処理しようとすると、「priority-queue」をロードする関数が呼び出されず、パッケージが利用できません。 .

コンパイルしてロードするのではなく、ファイルをロードすると、これは表示されません。これは、load がロード時に各フォームを評価するためです。

利用可能なオプションがいくつかあります。ql:quickload最も簡単なのは、呼び出しをineval-whenにラップすることです。

(eval-when (:compile-toplevel :load-toplevel :execute)
  (ql:quickload "priority-queue"))

どんなに小さなプロジェクトでもシステムを定義したいので、次のような tourment.asd ファイルを作成します。

(asdf:defsystem #:tournament
  :depends-on (#:priority-queue)
  :serial t
  :components ((:file "tournament.lisp")))

私はそれを ~/quicklisp/local-projects/tournament/ (tournament.lisp と一緒に) に置き(ql:quickload "tournament")、repl で使用して開始し、ロードします。

私は後者のセットアップを頻繁に使用するので、quickprojectと呼ばれる Lisp プログラムを作成しました。

于 2014-05-15T14:21:17.380 に答える