May 21 2013

SLIME: uso basico y medio

Tag: mediumoverdrive @ 10:49 pm

Si en el articulo anterior explicabamos la instalacion y configuracion de SLIME. En este articulo explicaremos los keybidings fundamentales y algunos mas para poder sentirnos confortables usando SLIME. Clasificaremos los keybidings segun el uso que se le de o la familia a la que pertenezcan.

Evaluacion

Los comandos de evaluacion muestran el resultado en el area echo, aunque empleados usando prefijos, causara que se inserte el resultado en el buffer actual.

C-x C-e : ‘slime-eval-last-expression‘ ; evalua la expresion antes del cursor.

C-M-x : ‘slime-eval-defun‘ ; evalua el buffer a modo toplevel.

C-c : : ‘slime-interactive-eval‘ ; evalua la expresion leida desde el minibuffer.

C-c C-r : ‘slime-eval-region‘ ; evalua la region.

C-c C-p : ‘slime-pprint-eval-last-expression‘ ; evalua la expresion anterior e imprime el resultado en un nuevo buffer.

C-c E : ‘slime-edit-value‘; edita el valor en un nuevo buffer con la forma *Edit <form>*. El valor es insertado en un buffer temporal para la edicion y asignado en Lisp para cuando sea committeado mediante C-c C-c.

C-x M-e : ‘slime-eval-last-expression-display-output‘ ; muestra el buffer de salida y evalua la expresion al punto precedido. Esto es util si la expresion escribe algo en el stream de salida.

C-c C-u : ‘slime-undefine-function‘ ; un-define una funcion, con fmakunbound, para el simbolo que se encuentra en el punto actual.

Compilacion

C-c C-c : ‘slime-compile-defun‘ ; Compila en la forma top-level en el punto actual. La region parpadeara para dar feedback de que parte fue seleccionada. Si se le pasa un argumento positivo, sera compilado con el maximo nivel de debug, si el argumento dado es negativo, sera compilado optimizando la velocidad. El comando escribira la region en un fichero, compilara dicho fichero y cargara el codigo resultante.

C-c C-k : ‘slime-compile-and-load-file‘ ; Compila y carga el fichero fuente del buffer actual. Si el paso de compilacion falla, el fichero no sera cargado.

C-c M-k : ‘slime-compile-file‘ ; Compila pero no carga el fichero fuente del buffer actual.

C-c C-l : ‘slime-load-file‘ ; Carga un fichero Lisp. Este comando usa la funcion LOAD de CL.

(sin keybinding asignada) : ‘slime-compile-region ; Compila la region seleccionada.

M-n : ‘slime-next-note‘ ; Mueve el puntero a la siguiente nota de compilacion y muestra dicha nota.

M-p : ‘slime-previous-note‘ ; Mueve el puntero a la anterior nota de compilacion y muestra dicha nota.

C-c M-c : ‘slime-remove-notes‘ ; Elimina todas las anotaciones del buffer.

