2014-11-23 15 views
6

64-bit Windows 7
Clozure Common Lisp Version 1.9 WindowsX8632
Emacs 24.3.1
Slime ngày changelog 2014-06 -17
Common Lisp: Làm thế nào để nhận được (trong gói ...) để làm việc từ bên trong Emacs Slime

tôi có một ví dụ .lisp tập tin mà bắt đầu ra như sau:

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

phần còn lại của chương trình cho thấy một hộp thoại. Khi tôi chạy lệnh này từ dòng lệnh, wx86cl -load helloqt.lisp có vẻ như hoạt động tốt. Khi tôi chạy điều này từ Emacs Slime (C-x C-k) nó nói rằng không có gói "QT". Tuy nhiên, nếu lần đầu tiên tôi đánh giá dòng đầu tiên (C-x C-e) thì tôi có thể biên dịch toàn bộ và nó hoạt động, modulo các vấn đề bình thường khi cố chạy một luồng QT từ bên trong Slime trên Windows.

Tôi làm cách nào để tôi có thể biên dịch/chạy tệp từ các emacs mà không phải đánh giá thủ công dòng đầu tiên trước tiên?

Ngoài ra, tại sao không (in-package ...) thay đổi gói hiện tại trong phiên Slime? Tôi phải thay đổi nó bằng tay nếu tôi muốn tương tác với các nội dung gói.

+0

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'. –

Trả lời

5

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ác vấn đề liên quan