common-lisp
Werken met SLIME
Zoeken…
Installatie
Het is het beste om de laatste SLIME van Emacs MELPA-repository te gebruiken: de pakketten zijn misschien een beetje onstabiel, maar je krijgt de nieuwste functies.
Portale en multiplatform Emacs, Slime, Quicklisp, SBCL en Git
Je kunt een draagbare en multiplatform-versie van Emacs25 downloaden die al is geconfigureerd met Slime, SBCL, Quicklisp en Git: Portacle . Het is een snelle en gemakkelijke manier om aan de slag te gaan. Als je wilt leren hoe je alles zelf installeert, lees dan verder.
Handmatige installatie
Voeg in GNU Emacs (> = 24.5) initialisatiebestand ( ~/.emacs
of ~/.emacs.d/init.el
) het volgende toe:
;; 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 alleen is OK, maar het werkt beter met Quicklisp- pakketbeheer. Volg de instructies op de website om Quicklisp te installeren (als u roswell gebruikt , volgt u de instructies van roswell). Eens geïnstalleerd, roep in uw lisp:
(ql:quickload :quicklisp-slime-helper)
en voeg de volgende regels toe aan Emacs init-bestand:
;; 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)))
Na het opnieuw opstarten zal GNU Emacs alle benodigde pakketten installeren en instellen.
SLIME starten en eindigen, speciale (komma) REPL-opdrachten
In Emacs Mx slime
start slime slime met de standaard (eerste) Common Lisp-implementatie. Als er meerdere implementaties beschikbaar zijn (via variabele slime-lisp-implementations
), zijn andere implementaties toegankelijk via M-- Mx slime
, die de keuze biedt uit beschikbare implementaties in M-- Mx slime
.
Mx slime
opent de REPL-buffer die er als volgt uitziet:
; SLIME 2016-04-19
CL-USER>
SLIME REPL-buffer accepteert een paar speciale opdrachten. Ieder van hen beginnen ,
. Eens ,
is getypt, de lijst met opties zal worden getoond in mini-buffer. Ze bevatten:
-
,quit
-
,restart-inferior-lisp
-
,pwd
- drukt de huidige map af van waar Lisp wordt uitgevoerd -
,cd
- wijzigt de huidige map
REPL gebruiken
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)
Het resultaat dat na evaluatie wordt afgedrukt, is niet alleen een string: er zit een volledig Lisp-object achter dat kan worden geïnspecteerd door er met de rechtermuisknop op te klikken en Inspect te kiezen.
Invoer met meerdere regels is ook mogelijk: gebruik Cj
om een nieuwe regel te plaatsen. Enter
toets zorgt ervoor dat het ingevoerde formulier wordt geëvalueerd en als het formulier niet is voltooid, zal dit waarschijnlijk een fout veroorzaken:
CL-USER> (mapcar (lambda (x y)
(declare (ignore y))
(* x 2))
'(1 2 3)
'(:a :b :c))
(2 4 6)
Foutafhandeling
Als evaluatie een fout veroorzaakt:
CL-USER> (/ 3 0)
Dit zal een debuggerbuffer met de volgende inhoud (in SBCL lisp) openen:
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 ---
Als u de cursor omlaag verplaatst --- more ---
wordt de backtrace verder uitgebreid.
Als u op elke regel van de backtrace op Enter
drukt, wordt meer informatie over een bepaald gesprek weergegeven (indien beschikbaar).
Door op Enter
drukken op de regel van opnieuw opstarten zal een bepaalde herstart worden aangeroepen. Als alternatief kan de herstart worden gekozen met nummer 0
, 1
of 2
(druk op een overeenkomstige toets ergens in de buffer). De standaard herstart wordt gemarkeerd door een ster en kan worden opgeroepen door op toets q
drukken (voor "afsluiten"). Als u op q
wordt de foutopsporing gesloten en wordt het volgende weergegeven in REPL
; Evaluation aborted on #<DIVISION-BY-ZERO {10064CCE43}>.
CL-USER>
Ten slotte, vrij zelden, maar Lisp kan een fout tegenkomen die niet kan worden afgehandeld door Lisp debugger, in welk geval het in een low-level debugger terechtkomt of abnormaal eindigt. Schakel over op *inferior-lisp*
buffer om de oorzaak van dit soort fouten te *inferior-lisp*
.
Een SWANK-server opzetten via een SSH-tunnel.
- Installeer een Common Lisp-implementatie op de server. (Bijv.
sbcl
,clisp
, enz ...) - Installeer
quicklisp
op de server. - Laad SWANK met
(ql:quickload :swank)
- Start de server met
(swank:create-server)
. De standaardpoort is4005
. - [Op uw lokale machine] Maak een SSH-tunnel met
ssh -L4005:127.0.0.1:4005 [remote machine]
- Maak verbinding met de actieve externe swank-server met
Mx slime-connect
. De host moet127.0.0.1
en de poort4005
.