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.

  1. Installa un'implementazione Common Lisp sul server. (Per esempio sbcl , clisp , ecc ...)
  2. Installa quicklisp sul server.
  3. Carica SWANK con (ql:quickload :swank)
  4. Avvia il server con (swank:create-server) . La porta predefinita è 4005 .
  5. [Sulla macchina locale] Creare un tunnel SSH con ssh -L4005:127.0.0.1:4005 [remote machine]
  6. Connettersi al server di swank remoto in esecuzione con Mx slime-connect . L'host deve essere 127.0.0.1 e la porta 4005 .


Modified text is an extract of the original Stack Overflow Documentation
Autorizzato sotto CC BY-SA 3.0
Non affiliato con Stack Overflow