common-lisp
Arbetar med SLIME
Sök…
Installation
Det är bäst att använda senaste SLIME från Emacs MELPA-arkivet: paketen kan vara lite instabila, men du får de senaste funktionerna.
Portala och multiplatformade Emacs, Slime, Quicklisp, SBCL och Git
Du kan ladda ner en bärbar och multiplatform-version av Emacs25 som redan är konfigurerad med Slime, SBCL, Quicklisp och Git: Portacle . Det är ett snabbt och enkelt sätt att komma igång. Om du vill lära dig att installera allt själv, läs vidare.
Manuell installation
~/.emacs.d/init.el
till följande i GNU Emacs (> = 24.5) initialiseringsfil ( ~/.emacs
eller ~/.emacs.d/init.el
):
;; 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 på egen hand är OK, men det fungerar bättre med Quicklisp- pakethanteraren. Följ instruktionerna på webbplatsen för att installera Quicklisp (om du använder roswell , följ roswell-instruktionerna). När du har installerat, på din lisp anrop:
(ql:quickload :quicklisp-slime-helper)
och lägg till följande rader i Emacs init-fil:
;; 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)))
Efter omstart kommer GNU Emacs att installera och installera alla nödvändiga paket.
Starta och slutföra SLIME, special (komma) REPL-kommandon
I Emacs Mx slime
kommer Mx slime
att starta slem med standard (första) Common Lisp-implementering. Om det finns flera implementationer tillhandahållna (via variabla slime-lisp-implementations
), kan andra implementationer nås via M-- Mx slime
, vilket kommer att erbjuda valet av tillgängliga implementationer i mini-buffert.
Mx slime
öppnar REPL-bufferten som ser ut enligt följande:
; SLIME 2016-04-19
CL-USER>
SLIME REPL-buffert accepterar några specialkommandon. Alla börjar med ,
En gång ,
skrivs, kommer listan med alternativ att visas i mini-buffert. De inkluderar:
-
,quit
-
,restart-inferior-lisp
-
,pwd
- skriver ut aktuell katalog där Lisp körs -
,cd
- kommer att ändra aktuell katalog
Med hjälp av 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)
Resultatet som skrivs ut efter utvärderingen är inte bara en sträng: det finns ett fullständigt Lisp-objekt bakom det som kan inspekteras genom att högerklicka på det och välja Inspektera.
Flerlinjeingång är också möjligt: använd Cj
att sätta en ny linje. Enter
nyckel kommer att göra att det angivna formuläret utvärderas och om formuläret inte är klart kommer det sannolikt att orsaka ett fel:
CL-USER> (mapcar (lambda (x y)
(declare (ignore y))
(* x 2))
'(1 2 3)
'(:a :b :c))
(2 4 6)
Felhantering
Om utvärderingen orsakar ett fel:
CL-USER> (/ 3 0)
Detta visar en felsökningsbuffert med följande innehåll (i 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 ---
Att flytta markören nedåt --- more ---
kommer att göra att backtrakten expanderar ytterligare.
När du trycker på Enter
på varje rad i backtrace visas mer information om ett visst samtal (om det finns tillgängligt).
Genom att trycka på Enter
på raden för omstart kommer en viss omstart att aktiveras. Alternativt kan omstart väljas med nummer 0
, 1
eller 2
(tryck på motsvarande knapp var som helst i bufferten). Standardstarten är markerad med en stjärna och kan åberopas genom att trycka på tangenten q
(för "avsluta"). Om du trycker på q
stängs felsökningen och visas följande i REPL
; Evaluation aborted on #<DIVISION-BY-ZERO {10064CCE43}>.
CL-USER>
Slutligen, ganska sällan, men Lisp kan stöta på ett fel som inte kan hanteras av Lisp debugger, i vilket fall det kommer att släppas in på låg nivå debugger eller slutar onormalt. För att se orsaken till den här typen av fel byter du till *inferior-lisp*
buffert.
Ställa in en SWANK-server över en SSH-tunnel.
- Installera en Common Lisp-implementering på servern. (T.ex.
sbcl
,clisp
, etc. ...) - Installera
quicklisp
på servern. - Ladda SWANK med
(ql:quickload :swank)
- Starta servern med
(swank:create-server)
. Standardporten är4005
. - [På din lokala maskin] Skapa en SSH-tunnel med
ssh -L4005:127.0.0.1:4005 [remote machine]
- Anslut till den externa swank-servern med
Mx slime-connect
. Värden ska vara127.0.0.1
och porten4005
.