common-lisp
Lavorare con SLIME
Ricerca…
Installazione
È meglio usare l'ultimo SLIME dal repository MELPA di Emacs: i pacchetti potrebbero essere un po 'instabili, ma si avranno le ultime funzionalità.
Portale e multipiattaforma Emacs, Slime, Quicklisp, SBCL e Git
È possibile scaricare una versione portatile e multipiattaforma di Emacs25 già configurata con Slime, SBCL, Quicklisp e Git: Portacle . È un modo semplice e veloce per andare avanti. Se vuoi imparare come installare tutto da solo, continua a leggere.
Installazione manuale
Nel file di inizializzazione di GNU Emacs (> = 24.5) ( ~/.emacs
o ~/.emacs.d/init.el
) aggiungere quanto segue:
;; 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...
SLIME da solo è OK, ma funziona meglio con il gestore di pacchetti Quicklisp . Per installare Quicklisp, seguire le istruzioni sul sito Web (se si utilizza roswell , seguire le istruzioni Roswell). Una volta installato, nel tuo rich di Lisp:
(ql:quickload :quicklisp-slime-helper)
e aggiungi le seguenti righe al file init di Emacs:
;; 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)))
Dopo il riavvio, GNU Emacs installerà e imposterà tutti i pacchetti necessari.
Avvio e finitura di SLIME, comandi REPL speciali (virgola)
In Emacs Mx slime
inizierà la melma con l'implementazione predefinita (prima) Common Lisp. Se sono disponibili più implementazioni (tramite implementazioni slime-lisp-implementations
variabili), è possibile accedere ad altre implementazioni tramite M-- Mx slime
, che offrirà la scelta delle implementazioni disponibili nel mini-buffer.
Mx slime
aprirà il buffer REPL che avrà il seguente aspetto:
; SLIME 2016-04-19
CL-USER>
Il buffer SLIME REPL accetta alcuni comandi speciali. Tutti di loro cominciano con ,
. Una volta ,
viene digitato, l'elenco delle opzioni verrà mostrato in mini-buffer. Loro includono:
-
,quit
-
,restart-inferior-lisp
-
,pwd
- stampa la directory corrente da dove è in esecuzione Lisp -
,cd
- cambierà la directory corrente
Utilizzando 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)
Il risultato che viene stampato dopo la valutazione non è solo una stringa: dietro c'è un oggetto Lisp completo che può essere ispezionato facendo clic con il tasto destro su di esso e selezionando Controlla.
È anche possibile immettere più righe: utilizzare Cj
per inserire una nuova riga. Enter
tasto Enter
farà sì che il modulo inserito venga valutato e se il modulo non è finito, probabilmente causerà un errore:
CL-USER> (mapcar (lambda (x y)
(declare (ignore y))
(* x 2))
'(1 2 3)
'(:a :b :c))
(2 4 6)
Gestione degli errori
Se la valutazione causa un errore:
CL-USER> (/ 3 0)
Verrà visualizzato un buffer debugger con il seguente contenuto (in lisp SBCL):
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 ---
Spostando il cursore verso il basso superato --- more ---
farà sì che il backtrace si espanda ulteriormente.
Ad ogni riga del backtrace premendo Enter
verranno visualizzate ulteriori informazioni su una particolare chiamata (se disponibile).
Premendo Enter
sulla riga di riavvio verrà richiamato un particolare riavvio. In alternativa, il riavvio può essere scelto dal numero 0
, 1
o 2
(premere il tasto corrispondente in qualsiasi punto del buffer). Il riavvio predefinito è contrassegnato da una stella e può essere richiamato premendo il tasto q
(per "chiudere"). Premendo q
si chiude il debugger e si mostra quanto segue in REPL
; Evaluation aborted on #<DIVISION-BY-ZERO {10064CCE43}>.
CL-USER>
Infine, molto raramente, ma Lisp potrebbe riscontrare un errore che non può essere gestito dal debugger di Lisp, nel qual caso verrà inserito nel debugger di basso livello o terminato in modo anomalo. Per vedere la causa di questo tipo di errore, passare al buffer *inferior-lisp*
.
Impostazione di un server SWANK su un tunnel SSH.
- Installa un'implementazione Common Lisp sul server. (Per esempio
sbcl
,clisp
, ecc ...) - Installa
quicklisp
sul server. - Carica SWANK con
(ql:quickload :swank)
- Avvia il server con
(swank:create-server)
. La porta predefinita è4005
. - [Sulla macchina locale] Creare un tunnel SSH con
ssh -L4005:127.0.0.1:4005 [remote machine]
- Connettersi al server di swank remoto in esecuzione con
Mx slime-connect
. L'host deve essere127.0.0.1
e la porta4005
.