May 09 2013

CLISP en emacs

Tag: mediumoverdrive @ 3:10 pm

clisp CLISP es una implementacion de Common Lisp realizada por Bruno Haible originalmente. Dicha implementacion provee del compilador que soporta el estandar ANSI Common Lisp ademas de muchas otras extensiones. CLISP incluye en si el interprete, compilador, un debugger, CLOS (para objectos), MOP (MetaObject Protocol), una interfaz al lenguaje ajena, internacionalizacion o i18n, POSIX, soporta expresiones regulares Perl, provee tambien de interfaz para sockets, bignumbers de forma rapida, precision flotante arbitraria y mucho mas. Existe una interfaz para X11 mediante CLX, Garnet y CLUE/CLIO. Edicion por linea de comandos mediante readline. CLISP ademas corre Maxima (el unico lenguaje programado de manera completa por John McCharthy en el MIT, que es la implementacion mas antigua (Recursive Functions of Symbolic Expressions and Their Computation, Part I Communications of the ACM, Vol. 3, April 1960, pp. 184-195), ACL2 y muchos otros paquetes adicionales de Common Lisp. Para mas informacion, podeis ver la pagina oficial de CLISP.

Para instalar CLISP tan solo debemos hacer lo siguiente, bajar el source y compilar o bien instalarlo con nuestra herramienta de control de paquetes como apt-get o similares. Como podemos ver, tenemos distintos paquetes adicionales para acceder a low level sockets, bases de datos, etc. que nos pueden interesar:

Selection_023

Nos disponemos a instalar CLISP, los ficheros de desarrollo y su documentacion:

# apt-get install clisp clisp-dev clisp-doc

Una vez lo tenemos instalado, ya podemos ejercutarlo y comenzar a probarlo de la siguiente manera desde dentro de emacs, aunque obviamente tambien podemos ejecutar el comando clisp desde consola. Primero debemos incluir la siguiente linea en nuestro .emacs:

(setq inferior-lisp-program «/usr/bin/clisp»)

Algunos de los keybindings importantes son los siguientes:

C-M-x : envia automaticamente el codigo lisp al interprete CLISP, lo evalua y muestra el resultado.

C-c C-l : lee un fichero, lo envia al interprete, lo compila y muestra el resultado.

C-x C-e : evalua la ultima s-expresion en lisp.

C-c C-d : muestra la tabla de simbolos en lisp.

C-c C-f : muestra la documentacion de lisp para dicha funcion.

Aqui podemos ver como vamos evaluando el codigo de un buffer en CLISP en la siguiente ventana directamente. Tambien podemos ver como podemos al mismo tiempo, escribir codigo sobre el interprete lisp si asi lo deseamos, asi que podemos combinar ambas opciones.

Selection_025

Ademas de ello, si nos equivocamos en la sintaxis, CLISP entrara en modo debug, para poder depurar el problema, si queremos salir de dicho nivel, podemos ejecutar :q o bien podemos ejecutar help para ver la lista de opciones para el debugger, algunas interesantes como :r para subir al anterior nivel.

COMMAND        ABBR     DESCRIPTION

Error          :e      imprime el ultimo mensaje de error
Inspect        :i       inspecciona el ultimo error
Abort          :a       aborta el siguiente input loop
Quit           :q       sale al nivel mas alto del input loop
Where          :w       inspecciona este frame
Up             :u       sube un frame arriba y lo inspecciona
Top            :t       va al frame de mas arriba y lo inspecciona
Down           :d       baja un frame abajo y lo inspecciona
Bottom         :b       baja al frame de mas abajo y lo inspecciona
Mode mode      :m       hace set del modo de backtrace

1= para todos los elementos

2= para todos los frames

3= solo frames lexicos

4= solo frames de EVAL y APPLY (por defecto)

5= solo frames de APPLY

Backtrace [mode [limite]] :bt  inspecciona el stack

Break+         :br+     Activa breakpoint en un frame EVAL
Break-         :br-     Desactiva breakpoint en un frame EVAL
Return value   :rt      deja un frame EVAL, prescribiendo los valores de retorno
The following restarts are available:
USE-VALUE      :R1      Usa un valor a ser usado en lugar del actual
ABORT          :R2      Aborta el loop principal

Aqui podemos ver un ejemplo de CLISP entrando en el debugger:

Selection_026

 


May 09 2013

Geiser en emacs: scheme

Tag: mediumoverdrive @ 9:33 am

Racket_logo Hace un tiempo comentabamos los distintos principales dialectos que existen en lisp y la forma de evaluar codigo. Sin embargo hoy nos centraremos en scheme, que en su dia ya explicamos como evaluar lisp. Principalmente se puede hacer de 2 formas, evaluando el buffer o expresiones escritas en el buffer, o bien de forma interactiva. Para evaluar en el buffer directamente podemos hacer: C-x C-e. Sin embargo, si queremos realizarlo de forma interactiva podemos instalar y configurar Geiser.

Primero descargamos Geiser, que no es mas que un wrapper para el compilador o compiladores de scheme:

$ git clone git://git.sv.gnu.org/geiser.git

Tambien debemos instalar el compilador en si mismo, generalmente tenemos 2 variantes, racket y guile. Las diferencias entre estos dos interpretes y compiladores se pueden encontrar en sus web oficiales. En mi caso uso Racket, anteriormente llamado PLT Scheme. La plataforma provee de la implementacion de racket language, incluyendo un sofisticado sistema run-time, diferentes bibliotecas, un compilador JIT, etc. Se provee del entorno llamado DrRacket (anteriormente llamado DrScheme) que esta escrito en racket en si mismo. Para instalar racket o guile hacemos lo siguiente:

# apt-get install racket

o

# apt-get install guile-2.0

Debemos anadir la siguiente configuracion a nuestro .emacs (en mi caso yo uso racket):

(load-file «~/geiser/elisp/geiser.el»)
(setq geiser-racket-binary «/usr/bin/racket»)

Ahora ya podemos lanzar M-x geiser y seleccionar seguidamente racket.

repls

Racket y GNU/Guile

repl-images

Un ejemplo de la potencia de racket

Probemos algo de codigo de scheme:

Selection_021

Ya lo tenemos listo, ahora ya podemos comenzar a jugar con scheme de manera interactiva dentro de emacs. Existe un listado completo de keybindings para geiser. Sin embargo, podemos emplear el menu que trae emacs para ver y usar los keybindings mas importantes o frecuentes:

geiser-mode

Y esto es todo, si quereis realmente jugar y aprender con scheme, podeis comprar posiblemente uno de los mejores, sino el mejor libro para aprender; «The little schemer». Anteriormente ya hablamos de un libro muy avanzado,; el SICP. Pero que realmente es un libro para aprender programacion en si, pero que usa scheme como lenguaje educacional.


May 09 2013

cscope + xcscope en emacs

Tag: mediumoverdrive @ 1:02 am

Para comenzar a usar xcscope, primero deberemos instalar cscope que es la herramienta de consola que se emplea para examinar codigo fuente. Cscope nos provee de herramientas tales como cscope-indexer que nos permitira generar tablas de simbolos de forma recursiva o no, con diferentes y multiples opciones, sobre nuestro proyecto.

# apt-get install cscope

Por supuesto podemos comenzar a usar cscope desde linea de comandos, para ver la lista completa de opciones podemos ejecutar:

$ cscope –help

Aunque estos son algunos de los argumentos mas tipicos:

-b : construye la referencia cruzada.

-R : crear la base de datos sobre un directorio de manera recursiva.

-v : modo detallado (verbose)

Xcscope es una feature para emacs que genera tablas de indices para ficheros fuente C y C++. Tambien es un programa cliente que conoce como generar dichas tablas para poder conocer donde se encuentra definido cierto simbolo, donde esta referenciado, etc.

Para usar xcscope realizaremos lo siguiente. Primero debemos bajar xcscope: Lo podeis descargar aqui. Y meter dicho fichero por ejemplo en ~/.emacs.d/xcscope.el

Despues de ello tan solo debemos poner lo siguiente en nuestro .emacs:

(load-file «~/.emacs.d/xcscope/xcscope.el»)
(require ‘xcscope)

Ademas de ello, podemos incluir algunos keybindings interesantes (yo lo tengo asignado en las teclas de funcion para evitar conflictos y tenerlo a mano):

(define-key global-map [(ctrl f3)] ‘cscope-set-initial-directory)

(define-key global-map [(ctrl f4)] ‘cscope-unset-initial-directory)

(define-key global-map [(ctrl f5)] ‘cscope-find-this-symbol)

(define-key global-map [(ctrl f6)] ‘cscope-find-global-definition)

(define-key global-map [(ctrl f7)] cscope-find-global-definition-no-prompting)

(define-key global-map [(ctrl f8)] ‘cscope-pop-mark)

(define-key global-map [(ctrl f9)] ‘cscope-next-symbol)

(define-key global-map [(ctrl f10)] ‘cscope-next-file)

(define-key global-map [(ctrl f11)] ‘cscope-prev-symbol)

(define-key global-map [(ctrl f12)] ‘cscope-prev-file)

(define-key global-map [(meta f9)] ‘cscope-display-buffer)

(define-key global-map [(meta f10)] ‘cscope-display-buffer-toggle)

Por supuesto existen keybidings por defecto, que pueden ser comodos para ciertos usuarios, el prefijo que se emplea es C-c s (y se debe estar en el modo adecuado visualizando codigo fuente obviamente) son los siguientes:

C-c s s : busca un simbolo

C-c s d : busca definicion global de un simbolo

C-c s g : busca un simbolo de manera global

C-c s G : busca un simbolo de manera global sin emplear el prompt

C-c s c : busca funciones que llaman dicha funcion

C-c s C : busca funciones que son llamadas desde una funcion

C-c s t : busca una cadena de texto

C-c s e : busca un patron regxp empleando egrep

C-c s f : busca un fichero

C-c s i : busca ficheros incluyendo el fichero header

Los siguientes keybindings se emplean para moverse entre los resultados:

C-c s b : muestra el buffer *cscope* donde se muestran todos los resultados.

C-c s B : muestra automaticamente el buffer *cscope* (toggle).

C-c s n : siguiente simbolo

C-c s N : siguiente fichero

C-c s p : simbolo anterior

C-c s P : fichero anterior

C-c s u : hace pop de la marca actual, es decir sale a un nivel superior de codigo a nivel de llamadas.

Los siguientes keybindings hacen referencia a settear y unsettear  la variable ‘cscope-initial-directory’, (localizacion donde se busca la base de datos para cscope):

C-c s a : hace set del directorio inicial

C-c s A : hace unset del directorio inicial

Los siguientes keybindings hacen referencia al mantenimiento de la base de datos de cscope:

C-c s L : crea la lista de fichero del indice

C-c s I : crea la lista y el indice

C-c s E : edita la lista de ficheros del indice

C-c s W : muestra donde (where) se encuentra el directorio para cscope

C-c s S : muestra donde (show) se encuentra el buffer del directorio cscope.

C-c s T : localiza este (tell) directorio del buffer de cscope

C-c s D : Hace dired the directorio del buffer de cscope

Una vez hecho esto, debemos generar la base de datos, para ello debemos cercionarnos que cscope-indexer esta en nuestro PATH, y que ademas tiene permisos de ejecucion. Notese la diferencia entre cscope y cscope-indexer, uno se emplea de manera interactiva (cscope) para consola y sin mediacion de ningun editor o entorno de por medio, mientras que el otro se emplea para generar simplemente los indices para luego utilizarlos donde sea (cscope-indexer).

Ahora podemos ejecutar cscope-indexer en nuestro directorio del proyecto:

$ cd dir_del_proyecto

$ cscope-indexer -r -v

Selection_019

Ahora ya tan solo nos queda comenzar a usar xcscope con los keybindings e indicarle donde se encuentra nuestro directorio inicial con la tabla de simbolos. Veamos un ejemplo de como queda el asunto:

Selection_020

Lo tipico es moverse en una parte de codigo, ponerse encima de la funcion llamada deseada, pulsar Ctrl+F5, moverse por ese codigo, volver a pulsar Ctrl+F5 en la funcion deseada, volver a ver el listado, movernos hasta la deseada mediante Ctrl+F9 y asi sucesivamente tantos niveles como deseemos, si queremos volver atras a nivel de stack, iriamos pulsando Ctrl+F8.

 


« Página anteriorPágina siguiente »