May 22 2013

SLIME avanzado

Tag: advancedoverdrive @ 11:37 pm

Algunas funcionalidades y usos de SLIME no es tan basico como las opciones que comentabamos en posts anteriores. Ademas de SLDB que comentabamos en el post anterior, existen muchas otras opciones que hacen de SLIME un gran modo para trabajar en nuestro entorno GNU/emacs.

SLIME Selector

El comando slime-selector es empleado para cambiar de forma rapida entre buffers importantes: REPL, SLDB, el codigo fuente Lisp donde hackeamos, etc. Una vez invocado el prompt, nos permite usar una letra especifica para indicar que buffer queremos mostrar:

? : Muestra ayuda sobre los buffers disponibles de slime-selectors.

r : El buffer REPL para la conexion SLIME actual.

d : El buffer SLDB empleado mas recientemente activado para la conexion actual.

l : El buffer de codigo empleando lisp-mode usado mas recientemente.

s : Buffer *slime-scratch*.

c : Buffer de conexion Lisp.

n : Ciclo hacia la siguiente conexion Lisp.

t : SLIME threads buffer.

SLIME Macroexpansion

Con los buffers de SLIME existen comandos extra empleados especificamente para la expansion de macros.

C-c C-m : ‘slime-macroexpand-1-inplace‘ ; Como slime-macroexpand-1 pero en la forma original es reemplazado con la expansion.

g : ‘slime-macroexpand-1-inplace‘ : La ultima expansion de macros es realizada de nuevo, los contenidos actuales del buffer de la expansion de macros son reemplazados con la nueva expansion.

q : ‘slime-temp-buffer-quit‘ ; Cierra el buffer de expansion.

C-_ : ‘slime-macroexpand-undo‘ ; Deshace la ultima operacion de expansion de macros.

Multiples conexiones con SLIME
SLIME es capaz de conectar a multiples procesos Lisp al mismo tiempo. Cuando el comando M-x slime es invocado con argumentos de prefijo, se ofrecera un proceso Lisp adicional si actualmente uno esta siendo ejecutado. Esto resulta conveniente, pero requiere el conocimiento suficiente y estar seguro de que los comandos SLIME son ejecutados en el sistema Lisp que deseamos. Por lo tanto, algunos buffers estaran asociados a procesos Lisp especificos. Cada conexion Lisp tendra eso si, su propio buffer REPL, y todas las expresiones introducidas o comandos SLIME seran invocados en este buffer y enviados a la conexion asociada. Otros buffers creados por SLIME estaran asociados a las conexiones que originaron dicho buffer, incluyendo por ejemplo buffers SLDB, resultado de listados de apropos, etc. Estos buffers son el resultado de alguna interaccion con los procesos Lisp, por loque los comandos en ellos seran siempre enviados al mismo proceso. Ademas, cabe resaltar que comandos ejecutados en otras partes, como los buffers de codigo que empleen slime-mode, estaran siempre asociados a la conexion por defecto; usualmente esta sera la conexion establecida mas recientemente, aunque esto puede ser reasignado mediante el buffer «connection list»:
C-c C-x c : ‘slime-list-connections‘ ; Muestra el listado de buffers de las conexiones establecidas (es equivalente a pulsar c desde el SLIME selector).
C-c C-x n : ‘slime-cycle-connections‘ ; Cambia las conexiones Lisp actuales moviendose por todas las conexiones (es equivalente a pulsar n desde SLIME selector)
C-c C-x t : ‘slime-list-threads‘ ; Muestra el listado de threads actuales (es equivalente a pulsar t desde SLIME selector).
El buffer mostrado mediante slime-list-connections nos dara un sumario de una linea por conexion. Dicho sumario muestra la lista de conexiones mediante un numero de serie, el nombre de la implementacion Lisp, asi como otros detalles del proceso Lisp. La conexion actual por defecto es indicada mediante un asterisco.
RET : ‘slime-goto-connection‘ ; Hace pop del buffer REPL de la conexion en el punto actual.
d : ‘slime-connection-list-make-default‘ ; Crea una conexion en el punto actual para la conexion por defecto. Esto sera usado para comandos en los buffers de codigo con slime-mode.
g : ‘slime-update-connection-list‘ ; Actualiza la lista de conexiones en el buffer.
q : ‘slime-temp-buffer-quit‘ ; Sale de la lista de conexiones (elimina el buffer y reestablece la configuracion de ventanas).
R : ‘slime-restart-connection-at-point‘ ; Reinicia el proceso Lisp para la conexion en el punto actual.
(sin keybinding asociada) : ‘slime-connect‘ ; Conecta a un servidor ejecutando Swank.
(sin keybinding asociada) : ‘slime-disconnect‘ ; Desconecta todas las conexiones.
(sin keybinding asociada) : ‘slime-abort-connection‘ ; Aborta el intento de conexion actual.
Selection_003
SLIME empleando multiples conexiones a sistemas Lisp, listando las conexiones, threads y eventos.

May 22 2013

SLDB (SLIME Debugger)

Tag: advancedoverdrive @ 10:45 pm

SLDB es el debugger incluido en SLIME, aunque por supuesto se puede especificar otro; aunque este esta optimizado para CL y bien integrado en emacs.

Ciertas condiciones en el sistema Lisp invocaran a SLDB en emacs mediante *DEBUGGER-HOOK*. SLDB mostrara un buffer con la condicion que ha lanzado la senal. Es a partir de este momento cuando se nos da la posibilidad de debuggear mediante SLDB.

Para examinar frames tenemos los siguientes keybindings:

