8

64 ビット Windows 7
Clozure Common Lisp バージョン 1.9 WindowsX8632
Emacs 24.3.1
Slime 変更ログ日付 2014-06-17

次のように始まる .lisp ファイルの例があります。

(ql:quickload 'qt)
(in-package "QT")

プログラムの残りの部分では、ダイアログ ボックスが表示されます。これをコマンドラインから実行すると、wx86cl -load helloqt.lisp問題なく動作するようです。これを Emacs Slime ( C-x C-k) から実行すると、パッケージ "QT" がないと表示されます。ただし、最初の行を最初に個別に評価すると ( C-x C-e)、全体をコンパイルして動作し、Windows の Slime 内から QT スレッドを実行しようとする通常の問題をモジュロします。

最初の行を最初に手動で評価することなく、emacs からファイルをコンパイル/実行できるようにするにはどうすればよいですか?

(in-package ...)また、 Slime セッションで現在のパッケージを変更しないのはなぜですか? パッケージの内容を操作したい場合は、手動で変更する必要があります。

4

1 に答える 1

6

ファイル全体をコンパイルすると、最初に全体が読み取られます。その時点ではまだ評価されていないため、パッケージQTはまだ定義されていません。

を使用eval-whenして何かを早い段階で評価するか、システム定義機能 (現在は ASDF が主流) を使用してシステムを正しい順序でロードすることができます。

Eval-when:

(eval-when (:compile-toplevel :load-toplevel :execute)
  (ql:quickload '#:qt))

(in-package #:qt)

通常、ライブラリ パッケージをいじくり回すのではなく、コードを保持する独自の新しいパッケージを定義する必要があることに注意してください。

(eval-when (:compile-toplevel :load-toplevel :execute)
  (ql:quickload '#:qt))

(defpackage #:qt-example
  (:use #:qt))

(in-package #:qt-example)

;; your code here

(ご参考までにdefpackagedefundefclassなどは、そのような 内のフォームに展開される特別に設計されたマクロですeval-when。)

これは、小さな 1 回限りのスクリプトでは問題ない場合があります。注目に値するサイズのシステムの場合、特に複数のソース ファイルがある場合は、ASDF を使用します。

;;;; qt-example.asd

(in-package #:cl-user)

(asdf:defsystem #:qt-experiments
  :description "Some experiments with QT."
  :serial t
  :components ((:file "package")
               (:file "qt-example"))
  :depends-on (#:qt))

;;;; package.lisp

(defpackage #:qt-example
  (:use #:qt))

;;;; qt-example.lisp

(in-package #:qt-example)

ASDF には、ほとんどのオープンソース Common Lisp 実装が付属しています。ASDF レジストリの設定が必要になる場合があります。すべてのローカル プロジェクトに 1 つまたは 2 つのベース ディレクトリを用意したいので、以下を .xml に入れるだけ~/.config/common-lisp/source-registry.confです。

(:source-registry
  (:tree (:home "devel"))
  (:tree (:home "src"))
  :inherit-configuration)

次に、ASDF はそれらのディレクトリの下に定義されているすべてのシステムを見つけます。SLIME では、,load-systemまたは,open-systemシステム名を指定した REPL を使用して、resp をロードすることができます。その中のすべてのファイルを開き、必要に応じてロードします。

ファイルから( を使用して) 単一のトップレベル フォームをコンパイルする場合C-c C-c、SLIME はそこから逆方向in-packageに検索してフォームが想定するパッケージを見つけます。通常、in-packageファイルごとに 1 つのフォームのみをその上部に配置する必要があります。

一般的に便利なショートカットはC-c ~Lispソースファイルにあります。これは、REPLをファイルのディレクトリと有効なパッケージに切り替えます。

于 2014-11-23T23:13:40.287 に答える