common-lisp
SLIME के साथ काम करना
खोज…
स्थापना
Emacs MELPA रिपॉजिटरी से नवीनतम SLIME का उपयोग करना सबसे अच्छा है: संकुल थोड़ा अस्थिर हो सकता है, लेकिन आपको नवीनतम सुविधाएँ मिलती हैं।
पोर्टेल और मल्टीप्लाॅट एमॅक्स, कीचड़, क्विकलाइस्प, एसबीसीएल और गिट
आप Emacs25 का एक पोर्टेबल और मल्टीप्लाकेट वर्जन डाउनलोड कर सकते हैं जो पहले से ही कीचड़, SBCL, क्विकलिस्प और गिट के साथ कॉन्फ़िगर किया गया है। यह एक त्वरित और आसान तरीका है। यदि आप सीखना चाहते हैं कि सब कुछ खुद को कैसे स्थापित किया जाए, तो पढ़ें।
मैनुअल स्थापित करें
जीएनयू Emacs में (> = 24.5) आरंभीकरण फ़ाइल ( ~/.emacs
या ~/.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 ठीक है, लेकिन यह Quicklisp पैकेज मैनेजर के साथ बेहतर काम करता है। Quicklisp को स्थापित करने के लिए, वेबसाइट पर दिए गए निर्देशों का पालन करें (यदि आप रोसेवेल का उपयोग करते हैं, तो रस्सेल निर्देशों का पालन करें)। एक बार स्थापित होने के बाद, आपके लिस्प इनवोक में:
(ql:quickload :quicklisp-slime-helper)
और Emacs init फ़ाइल में निम्न पंक्तियाँ जोड़ें:
;; 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)))
पुनरारंभ करने के बाद, GNU Emacs सभी आवश्यक पैकेजों को स्थापित और स्थापित करेगा।
SLIME को शुरू करना और पूरा करना, विशेष (अल्पविराम) REPL कमांड
एमएसीएस में Mx slime
डिफ़ॉल्ट (पहले) आम लिस्प कार्यान्वयन के साथ कीचड़ शुरू हो जाएगी। यदि कई कार्यान्वयन प्रदान किए गए हैं (चर slime-lisp-implementations
माध्यम से), अन्य कार्यान्वयनों को M-- Mx slime
माध्यम से पहुँचा जा सकता है, जो मिनी-बफर में उपलब्ध कार्यान्वयन की पसंद की पेशकश करेगा।
Mx slime
खुलेगा REPL बफर जो इस प्रकार दिखेगा:
; SLIME 2016-04-19
CL-USER>
SLIME REPL बफर कुछ विशेष कमांड को स्वीकार करता है। इन सबकी शुरुआत होती है ,
एक बार टाइप करने के बाद ,
विकल्पों की सूची को मिनी-बफर में दिखाया जाएगा। उनमे शामिल है:
-
,quit
-
,restart-inferior-lisp
-
,pwd
- Lisp चल रहा है, जहां से वर्तमान निर्देशिका प्रिंट करता है -
,cd
- वर्तमान निर्देशिका को बदल देगा
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)
मूल्यांकन के बाद जो परिणाम छपा है, वह न केवल एक स्ट्रिंग है: इसके पीछे पूर्ण-लिस्प ऑब्जेक्ट है, जिस पर राइट-क्लिक करके और निरीक्षण का चयन करके निरीक्षण किया जा सकता है।
मल्टी-लाइन इनपुट भी संभव है: नई लाइन डालने के लिए Cj
का उपयोग करें। Enter
-key में प्रवेश किए गए फॉर्म का मूल्यांकन किया जाएगा और यदि फॉर्म समाप्त नहीं हुआ है, तो संभावित रूप से त्रुटि का कारण होगा:
CL-USER> (mapcar (lambda (x y)
(declare (ignore y))
(* x 2))
'(1 2 3)
'(:a :b :c))
(2 4 6)
गलती संभालना
यदि मूल्यांकन में त्रुटि होती है:
CL-USER> (/ 3 0)
यह एक डीबगर बफर को निम्न सामग्री (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 ---
नीचे चल रहा कर्सर --- more ---
आगे बढ़ने के लिए बैकट्रेस का कारण होगा।
Enter
दबाकर बैकट्रेस की प्रत्येक पंक्ति में किसी विशेष कॉल (यदि उपलब्ध हो) के बारे में अधिक जानकारी दिखाई देगी।
रीस्टार्ट की लाइन पर Enter
दबाने पर एक विशेष रीस्टार्ट हो जाएगा। वैकल्पिक रूप से, पुनरारंभ को नंबर 0
, 1
या 2
द्वारा चुना जा सकता है (बफर में कहीं भी कुंजी दबाएं)। डिफ़ॉल्ट पुनरारंभ को एक स्टार द्वारा चिह्नित किया जाता है और कुंजी q
("छोड़ दिया") दबाकर इसे लागू किया जा सकता है। q
दबाने पर डीबगर बंद हो जाएगा और आरईपीएल में निम्नलिखित दिखाएगा
; Evaluation aborted on #<DIVISION-BY-ZERO {10064CCE43}>.
CL-USER>
अंत में, शायद ही कभी, लेकिन लिस्प में एक त्रुटि हो सकती है जिसे लिस्प डिबगर द्वारा नियंत्रित नहीं किया जा सकता है, इस स्थिति में यह निम्न-स्तर डिबगर में छोड़ देगा या असामान्य रूप से समाप्त हो जाएगा। इस तरह की त्रुटि का कारण देखने के लिए, *inferior-lisp*
बफर पर जाएं।
SSH सुरंग के ऊपर एक SWANK सर्वर स्थापित करना।
- सर्वर पर एक सामान्य लिस्प कार्यान्वयन स्थापित करें। (जैसे
sbcl
,clisp
, आदि ...) - सर्वर पर
quicklisp
स्थापित करें। - लोड स्कंड के साथ
(ql:quickload :swank)
- सर्वर को प्रारंभ करें
(swank:create-server)
। डिफ़ॉल्ट पोर्ट4005
। - [अपनी स्थानीय मशीन पर]
ssh -L4005:127.0.0.1:4005 [remote machine]
साथ एक SSH सुरंग बनाएँ -
Mx slime-connect
साथ चल रहे रिमोट स्वांक सर्वरMx slime-connect
। होस्ट127.0.0.1
और पोर्ट4005
होना चाहिए।