t : ‘sldb-toggle-details‘ ; Hace toggle para mostrar las variables locales y los tags CATCH.

v : ‘sldb-show-source‘ ; Visualiza las expresiones de codigo del frame actual.

e : ‘sldb-eval-in-frame‘ ; Evalua una expresion en el frame. La expresion puede referirse a las variables locales disponibles del frame.

d : ‘sldb-pprint-eval-in-frame‘ ; Evalua una expresion en el frame e imprime el resultado en un buffer temporal.

D : ‘sldb-disassemble‘ ; Desensambla la funcion de un frame. Incluye informacion como punteros a instrucciones en el frame.

i : ‘sldb-inspect-in-frame‘ ; Inspecciona el resultado de evaluar una expresion en el frame.

C-c C-c : ‘sldb-recompile-frame-source‘ ; Recompila un frame. Mediante el argumento con C-u C-c C-c recompila el frame con las opciones de debugging maximas posibles.

Para reiniciar la invocacion:

a : ‘sldb-abort‘ ; Invoca el reinicio ABORT.

q : ‘sldb-quit‘ ; Sale. Para peticiones de evaluacion SLIME, invoca el reinicio el cual restaura el estado conocido de un programa. Para errores en otros threads, es necesario indagar en [SWANK:*SLDB-QUIT-RESTART*].

c : ‘sldb-continue‘ ; invoca el reinicio CONTINUE

0…9 : invoca el reinicio por numero

Los reinicios pueden ser tambien invocados pulsando RET en el buffer.

Para navegar entre frames:

n : ‘sldb-down‘ ; Se mueve frame abajo.

p : ‘sldb-up‘ ; Se mueve frame arriba.

M-n : ‘sldb-details-down‘ ; Se mueve frame abajo «con azucar»: oculta los detalles del frame original y muestra detalles y codigo fuente del siguiente. El movimiento entre frames con azucarado muesta los detalles del codigo fuente del frame actual solamente.

M-p : ‘sldb-details-up‘ ; Se mueve frame arriba «con azucar»: oculta los detalles del frame original y muestra detalles y codigo fuente del anterior. El movimiento entre frames con azucarado muesta los detalles del codigo fuente del frame actual solamente.

> : ‘sldb-end-of-backtrace‘ ; Captura el backtrace entero y salta al ultimo frame.

< : ‘sldb-beginning-of-backtrace‘ ; Salta al primer frame.

Para realizar pasos con el debugger empleamos los siguientes keybidings:

s : ‘sldb-step‘ ; Da un paso hacia la siguiente expresion en el frame. Para CMUCL esto significa que hace set para un breakpoint para todas aquellas partes de codigo del bloque actual de codigo el cual es alcanzable desde el codigo en la localizacion actual.

x : ‘sldb-next‘ ; Da un paso hacia adelante en la funcion actual.

o : ‘sldb-out‘ ; Para el paso-simple de forma temporal, pero lo continua una vez se vuelva de la funcion actual.

Otros keybidings empleandos en el debugger y de utilidad son:

r : ‘sldb-restart-frame‘ ; Reinicia la ejecucion de un frame con los mismos argumentos que fueron originalmente usados en la llamada.

R : ‘sldb-return-from-frame‘ ; Vuelve desde el frame con el valor introducido en el minibuffer.

B : ‘sldb-break-with-default-debugger‘ ; Sale de SLDB y debuggea la condicion usando el debugger por defecto del sistema Lisp.

C : ‘sldb-inspect-condition‘ ; Inspecciona la condicion actual a ser debuggeada.

: : ‘slime-interactive-eval‘ ; Evalua una expresion introducida en el minibuffer.

A : ‘sldb-break-with-system-debugger‘ ; Adjunta el debugger al proceso actual lisp.

Selection_002

Captura de pantalla de SLDB


May 22 2013

Libros Lisp

Tag: basicoverdrive @ 6:53 pm

En la seccion «Scheme, CL y Elisp» de esta misma web (que para quien no este al tanto tambien actualizo aunque no aparecen como posts) comentaba los distintos libros que existen para aprender estos 3 dialectos. Ademas he incluido los libros referentes a Haskell como excepcion ya que es un lenguaje bastante interesante. Son estos:

Libros introductorios:

  • Para aprender Scheme: The little schemer
  • Para aprender Elisp: C-h i en emacs tiene un estupendo manual de elisp en el que practicar en el propio entorno.
  • Para aprender CL:  Common LISP: A Gentle Introduction to Symbolic Computation
  • Para aprender Haskell: Learn You a Haskell for Great Good!: A Beginner’s Guide

Libros avanzados:

  • El libro mas avanzado de Scheme: Structure and Interpretation of Computer Programs
  • El libro mas avanzado para Elisp: An Introduction to Programming in Emacs Lisp
  • El libro mas avanzado para CL: On Lisp
  • El libro mas avanzado para Haskell: The Haskell Road to Logic, Maths and Programming

Ademas de estos libros, recordemos que tambien adquiri un libro interesante (ademas de gracioso) para aprender CL mediante el desarrollo de juegos, «The Land of Lisp«. Y por fin llegaron los libros de Lisp y el de Haskell.

libros

Por supuesto de estos libros, el mas tocho es el de Common Lisp, como no. El mas surrealista es el de Haskell, y el mas elegante es el de scheme… al menos es la primera impresion que he tenido al ojearlos asi por encima. Ire actualizando la web en la seccion de Lisp segun lo que vaya aprendiendo de estos libros.


Página siguiente »