2014-11-23 26 views
6

64-bitowego systemu Windows 7
Clozure Common Lisp Wersja 1.9 WindowsX8632
Emacs 24.3.1
Slime data changelog 2014-06 -17
Common Lisp: Jak dostać (in-pakietu ...) do pracy z wnętrza Emacsa Slime

mam przykład .lisp pliku, który rozpoczyna się w następujący sposób:

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

reszta program pokazuje okno dialogowe. Po uruchomieniu tego z wiersza polecenia, wx86cl -load helloqt.lisp wydaje się działać dobrze. Po uruchomieniu tego z Emacs Slime (C-x C-k) jest napisane, że nie ma pakietu "QT". Jednak jeśli najpierw oceniam pierwszą linię osobno (C-x C-e), wtedy mogę skompilować całość i działa, modulo normalne problemy z próbą uruchomienia wątku QT z poziomu Slime w systemie Windows.

Jak mogę to zrobić, abym mógł skompilować/uruchomić plik z emacs bez konieczności ręcznej oceny pierwszej linii?

Ponadto, dlaczego (in-package ...) nie zmienia aktualnego pakietu w sesji Slime? Muszę to zmienić ręcznie, jeśli chcę wejść w interakcję z zawartością pakietu.

+0

Na podobne pytania już udzielono odpowiedzi. To nie będzie ostatni raz. Dodałem tag "eval-when". –

Odpowiedz

5

Po skompilowaniu pliku jako całości, jest on najpierw czytany jako całość. W tym czasie żaden z nich nie został jeszcze oceniony, więc pakiet QT nie jest jeszcze zdefiniowany.

Możesz użyć opcji eval-when, aby dokonać oceny czegoś wcześniej lub użyć narzędzia do definiowania systemu (obecnie jest to ASDF), aby załadować system we właściwej kolejności.

Eval-when:

pamiętać, że zwykle nie powinny syf wokół w pakietach bibliotecznych jednak zdefiniować własne, pakiet świeże trzymać swój kod:

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

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

(in-package #:qt-example) 

;; your code here 

(W przypadku, gdy zastanawiasz , defpackage, defun, defclass itd. To specjalnie zaprojektowane makra, które rozszerzają się do postaci wewnątrz takiej eval-when.)

Czasami jest to OK w przypadku małych jednorazowych skryptów. W przypadku systemów o dowolnej wielkości, szczególnie godne uwagi, jak tylko mają więcej niż jeden plik źródłowy, należy 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 pochodzi z większością open source wspólnych wdrożeń Lisp. Może być konieczne utworzenie rejestru ASDF. Chciałbym mieć jeden lub dwa bazowe katalogi dla wszystkich moich projektów lokalnych, tak, że można po prostu umieścić następujące do ~/.config/common-lisp/source-registry.conf:

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

Następnie ASDF wyszukuje wszystkie systemy zdefiniowane poniżej tych katalogach. W SLIME można po prostu użyć ,load-system lub ,open-system z REPL z nazwą systemu, aby go załadować, resp. otwórz wszystkie pliki w nim, opcjonalnie ładując je.

Podczas kompilowania pojedynczego formularza (z użyciem C-c C-c) z pliku, SLIME przegląda stamtąd formularz in-package, aby dowiedzieć się, jaki pakiet powinien przyjąć. Konwencjonalnie powinieneś mieć tylko jeden formularz in-package na jeden plik, u góry.

Popularnym skrótem jest C-c ~ w plikach źródłowych Lisp, który przełącza REPL na katalog pliku i efektywny pakiet w punkcie.