Khi bạn biên dịch toàn bộ tệp, tệp này trước tiên được đọc toàn bộ. Vào thời điểm đó, chưa có đánh giá nào được đánh giá, vì vậy gói QT
chưa được xác định.
Bạn có thể sử dụng eval-when
để đánh giá điều gì đó trước đó hoặc sử dụng cơ sở định nghĩa hệ thống (ASDF chiếm ưu thế hiện nay) để tải hệ thống của bạn theo đúng thứ tự.
Eval-when
:
Lưu ý rằng bạn thường không nên muck xung quanh trong các gói thư viện nhưng định nghĩa riêng, gói tươi của bạn để giữ mã của bạn:
(eval-when (:compile-toplevel :load-toplevel :execute)
(ql:quickload '#:qt))
(defpackage #:qt-example
(:use #:qt))
(in-package #:qt-example)
;; your code here
(Trong trường hợp bạn đang tự hỏi , defpackage
, defun
, defclass
vv là các macro được thiết kế đặc biệt mở rộng đến một biểu mẫu bên trong một số eval-when
.)
Điều này đôi khi được chấp nhận đối với các tập lệnh một lần. Đối với hệ thống của bất kỳ kích thước đáng chú ý, đặc biệt là ngay sau khi họ có nhiều hơn một tập tin nguồn, sử dụng 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 đi kèm với hầu hết các mã nguồn mở hiện thực Common Lisp. Bạn có thể cần thiết lập đăng ký ASDF. Tôi muốn có một hoặc hai cơ sở danh bạ cho tất cả các dự án địa phương của tôi, vì vậy mà tôi chỉ có thể đặt đoạn mã sau vào ~/.config/common-lisp/source-registry.conf
:
(:source-registry
(:tree (:home "devel"))
(:tree (:home "src"))
:inherit-configuration)
Sau đó asdf tìm tất cả các hệ thống định nghĩa dưới đây những thư mục. Trong SLIME, bạn chỉ có thể sử dụng ,load-system
hoặc ,open-system
từ REPL với tên hệ thống để tải nó, resp. mở tất cả các tệp trong đó, tùy chọn tải nó.
Khi biên soạn một biểu mẫu đơn lẻ (sử dụng C-c C-c
) từ một tệp, SLIME nhìn ngược lại từ đó cho một biểu mẫu in-package
để tìm hiểu gói nên giả định. Thông thường, bạn chỉ nên có một biểu mẫu in-package
duy nhất cho mỗi tệp, ở đầu tệp.
Phím tắt thường hữu ích là C-c ~
trong tệp nguồn Lisp, sẽ chuyển REPL thành thư mục của tệp và gói hiệu quả tại điểm.
Câu hỏi tương tự đã được trả lời rồi. Đây sẽ không phải là lần cuối cùng. Tôi đã thêm thẻ 'eval-when'. –