Common Lisp (2) - vývojové prostredie

22.02.2008 15:00 | Články | Adam Sloboda
Lispové IDE – Emacs a SLIME.

Najpoužívanejšie vývojové prostredie je editor Emacs (sám používa veľmi špecializovaný derivát Lispu), zvlášť ak sa jedná o open-source implementácie Common Lisp. Komerčné implementácie poskytujú aj vlastné riešenia, no tie tiež používajú Emacs-like editory.

Napriek mnohým schopnostiam Emacsu by samotný nebol veľmi pohodlný, preto sa používa rozšírenie SLIME (Superior Lisp Interaction Mode for Emacs). SLIME podporuje rôzne implementácie Common Lisp a umožňuje oveľa pohodlnejšiu interakciu s interpreterom. Interpreter môže byť aj vzdialený, či dokonca na produkčnom serveri, kde sa priamo dajú nahrávať zmeny kódu bez nutnosti reštartu.

Interpreter sa nazýva REPL (Read-Eval-Print Loop) podľa funkcií, ktoré sa stále vykonávajú – načítanie, vyhodnotenie, vypísanie. Tento štýl vývoja uľahčuje testovanie funkcií už počas ich písania a znižuje tak riziko výskytu chyby (napriek tomu je ale vždy vhodné písať pre svoj kód testy).

Emacs umožňuje príkazom hyperspec-lookup vyhladávať v lokálnej alebo online dokumentácii HyperSpec a výsledok zobrazí napr. pomocou w3m browseru.

Pri editácii nám môžu pomôcť (každému podľa svojho uváženia) módy pre Emacs: paredit (balíček paredit-el), highlight-parentheses (načítať sa dá príkazom M-x load-file, použitie skratiek je vysvetlené nižšie). Spomínaný SLIME a browser sa v Debiane nachádzajú v týchto balíčkoch: w3m, w3m-el, slime, hyperspec (lokálna kópia). A samozrejme netreba zabudnúť na samotný Lisp, ja používam Steel Bank Common Lisp (SBCL). Teraz by malo nasledujúce nastavenie SLIME bez problémov fungovať, používa sa pri otvorení ".lisp" súboru. Zmené nastavenie sa načíta skratkou C-M-x (kurzor musí byť nad nastavením, ktoré chceme načítať).

;; Common Lisp (SBCL)
(defvar *hyperspec-path* "/usr/share/doc/hyperspec/Body/")
(defun my-lisp-mode-hook ()
 (require &apsslime)
 (setq slime-net-coding-system &apsutf-8-unix)
 (setq inferior-lisp-program "sbcl")
 (slime-mode t)
 (paredit-mode t)
 (local-set-key "\r" &apsnewline-and-indent)
 (setq lisp-indent-function &apscommon-lisp-indent-function)
 (setq indent-tabs-mode nil)
 (setq browse-url-browser-function &apsw3m-browse-url)
 (highlight-parentheses-mode t))
(add-hook &apslisp-mode-hook &apsmy-lisp-mode-hook)

Pokiaľ niekomu nie je jasná vyššie uvedená skratka: C = control, M = meta (alt, esc), x je malé písmeno (so zapnutým caps lock to znamená stlačený shift). Klávesa Esc sa nedrží, iba sa stlačí raz a nasleduje zbytok skratky. V tomto prípade ju nie je možné použiť.

Tento kus konfigurácie je tiež Lisp (Emacs Lisp) a patrí do hlavného konfiguračného súboru ~/.emacs. Začiatočník nemusí rozumieť všetkému, časom sa to poddá, no je vhodné inšpirovať sa cudzími konfiguráciami – konfigurácia bude jasnejšia a ako bonus je zvýšenie pohodlnosti editoru. Konfigurácie je možné nájsť na EmacsWiki alebo cez Google.

Užívatelia editoru Vim sú zrejme trochu zhrození, ale Emacs je takmer nevyhnutnosť a k Lispu patrí. Sú ľudia, ktorí sa pokúšajú vytvoriť podobné prostredie pre Vim a používajú Vim, ale sami uznávajú, že Emacs je vďaka svojim vlastnostiam na to oveľa lepšie vybavený. V prípade núdze je možné ešte použiť viper-mode, ktorý emuluje editor Vi.

V nasledujúcej tabuľke je popis niekoľkých základných skratiek spolu s príkazom, ktorým patrí. Všetky funkcie editoru sú naprogramované v Emacs Lispe a je možné ich vyhladávať cez help (Emacs je "sebadokumentujúci rozšíriteľný textový editor").

skratkapopispríkaz
C‑h ?help, najlepší pomocník ak hľadáme informácie o EmacseM‑x help
M‑`menuM‑x tmm-menubar
C‑SPCSPC = medzerník. Táto skratka vytvorí značku, potom sa môžeme kurzorom presunúť kamkoľvek a tým vytvoríme označený región.M‑x set‑mark‑command
M‑wkopírovanieM‑x kill‑ring‑save
C‑w"vystrihnutie" (kill)M‑x kill‑region
C‑yvloženie (yank)M‑x yank
C‑sinkrementálne vyhľadávanie (ako Ctrl+F vo Firefoxe alebo / v Opere)M‑x isearch‑forward
C‑rspätné inkrementálne vyhľadávanieM‑x isearch‑backward
C‑x C‑fotvorenie súboru (vytvorí tzv. buffer)M‑x find‑file
C‑x kzruší buffer (kill‑buffer)M‑x kill‑buffer
C‑x bprejsť do iného bufferuM‑x switch-to-buffer alebo iswitchb-buffer
C‑x oaktivuje iné okno (window, Emacs termín – jedná sa o samostatné okno v rámci editoru), ak je viac viditeľnýchM‑x other-window
M‑/automatické doplnenie slovaM‑x dabbrev-expand
M‑%nahradenie reťazcaM‑x query-replace

Za spomenutie ešte stoja skratky C-x 0/1/2/3 – v tomto poradí: dá aktívne okno do pozadia, maximalizuje aktívne okno, rozdelí okno horizontálne, rozdelí okno vertikálne. Existuje mnoho ďalších užitočných príkazov, no toto by malo úplne stačiť pre orientáciu a ovládanie Emacsu. Ešte jedna rada na záver – takmer každý príkaz očakávajúci vstup sa dá dopĺňať tabulátorom.

Teraz máme príjemné prostredie, kde si môžeme pohodlne vyskúšať (pokiaľ sa to zatiaľ nezdá byť pohodlné, tak to bude len otázka zvyku) čo to dokáže. Posledná rada na záver, REPL je na dosah ruky pod skratkou C-c C-z a ďalšie užitočné príkazy aj so skratkami sú v menu SLIME.