common-lisp
Praca z SLIME
Szukaj…
Instalacja
Najlepiej jest używać najnowszego SLIME z repozytorium Emacs MELPA: pakiety mogą być nieco niestabilne, ale masz najnowsze funkcje.
Portale i wieloplatformowe Emacs, Slime, Quicklisp, SBCL i Git
Możesz pobrać przenośną i wieloplatformową wersję Emacsa25 skonfigurowaną już ze Slime, SBCL, Quicklisp i Git: Portacle . To szybki i łatwy sposób na rozpoczęcie pracy. Jeśli chcesz dowiedzieć się, jak samodzielnie zainstalować wszystko, czytaj dalej.
Instalacja ręczna
W pliku inicjującym GNU Emacs (> = 24.5) ( ~/.emacs
lub ~/.emacs.d/init.el
) dodaj:
;; Use Emacs package system
(require 'package)
;; Add MELPA repository
(add-to-list 'package-archives
'("melpa" . "http://melpa.milkbox.net/packages/") t)
;; Reload package list
(package-initialize)
(unless package-archive-contents
(package-refresh-contents))
;; List of packages to install:
(setq package-list
'(magit ; git interface (OPTIONAL)
auto-complete ; auto complete (RECOMMENDED)
auto-complete-pcmp ; programmable completion
idle-highlight-mode ; highlight words in programming buffer (OPTIONAL)
rainbow-delimiters ; highlight parenthesis (OPTIONAL)
ac-slime ; auto-complete for SLIME
slime ; SLIME itself
eval-sexp-fu ; Highlight evaluated form (OPTIONAL)
smartparens ; Help with many parentheses (OPTIONAL)
))
;; Install if are not installed
(dolist (package package-list)
(unless (package-installed-p package)
(package-install package)))
;; Parenthesis - OPTIONAL but recommended
(show-paren-mode t)
(require 'smartparens-config)
(sp-use-paredit-bindings)
(sp-pair "(" ")" :wrap "M-(")
(define-key smartparens-mode-map (kbd "C-<right>") 'sp-forward-slurp-sexp)
(define-key smartparens-mode-map (kbd "C-<left>") 'sp-backward-slurp-sexp)
(define-key smartparens-mode-map (kbd "C-S-<right>") 'sp-forward-barf-sexp)
(define-key smartparens-mode-map (kbd "C-S-<left>") 'sp-backward-barf-sexp)
(define-key smartparens-mode-map (kbd "C-)") 'sp-forward-slurp-sexp)
(define-key smartparens-mode-map (kbd "C-(") 'sp-backward-slurp-sexp)
(define-key smartparens-mode-map (kbd "C-}") 'sp-forward-barf-sexp)
(define-key smartparens-mode-map (kbd "C-{") 'sp-backward-barf-sexp)
(sp-pair "(" ")" :wrap "M-(")
(sp-pair "[" "]" :wrap "M-[")
(sp-pair "{" "}" :wrap "M-{")
;; MAIN Slime setup
;; Choose lisp implementation:
;; The first option uses roswell with default sbcl
;; the second option - uses ccl directly
(setq slime-lisp-implementations
'((roswell ("ros" "-L" "sbcl-bin" "run"))
(ccl ("ccl64"
"-K" "utf-8"))))
;; Other settings...
Sam SLIME jest OK, ale działa lepiej z menedżerem pakietów Quicklisp . Aby zainstalować Quicklisp, postępuj zgodnie z instrukcjami na stronie internetowej (jeśli używasz roswell , postępuj zgodnie z instrukcjami roswell). Po zainstalowaniu wywołaj w lisp:
(ql:quickload :quicklisp-slime-helper)
i dodaj następujące wiersze do pliku inicjującego Emacsa:
;; Find where quicklisp is installed to
;; Add your own location if quicklisp is installed somewhere else
(defvar quicklisp-directories
'("~/.roswell/lisp/quicklisp/" ;; default roswell location for quicklisp
"~/quicklisp/") ;; default quicklisp location
"Possible locations of QUICKLISP")
;; Load slime-helper
(let ((continue-p t)
(dirs quicklisp-directories))
(while continue-p
(cond ((null dirs) (message "Cannot find slime-helper.el"))
((file-directory-p (expand-file-name (car dirs)))
(message "Loading slime-helper.el from %s" (car dirs))
(load (expand-file-name "slime-helper.el" (car dirs)))
(setq continue-p nil))
(t (setq dirs (cdr dirs))))))
;; Autocomplete in SLIME
(require 'slime-autoloads)
(slime-setup '(slime-fancy))
;; (require 'ac-slime)
(add-hook 'slime-mode-hook 'set-up-slime-ac)
(add-hook 'slime-repl-mode-hook 'set-up-slime-ac)
(eval-after-load "auto-complete"
'(add-to-list 'ac-modes 'slime-repl-mode))
(eval-after-load "auto-complete"
'(add-to-list 'ac-modes 'slime-repl-mode))
;; Hooks
(add-hook 'lisp-mode-hook (lambda ()
(rainbow-delimiters-mode t)
(smartparens-strict-mode t)
(idle-highlight-mode t)
(auto-complete-mode)))
(add-hook 'slime-mode-hook (lambda ()
(set-up-slime-ac)
(auto-complete-mode)))
(add-hook 'slime-repl-mode-hook (lambda ()
(rainbow-delimiters-mode t)
(smartparens-strict-mode t)
(set-up-slime-ac)
(auto-complete-mode)))
Po ponownym uruchomieniu GNU Emacs zainstaluje i skonfiguruje wszystkie niezbędne pakiety.
Rozpoczynanie i kończenie poleceń SLIME, specjalnych (przecinek) REPL
W Emacsie Mx slime
uruchomi się z domyślną (pierwszą) implementacją Common Lisp. Jeśli zapewnionych jest wiele implementacji (poprzez zmienne implementacje slime-lisp-implementations
), inne implementacje mogą być dostępne za pośrednictwem M M-- Mx slime
, co zapewni wybór dostępnych implementacji w mini-buforze.
Mx slime
otworzy bufor REPL, który będzie wyglądał następująco:
; SLIME 2016-04-19
CL-USER>
Bufor SLIME REPL akceptuje kilka specjalnych poleceń. Wszystkie z nich zacząć ,
. Raz ,
jest wpisane, lista opcji pojawi się w mini-buforze. Zawierają:
-
,quit
-
,restart-inferior-lisp
-
,pwd
- drukuje bieżący katalog, z którego działa Lisp -
,cd
- zmieni bieżący katalog
Korzystanie z REPL
CL-USER> (+ 2 3)
5
CL-USER> (sin 1.5)
0.997495
CL-USER> (mapcar (lambda (x) (+ x 2)) '(1 2 3))
(3 4 5)
Wynik, który jest drukowany po ocenie, to nie tylko ciąg znaków: za nim znajduje się pełny obiekt Lisp, który można sprawdzić, klikając go prawym przyciskiem myszy i wybierając polecenie Sprawdź.
Możliwe jest również wprowadzanie wielu linii: użyj Cj
aby wstawić nową linię. Klawisz Enter
spowoduje, że wprowadzony formularz zostanie oceniony, a jeśli formularz nie zostanie ukończony, prawdopodobnie spowoduje błąd:
CL-USER> (mapcar (lambda (x y)
(declare (ignore y))
(* x 2))
'(1 2 3)
'(:a :b :c))
(2 4 6)
Obsługa błędów
Jeśli ocena powoduje błąd:
CL-USER> (/ 3 0)
Spowoduje to wyświetlenie bufora debuggera z następującą zawartością (w SBCL lisp):
arithmetic error DIVISION-BY-ZERO signalled
Operation was /, operands (3 0).
[Condition of type DIVISION-BY-ZERO]
Restarts:
0: [RETRY] Retry SLIME REPL evaluation request.
1: [*ABORT] Return to SLIME's top level.
2: [ABORT] abort thread (#<THREAD "repl-thread" RUNNING {1004FA8033}>)
Backtrace:
0: (SB-KERNEL::INTEGER-/-INTEGER 3 0)
1: (/ 3 0)
2: (SB-INT:SIMPLE-EVAL-IN-LEXENV (/ 3 0) #<NULL-LEXENV>)
3: (EVAL (/ 3 0))
4: (SWANK::EVAL-REGION "(/ 3 0) ..)
5: ((LAMBDA NIL :IN SWANK-REPL::REPL-EVAL))
--- more ---
Przesunięcie kursora w dół minęło --- more ---
spowoduje dalszy rozwój śladu wstecznego.
Naciśnięcie klawisza Enter
każdym wierszu śledzenia wstecznego pokaże więcej informacji o danym połączeniu (jeśli jest dostępne).
Naciśnięcie Enter
w wierszu restartów spowoduje wywołanie konkretnego restartu. Alternatywnie restart można wybrać za pomocą numeru 0
, 1
lub 2
(naciśnij odpowiedni klawisz w dowolnym miejscu w buforze). Domyślny restart jest oznaczony gwiazdką i można go wywołać naciskając klawisz q
(dla „wyjdź”). Naciśnięcie q
zamknie debugger i wyświetli następujące informacje w REPL
; Evaluation aborted on #<DIVISION-BY-ZERO {10064CCE43}>.
CL-USER>
Wreszcie dość rzadko, ale Lisp może napotkać błąd, którego nie może obsłużyć debuger Lisp, w którym to przypadku wpadnie do debuggera niskiego poziomu lub zakończy się nienormalnie. Aby zobaczyć przyczynę tego rodzaju błędu, przejdź do bufora *inferior-lisp*
.
Konfigurowanie serwera SWANK przez tunel SSH.
- Zainstaluj implementację Common Lisp na serwerze. (Np.
sbcl
,clisp
itp.) - Zainstaluj
quicklisp
na serwerze. - Załaduj SWANK za pomocą
(ql:quickload :swank)
- Uruchom serwer za pomocą
(swank:create-server)
. Domyślny port to4005
. - [Na komputerze lokalnym] Utwórz tunel SSH za pomocą
ssh -L4005:127.0.0.1:4005 [remote machine]
- Połącz się z działającym zdalnym serwerem Swank za pomocą
Mx slime-connect
. Host powinien mieć numer127.0.0.1
a port4005
.