{"id":496,"date":"2013-05-09T15:10:17","date_gmt":"2013-05-09T13:10:17","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=496"},"modified":"2022-08-20T18:25:37","modified_gmt":"2022-08-20T16:25:37","slug":"clisp-en-emacs","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=496","title":{"rendered":"CLISP en emacs"},"content":{"rendered":"<p><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=497\" rel=\"attachment wp-att-497\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-497 alignleft\" alt=\"clisp\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/clisp.png\" width=\"48\" height=\"48\" \/><\/a>\u00a0CLISP 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 <a href=\"http:\/\/www.clisp.org\/\" target=\"_blank\" rel=\"noopener\">pagina oficial de CLISP<\/a>.<\/p>\n<p>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:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=498\" rel=\"attachment wp-att-498\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-498 aligncenter\" alt=\"Selection_023\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_023.png\" width=\"653\" height=\"458\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_023.png 653w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_023-300x210.png 300w\" sizes=\"(max-width: 653px) 100vw, 653px\" \/><\/a><\/p>\n<p>Nos disponemos a instalar CLISP, los ficheros de desarrollo y su documentacion:<\/p>\n<p style=\"padding-left: 30px;\"># <strong>apt-get install clisp clisp-dev clisp-doc<\/strong><\/p>\n<p>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:<\/p>\n<p style=\"padding-left: 30px;\"><em>(setq inferior-lisp-program \u00ab\/usr\/bin\/clisp\u00bb)<\/em><\/p>\n<p>Algunos de los keybindings importantes son los siguientes:<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-M-x<\/strong> : envia automaticamente el codigo lisp al interprete CLISP, lo evalua y muestra el resultado.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-l<\/strong> : lee un fichero, lo envia al interprete, lo compila y muestra el resultado.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-x C-e<\/strong> : evalua la ultima s-expresion en lisp.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-d<\/strong> : muestra la tabla de simbolos en lisp.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-f<\/strong> : muestra la documentacion de lisp para dicha funcion.<\/p>\n<p>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.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=502\" rel=\"attachment wp-att-502\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-502 aligncenter\" alt=\"Selection_025\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_025.png\" width=\"685\" height=\"595\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_025.png 685w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_025-300x260.png 300w\" sizes=\"(max-width: 685px) 100vw, 685px\" \/><\/a><\/p>\n<p>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 <strong>:q<\/strong> o bien podemos ejecutar <strong>help<\/strong> para ver la lista de opciones para el debugger, algunas interesantes como <strong>:r<\/strong> para subir al anterior nivel.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\">COMMAND\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 ABBR\u00a0\u00a0\u00a0\u00a0 DESCRIPTION<\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\">Error\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :e\u00a0\u00a0\u00a0\u00a0\u00a0 imprime el ultimo mensaje de error<\/span><br \/>\n<span style=\"color: #008000;\"> Inspect\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :i\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 inspecciona el ultimo error<\/span><br \/>\n<span style=\"color: #008000;\"> Abort\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :a\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 aborta el siguiente input loop<\/span><br \/>\n<span style=\"color: #008000;\"> Quit\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :q\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sale al nivel mas alto del input loop<\/span><br \/>\n<span style=\"color: #008000;\"> Where\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :w\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 inspecciona este frame<\/span><br \/>\n<span style=\"color: #008000;\"> Up\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :u\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 sube un frame arriba y lo inspecciona<\/span><br \/>\n<span style=\"color: #008000;\"> Top\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :t\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 va al frame de mas arriba y lo inspecciona<\/span><br \/>\n<span style=\"color: #008000;\"> Down\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :d\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 baja un frame abajo y lo inspecciona<\/span><br \/>\n<span style=\"color: #008000;\"> Bottom\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :b\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 baja al frame de mas abajo y lo inspecciona<\/span><br \/>\n<span style=\"color: #008000;\"> Mode mode\u00a0\u00a0\u00a0\u00a0\u00a0 :m\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 hace set del modo de backtrace<\/span><\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #008000;\">1= para todos los elementos<\/span><\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #008000;\">2= para todos los frames<\/span><\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #008000;\">3= solo frames lexicos<\/span><\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #008000;\">4= solo frames de EVAL y APPLY (por defecto)<\/span><\/p>\n<p style=\"padding-left: 60px;\"><span style=\"color: #008000;\">5= solo frames de APPLY<\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\">Backtrace [mode [limite]] :bt\u00a0 inspecciona el stack<\/span><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\">Break+\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :br+\u00a0\u00a0\u00a0\u00a0 Activa breakpoint en un frame EVAL<\/span><br \/>\n<span style=\"color: #008000;\"> Break-\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :br-\u00a0\u00a0\u00a0\u00a0 Desactiva breakpoint en un frame EVAL<\/span><br \/>\n<span style=\"color: #008000;\"> Return value\u00a0\u00a0 :rt\u00a0\u00a0\u00a0\u00a0\u00a0 deja un frame EVAL, prescribiendo los valores de retorno<\/span><br \/>\n<span style=\"color: #008000;\"> The following restarts are available:<\/span><br \/>\n<span style=\"color: #008000;\"> USE-VALUE\u00a0\u00a0\u00a0\u00a0\u00a0 :R1\u00a0\u00a0\u00a0\u00a0\u00a0 Usa un valor a ser usado en lugar del actual<\/span><br \/>\n<span style=\"color: #008000;\"> ABORT\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0\u00a0 :R2\u00a0\u00a0\u00a0\u00a0\u00a0 Aborta el loop principal<\/span><\/p>\n<p>Aqui podemos ver un ejemplo de CLISP entrando en el debugger:<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=501\" rel=\"attachment wp-att-501\"><img loading=\"lazy\" decoding=\"async\" class=\"size-full wp-image-501 aligncenter\" alt=\"Selection_026\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_026.png\" width=\"689\" height=\"597\" srcset=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_026.png 689w, https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2013\/05\/Selection_026-300x259.png 300w\" sizes=\"(max-width: 689px) 100vw, 689px\" \/><\/a><\/p>\n<p>&nbsp;<\/p>\n","protected":false},"excerpt":{"rendered":"<p>\u00a0CLISP 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 [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[256],"tags":[139,69,8,66],"class_list":["post-496","post","type-post","status-publish","format-standard","hentry","category-medium","tag-clisp","tag-common-lisp","tag-emacs","tag-lisp"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/496"}],"collection":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/users\/3"}],"replies":[{"embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcomments&post=496"}],"version-history":[{"count":8,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/496\/revisions"}],"predecessor-version":[{"id":751,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/496\/revisions\/751"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=496"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=496"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=496"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}