¿Cómo comenzar a escribir el código Lisp?

A menudo hay que ver cómo los principiantes prueban Common Lisp y luego se quejan de que es imposible trabajar normalmente con él. Como regla, esto se debe al hecho de que no entienden cómo configurar un proceso que proporcione la misma "respuesta rápida" del entorno de desarrollo, cuando cambiaste la función, la compiló y los cambios comenzaron a usarse inmediatamente dentro del programa que ya se está ejecutando sin reiniciando


Puede entender cómo se ve viendo un video en youtube que demuestra el desarrollo interactivo en Common Lisp.



Hoy quiero mostrar cómo configurar un entorno de desarrollo para tal desarrollo. En 2018, se volvió muy simple, gracias a la mejora constante de la afinación.


Pido disculpas de antemano por los siguientes videos grabados en Asciinema, y ​​Habrahabr no lo admite. Haga clic en las capturas de pantalla de la consola para ver videos.


Primero, instale SBCL , Roswell y Emacs . Hablaré sobre el ejemplo de instalación de todo en OSX, y me alegrará si en los comentarios comparte su experiencia en Windows y Linux. Luego puedo complementar el artículo con ejemplos para las tres plataformas.


SBCL es una de las muchas implementaciones de Common Lisp. Del código abierto, el más rápido. Si lo desea, en SBCL puede ejecutar código a una velocidad comparable al código C ++, pero al mismo tiempo tener todas las ventajas del desarrollo interactivo rápido.


Roswell es una utilidad para instalar y ejecutar programas Common Lisp. Incluyendo que sabe cómo ejecutar Emacs preconfigurados, así como recopilar programas en binarios.


Probablemente conozca Emacs, un sistema operativo que también tiene un editor de código. Puede escribir en Common Lisp y en cualquier otro editor, pero hoy Emacs tiene la mejor integración y soporte para la edición semántica de código. Con él no tienes que contar los corchetes, él hace todo por ti.


Entonces, si usa OSX, entonces necesita hacer


brew install roswell emacs 

Después de que la preparación agita el disco y pone todo lo que necesita, simplemente ejecute en la terminal:


 ros run 

Este comando le dará automáticamente la última versión de SBCL e iniciará la respuesta de Lisp, donde puede ingresar el código:



Pero este no es el caso, no está tan diseñado. Así que configuremos Emacs para un desarrollo completo:


 ros emacs 

El equipo lanzará Emacs en la consola y configurará Quicklisp, el administrador de paquetes de Common Lisp.
Pero antes de continuar, configuremos el terminal, emacs y OSX para que funcionen bien juntos.


Primero, debe cambiar algunas configuraciones en OSX e iTerm


Haga que CapsLock funcione como Control. En Emacs, en ninguna parte sin él:



Luego deshabilite todas las combinaciones asociadas con el uso de Control y flechas en las tomas de MissionControl:



Luego coloque iTerm2 y cambie el comportamiento Alt en la configuración del perfil de Normal a Esc +:



Después de eso, cree un archivo con una configuración mínima para Emacs, ~/.emacs.d/init.el :


 (package-initialize) (require 'package) (add-to-list 'package-archives '("MELPA" . "http://melpa.milkbox.net/packages/") t) (defun install-package (package) (unless (package-installed-p package) (package-refresh-contents) (package-install package))) (install-package 'paredit) (install-package 'expand-region) (defun setup-lisp-mode () (require 'paredit) (paredit-mode) (define-key paredit-mode-map (kbd "Cw") 'paredit-backward-kill-word)) (add-hook 'lisp-mode-hook 'setup-lisp-mode) (add-hook 'emacs-lisp-mode-hook 'setup-lisp-mode) ;;  Cw           ;;  kill-region (global-set-key (kbd "Cw") 'backward-kill-word) ;;      kmacro- (global-set-key (kbd "Cx Ck") 'kill-region) ;;  indent-new-comment-line (global-set-key (kbd "Mj") (lambda () (interactive) (join-line -1))) ;;    (global-set-key (kbd "Cc rs") 'replace-string) (global-set-key (kbd "Cc rr") 'replace-regexp) ;;    emacs    ;;      =,   ;;    . (global-set-key (kbd "Cc =") 'er/expand-region) ;;      , ;;        (global-set-key (kbd "Cc c") 'comment-or-uncomment-region) (global-set-key (kbd "Cc C-\\") 'goto-last-change) (setq custom-file "~/.emacs.d/customizations.el") (when (file-exists-p custom-file) (load custom-file)) 

Después de eso, ejecute ros emacs nuevamente, presione Alt-X e ingrese el comando slime . Como resultado, obtenemos la línea de comando para ingresar comandos lisp:



Ahora ya puedes codificar


Pero no ingresaremos comandos en la repetición, es mejor comenzar el desarrollo de un microservicio de inmediato. Si solo necesita una API, entonces la forma más fácil es usar Ningle . Si necesita un marco más avanzado, como una jungla, puede probar Radiance o Caveman2 . Pero ahora no haremos nada complicado, sino que crearemos una simple cookie HTTP.


Abra el archivo server.lisp ( Cx Cf server.lisp ) en Emacs y comience a escribir el código. Algo como esto:



Como resultado, se lanzará un servidor web dentro de su instancia, en el que puede agregar rutas y redefinir vistas sobre la marcha.


Aquí está el código completo, para los perezosos:


 ;; Micro-framework for building API (ql:quickload :ningle) ;; Now ningle is installed and we need to install a clack which is analog of WSGI ;; stack from Python ;; I've pressed Cc Cc to eval this form (ql:quickload :clack) ;; To parse json: (ql:quickload :jonathan) (defvar *app* (make-instance 'ningle:<app>)) (setf (ningle:route *app* "/") ;; in case, if you need to parse or serialize JSON, ;; use Jonthan library. (jonathan:to-json '(:foo 100500))) (defvar *server* nil "This variable will store currently running server instance.") (defun start () (if *server* (format t "Server already started") (setf *server* (clack:clackup *app*)))) (defun stop () (if *server* (clack:stop *server*) (format t "Server is not running"))) 

En Lisp, las construcciones que se encuentran entre paréntesis se denominan "formas". Los formularios que están en la parte superior y no anidados en ningún otro se denominan de nivel superior. Dichos formularios se pueden compilar haciendo clic en Cc Cc cuando el cursor está dentro de dicho formulario. Si CapsLock vincular CapsLock en ontrol , entonces esta combinación es muy conveniente para presionar.


Después de compilar el formulario, una nueva versión de la función entra en vigencia inmediatamente y no se requiere reiniciar el servidor. Por lo tanto, es muy conveniente depurar y corregir errores. Además, puede configurar la ejecución de prueba automática inmediatamente después de compilar parte del código, pero esta es una historia completamente diferente.


Si está interesado en algún otro tema, escriba los comentarios, también intentaré hacer publicaciones sobre ellos.

Source: https://habr.com/ru/post/es413061/


All Articles