C-x ` : ‘next-error‘ ; Visita el siguiente mensaje de error. (No es realmente un comando SLIME).

Completado

M-TAB : ‘slime-complete-symbol‘ ; Completa el simbolo en el punto actual. Existen 3 modos de autocompletado disponible en SLIME; por defecto es similar al autocompletado normal existente en Emacs.

Busqueda de definiciones o Meta-Point

M-. : ‘slime-edit-definition‘ ; Se desplaza a la definicion del simbolo del puntero actual.

M-, o M-* : ‘slime-pop-find-definition-stack‘ ; Se desplaza hacia atras donde M-. fue invocado. Esto da un multi-nivel de backtracking cuando M-. haya sido usado en distintas ocasiones.

C-x 4 . :slime-edit-definition-other-window‘ ; Como slime-edit-definition, pero cambia a otra ventana para editar la definicion.

C-x 5 . :slime-edit-definition-other-frame‘ ; Como slime-edit-definition, pero cambia a otro frame para editar la definicion.

(sin keybiding asignada) : ‘slime-edit-definition-with-etags‘ ; Emplea una tabla ETAGS para encontrar la definicion en el punto actual.

Documentacion

SPC : ‘slime-space‘ ; Inserta un espacio, pero al mismo tiempo busca y muestra la lista de argumentos de la funcion en el punto actual.

C-c C-d d : ‘slime-describe-symbol‘ ; Describe el simbolo en el punto actual.

C-c C-f : ‘slime-describe-function‘ ; Describe la funcion en el punto actual.

C-c C-d a : ‘slime-apropos‘ ; Realiza una busqueda apropos en los nombres de simbolos Lisp para encontrar una expresion regular y mostrar las cadenas de documentacion. Por defecto son buscados todos los simbolos externos de todos los paquetes. Mediante el uso de prefijos es posible escoger un paquete especifico.

C-c C-d z : ‘slime-apropos-all‘ ; Como slime-apropos pero buscatam bien por defecto en los simbolos internos.

C-c C-d p : ‘slime-apropos-package‘ ; Muestra los resultados de apropos de todos los simbolos de un paquete. Este comando es empleado para buscar un paquete a alto nivel.

C-c C-d h : ‘slime-hyperspec-lookup‘ ; Busca el simbolo en el punto actual en la Hyperspec Common Lisp.

C-c C-d ~ : ‘common-lisp-hyperspec-format‘ ; Busca un caracter de formato en la Hyperspec Common Lisp.

Referencia cruzada (cross-reference)

Los comandos de referencia cruzada de SLIME estan basados en el soporte dado por el sistema Lisp, lo cual puede variar entre Lisps. Para los sistemas construidos sin soporte XREF para peticiones SLIME, los cuales son tomados desde el repositorio CMI AI y manejados con SLIME.

C-c C-w c : ‘slime-who-calls‘ ; Muestra las funciones que llaman a la funcion actual.

C-c C-w w : ‘slime-calls-who‘ ; Muestra las funciones que son llamadas desde la funcion actual.

C-c C-w r : ‘slime-who-references‘ ; Muestra las referencias a la variable global.

C-c C-w b : ‘slime-who-binds‘ ; Muestra los bindings a la variable global.

C-c C-w s : ‘slime-who-sets‘ ; Muestra las tareas a la variable global.

C-c C-w m : ‘slime-who-macroexpands‘ ; Muestra expansiones de una macro.

(sin keybiding asociada) : ‘slime-who-specializes‘ ; Muestra todos los metodos conocidos especializados en una clase.

Existen tambien comandos callers y callees, que operan sobre objectos de funciones en el monticulo a bajo nivel para descubrir el grafo de llamadas. Estos estan solo disponible en algunos sistemas Lisp, y son mas utiles como fallback cuando se requiere informacion XREF que no esta disponible.

C-c < : ‘slime-list-callers‘ ; Lista las funciones que llaman.

C-c > : ‘slime-list-callees‘ ; Lista las funciones que son llamadas.

Expansion de macros

C-c C-m : ‘slime-macroexpand-1‘ ; Hace expansion de macro de la expresion en el punto actual. Si es invocado con argumentos, usa macroexpand en lugar de macroexpand-1.

C-c M-m : ‘slime-macroexpand-all‘ ; Expande la macro completamente de la expresion en el punto actual.

(sin keybinding asociada) : ‘slime-compiler-macroexpand-1‘ ; Muestra la expansion macro del compilador de una s-expression en el punto actual.

(sin keybinding asociada) : ‘slime-compiler-macroexpand‘ ; Repetidamente expande macros del compilador de una s-expression en el punto actual.

Desensamblado

C-c M-d : ‘slime-disassemble-symbol‘ ; Desensambla la definicion de la funcion de un simbolo en el punto actual.

C-c C-t : ‘slime-toggle-trace-fdefinition‘ ; Hace toggle de trazas de la funcion en el punto actual. Si es invocado con prefijos, lee informacion adicional, como por ejemplo que metodo particular debe ser trazado.

(sin keybinding asociada) : ‘slime-untrace-all‘ ; Elimina las trazas para todas las funciones.

Abortaje y recuperacion

C-c C-b : ‘slime-interrupt’ ; Interrumpe Lisp (envia SIGINT).

(sin keybinding asociada) : ‘slime-restart-inferior-lisp‘ ; Reinicia el proceso inferior-lisp.

C-c ~ : ‘slime-sync-package-and-default-directory‘ ; Sincroniza el paquete actual y el directorio de trabajo desde Emacs a Lisp.

C-c M-p :slime-repl-set-package‘ ; Establece el paquete actual del REPL.

(sin keybinding asociada) : ‘slime-cd‘ ; Establece el directorio actual del proceso Lisp. Esto ademas cambia el directorio actual del buffer REPL.

(sin keybinding asociada) : ‘slime-pwd‘ ; Muestra el directorio actual del proceso Lisp.

Inspeccion

El inspector SLIME es una alternativa basada en la funcion standar INSPECT de Emacs. El inspector de objetos de buffer en Emacs usa una combinacion de texto plano, hiperenlaces hasta relacion de objetos. El inspector puede ser especializado para objetos de nuestros propios programas, para ello se debe indagar en la funcion generica inspect-for-emacs del fichero swank-backend.lisp.

C-c I : ‘slime-inspect‘ ; Inspecciona el valor de una expresion insertada en el minibuffer.

RET : ‘slime-inspector-operate-on-point‘ ; Si el punto actual es un valor, entonces el inspector es llamado de forma recursiva sobre el valor. Si nos encontramos en una accion, entonces sera llamada dicha accion.

d : ‘slime-inspector-describe‘ ; Describe el slot en el punto actual.

v : ‘slime-inspector-toggle-verbose‘ ; Hace toggle entre el modo verbose (detallado) y terse (conciso). El valor por defecto viene determinado por swank:*inspector-verbose*.

l : ‘slime-inspector-pop‘ ; Se desplaza hacia el objeto anterior. (De vuelta desde RET).

n : ‘slime-inspector-next‘ ; La inversa de l.

q : ‘slime-inspector-quit‘ ; Sale del buffer inspector.

M-RET : ‘slime-inspector-copy-down‘ ; Almacena el valor bajo el punto actual en la variable *. Este puede ser entonces usado para el acceso al objeto en el REPL.

Profiling

(sin keybinding asociada) : ‘slime-toggle-profile-fdefinition‘ ; Hace toggle de profiling de una funcion.

(sin keybinding asociada) : ‘slime-profile-package‘ ; Hace profiling de todas las funciones de un paquete.

(sin keybinding asociada) : ‘slime-unprofile-all‘ ; Elimina el profiling de todas las funciones.

(sin keybinding asociada) : ‘slime-profile-report‘ ; Realiza un reporte de los datos del profiler.

(sin keybinding asociada) : ‘slime-profile-reset‘ ; Resetea los datos del profiler.

(sin keybinding asociada) : ‘slime-profiled-functions‘ ; Muestra la lista de las funciones actuales incluidas en el profiler.

Comandos shadowed

C-c C-a, M-x slime-nop : Estos comandos son ocultos desde inf-lisp.

C-c C-v, M-x slime-nop : Estos comandos son ocultos desde inf-lisp.

Indentacion semantica

SLIME automaticamente descubre como identar macros en nuestro sistema Lisp. Para realizar esta accion en el lado de Lisp son escaneadas todas las macros del sistema y son reportadas a Emacs todas aquellas que contengan el argumento &body. Emacs identa estas especialmente, poniendo al principicio 4 espacios para los argumentos y dos espacios para el body. En caso de que esto no funcionase por la razon de que SLIME no fuese capaz de distinguir entre macros y los nombres de simbolos, se puede ver que simbolos son envueltos en colisiones mediante:

(swank:print-indentation-lossage)

Tan solo hay que anular los simbolos Elisp mediante la propiedad common-lisp-indent-function a nuestro modo. SLIME no anulara ni sobreescribira nuestras opciones personalizadas.

Lisp automaticamente escanea cada simbolo para los cambios en la identacion justo despues de cada comando de Emacs. Sin embargo, esto es demasiado costoso para realizar cada vez, por lo que Lisp usualmente escanea simbolos los cuales coinciden con el paquete local que es usado por el buffer de Emacs. Esto suele funcionar bien y suele ser suficiente para la gran mayoria de macros definidas de forma interactiva, pero para capturar el resto, se realiza un escaneo completo de simbolos cada vez que un paquete Lisp nuevo es creado entre comandos. El siguiente comando puede ser empleado cuando sea necesario:

(sin keybiding asociada) : ‘slime-update-indentation‘ ; Fuerza todos los simbolos a ser escaneados para la informacion de indentacion.

Fontificacion condicional del reader

SLIME evalua automaticamente expresiones condicionales para el reader, como #+linux, en buffers de codigo y atenua las partes que seran ignoradas por la conexion actual Lisp.

Con toda esta lista de funciones y keybidings fundamentales y algunas otras, es posible moverse comodamente en frente de este magnifico modo para desarrollar en Lisp. Aunque este modo ofrece aun mas posibilidades avanzadas que seran descritas en nuestro siguiente post.


May 12 2013

SLIME: instalacion y configuracion

Tag: mediumoverdrive @ 10:36 pm

slime-smallSLIME (Superior Lisp Interaction Mode for Emacs o bien Modo de Interaccion de Lisp Superior para Emacs) es un modo para emacs para desarrollar aplicaciones en CL. SLIME usa un backend llamado SWANK, el cual es cargado dentro de CL. SLIME soporta distintas implementaciones de CL como CMUCL, SBCL, CLISP, etc.

Algunas de las funcionalidades mas destacadas son: slime-mode, que es el modo lisp menor que permite usar lisp con evaluacion de codigo, compilacion y expansion de macros, asi como documentacion online (describe, apropos y hyperspec), busquedas por definicion o Meta-Point, autocompletion de simbolos y paquetes, indentacion automatica de macros basadas en &body, interfaz para referencias cruzadas (WHO-CALLS, etc). Tambien incluye SLDB, que es un debugger de CL con una interfaz de usuario basada en emacs, REPL (Read-Eval-Print Loop escrito en Elisp) con soporte de comandos cortos parecido al listener McCLIM. Entre las features tambien se incluyen notas de compilacion que permite recopilar mensajes de compilacion y anotar directamente estos sobre buffers fuente. Por ultimo y de las features importantes que incluye, tambien posee inspector para la inspeccion de objectos de manera interactiva.

more-slime

Instalacion de SLIME

Para instalar SLIME lo realizaremos usando la ultima version desde CVS:

$ export CVSROOT=:pserver:anonymous@common-lisp.net:/project/slime/cvsroot

$ cvs login (el password es anonymous)

$ cvs checkout slime

Configuracion de SLIME

Ahora nos disponemos a configurar emacs para que use SBCL con SLIME:

(setq inferior-lisp-program «/opt/sbcl/bin/sbcl») ; your Lisp system

(add-to-list ‘load-path «~/hacking/lisp/slime/») ; your SLIME directory

(require ‘slime)

(slime-setup)

Ejecutar SLIME

Para ejecutar el nuevo modo SLIME para comenzar a trabajar comodamente con CL con nuestro flamante compilador y conjunto de herramientas SBCL tan solo debemos lanzar SLIME de la siguiente manera:

M-x slime

Esto empleara el paquete del modo inferior lisp para ejecutar un proceso Lisp, cargara e iniciara el servidor en el lado Lisp (tambien conocido como Swank) y establecera una conexion socket entre el entorno Emacs y Lisp. Finalmente un buffer REPL sera creado para cuando se introduzcan expresiones Lisp para su evaluacion. Veamos ahora el uso de SLIME:

Buffers temporales

Algunos comandos en SLIME crean buffers temporales para mostrar resultados. Los buffers temporales pueden ser eliminados presionando la letra q. Esto restaurara la ventana anterior como estaba mostrada justo antes de mostrar el buffer. Los buffers buffers temporales tambien pueden ser suprimidos mediante la funcion kill-buffer, sin embargo, la configuracion de ventanas como estaba previamente no sera restaurada. Tambien cabe senalar que pulsando RET SLIME tomara la accion mas logica en cada momento (o la mas ‘esperada’).

Buffer *Inferior-lisp*

SLIME internamente usa el paquete comint que comienza los procesos Lisp. El buffer *Inferior-lisp* contiene y posee el nivel mas alto de los procesos Lisp. Este acceso directo a Lisp es util para troubleshooting, y hasta cierto punto de la integracion de SLIME esta disponible usando el inferior-slime-mode. Sin embargo, en uso normal esta altamente recomendado usar completamente la integracion SLIME REPL e ignorar el buffer *inferior-lisp*.

Multithreading

Si el sistema Lisp soporta multithreading, SLIME genera un nuevo thread para cada request, por ejemplo C-x C-e crea un nuevo thread para evaluar la expresion. Una excepcion a esta regla son los requests creados desde REPL: todos los comandos introducidos en el buffer REPL son evaluados en un thread REPL dedicado.

El manual completo de SLIME se puede encontrar en su web oficial. Tambien aqui se puede ver un video demostracion de slime aqui.


May 09 2013

SBCL en emacs

Tag: mediumoverdrive @ 10:53 pm

sbcl63 SBCL es un  compilador para Common Lisp muy especial, que significa Steel Bank Common Lisp, algo asi como Banco de Acero de Common Lisp. SBCL es un compilador de alto rendimiento para CL que provee un entorno interactivo, un debugger, un profiler estadistico, herramientas de cobertura para codigo asi como otras muchas extensiones. SBCL tiene soporte para unicode asi como threading. El nombre de SBCL tiene origen en referencia a Carnegie Mellon University Common Lisp (CMUCL) del cual SBCL es un fork; Andrew Carnegie hizo su fortuna mediante la industria del acero y Andrew _Mellon fue un banquero exitoso.

El punto principal de divergencia en el tiempo en el que se creo este fork, fue un procedimiento de bootstrapping limpio: CMUCL requiere un binario compilado y ejecutable de si mismo para poder compilar el codigo fuente CMUCL, mientras que SBCL soporta bootstrapping de cualquier compilador que cumpla la implementacion de ANSI CL.

Lo cierto es que no difiere absolutamente nada de la configuracion de CLISP en emacs para emplear SBCL en el mismo entorno. Tan solo deberemos instalar y especificar donde se encuentra el binario SBCL de la misma forma que lo hicimos previamente con CLISP.

(setq inferior-lisp-program «/usr/bin/sbcl –noinform»)

Ahora bien, podemos instalar SBCL desde apt o nuestra aplicacion de control de paquetes favorita de manera bastante sencilla, o bien podemos probar la esencia de un compilador que se compila a si mismo. Nos valdria cualquier compilador que como ya hemos mencionado, cumpla el estandar ANSI CL, tambien podriamos usar el propio SBCL para compilar SBCL. En su dia ya lo explicamos para usar stumpwm (que puede usar o bien CLISP o bien SBCL) aunque aqui lo usamos para un proposito diferente y explicamos su esencia, asi que volveremos a hacerlo, aunque esta vez usando tan solo apt por rapidez.

Primero necesitaremos instalar ASDF (Another System Definition Format) que sirve para poder realizar instalaciones de distintas bibliotecas para CL, seria lo analogo a Make.

# apt-get install cl-asdf

Despues de instalar ASDF podemos realizar la instalacion de ciertas bibliotecas en las cuales estamos interesados como por ejemplo Cl-pcre (biblioteca de CL que brinda la oportunidad de usar expresiones regulares de Perl en CL, siendo compatible con dicho lenguaje, rapido y portable entre distintas implementaciones que siguen el ANSI CL, ademas de ser seguro para threads y permitiendo usar s-expressions para los regexp) y tambien instalaremos CLX (Biblioteca cliente para CL para el sistema estandar X Window, equivalente a Xlib para C, sin embargo CLX esta escrito completamente en CL y no usa Xlib. CLX ademas contiene tipos de datos, funciones y macros para interactuar con el servidor de las X mediante el envio de peticiones y recepcion de eventos y sus respuestas.

# apt-get install sbcl

# apt-get install cl-ppcre

# apt-get install cl-clx-sbcl

 Ahora ejecutemos emacs y dentro del mismo ejecutemos M-x run-lisp, podemos ver el resultado del siguiente codigo CL interpretrado:

Selection_027

Se puede encontrar el manual completo de SBCL en su web oficial, asi como un manual que describe como esta implementado.


« Página anteriorPágina siguiente »