{"id":558,"date":"2014-03-03T01:31:35","date_gmt":"2014-03-02T23:31:35","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=558"},"modified":"2022-08-20T18:25:37","modified_gmt":"2022-08-20T16:25:37","slug":"configuracion-de-swank-servidor-lisp-y-emacs-como-cliente","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=558","title":{"rendered":"Configuracion de Swank (servidor Lisp) y Emacs (como cliente)"},"content":{"rendered":"<p>Swank (servidor Lisp) y Emacs (como cliente) puede ser altamente configurado, de manera que podemos desde elegir los estilos de comunicacion, comportamiento y hooks entre otras cosas.<\/p>\n<p style=\"text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=574\" rel=\"attachment wp-att-574\"><img loading=\"lazy\" decoding=\"async\" class=\"alignnone\" alt=\"2\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/2.png\" width=\"693\" height=\"564\" \/><\/a><\/p>\n<p style=\"text-align: center;\">Configuracion del grupo SLIME mediante customize<\/p>\n<p><strong><span style=\"color: #ff6600;\">Cliente Emacs<\/span><\/strong><\/p>\n<p>La parte de Emacs de SLIME puede ser configurada con el sistema <strong>customize<\/strong> de Emacs, mas concretamente mediante <strong>M-x customize-group-slime<\/strong>. Dicho sistema de customizacion se describe a si mismo, por lo que el tutorial de SLIME y tambien aqui, nos centraremos en aquellas partes mas importantes u oscuras que necesitasen clarificaciones, aqui algunas variables que se pueden modificar.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\"><strong>slime-truncate-lines <\/strong><\/span>: por defecto es &#8216;t&#8217;, lo cual garantiza que las lineas no sean cortadas en los backtraces, listados de apropos, etc.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\"><strong>slime-complete-symbol-function <\/strong><\/span>:\u00a0Se emplea para completar simbolos lisp, existen 3 posibles estilos: slime-simple-complete-symbol, slime-complete-symbol* y slime-fuzzy-complete-symbol.\u00a0El valor por defecto es slime-simple-complete-symbol, el cual completa en el estilo usual de emacs.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #008000;\"><strong>slime-filename-translations<\/strong><\/span> : Controla la traduccion de ficheros entre Emacs\u00a0 y el sistema Lisp. Esto es util si se ejecuta Emacs y Lisp en maquinas separadas las cuales no comparten un sistema de ficheros en comun o bien si se comparte el sistema de ficheros pero que tienen layouts differentes (como por ejemplo en SMB).<strong><br \/>\n<\/strong><\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #008000;\">slime-net-coding-system<\/span> <\/strong>: Para transmitir caracteres unicode entre Emacs y el sistema Lisp, es necesario configurar esta variable, por ejemplo como\u00a0\u00a0\u00a0 (setq slime-net-coding-system &#8216;utf-8-unix). Ademas, paa mostrar los caracteres unicode dbeemos disponer de fuentes apropiadas.<strong><br \/>\n<\/strong><\/p>\n<p style=\"padding-left: 30px;\">Hooks:<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #008000;\">slime-mode-hook<\/span><\/strong> : Este hook se ejecuta cada vez que el buffer entra en slime-mode. Ideal para configurar el buffer local, por ejemplo para activar slime-autodoc-mode.<strong><br \/>\n<\/strong><\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #008000;\">slime-connected-hook<\/span><\/strong> : Este hook se ejecuta cuando SLIME establece conexion con el servidor Lisp.<strong><br \/>\n<\/strong><\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #008000;\">sldb-hook<\/span><\/strong> : Se ejecuta despues de que SLDB sea invocado. Por\u00a0 ejemplo anadiendo sldb-print-condition a este hook hara que todas las condiciones debuggeadas con SLDB sean registradas en el buffer REPL.<strong><br \/>\n<\/strong><\/p>\n<p><strong><span style=\"color: #ff6600;\">Swank<\/span><\/strong><\/p>\n<p>Por otra parte, existe el lado de Lisp como servidor, conocido como \u00abSwank\u00bb, que ofrece multiples variables que pueden ser configuradas. El fichero de inicializacion es <strong>~\/.swank.lisp<\/strong> el cual es automaticamente evaluado en el arranque y puede ser usado para modificar el valor de estas variables.<\/p>\n<p style=\"padding-left: 30px;\">Estilo de comunicacion:<\/p>\n<p style=\"padding-left: 30px;\">La configuracion mas importante se encuentra en SWANK:*COMMUNICATION-STYLE*, el cual especifica el mecanismo por el cual Lisp lee y procesa los mensajes de protocol desde Emacs. La eleccion del estilo de comunicacion tiene una influencia global en las operaciones SLIME. Los diferentes estilos de comunicacion son los siguientes:<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #800080;\">NIL<\/span> : Simplemente hace loop del input de lectura del socket de comunicacion y da servicio a los eventos del protocolo SLIME.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #800080;\">:FD-HANDLER<\/span> : Utiliza el clasico estilo UNIX select() loop. Swank registra el socket de comunicacion con un framework de evento dispatch (e.g. SERVE-EVENT en CMUCL y SBCL) y recibe un callback cuando los datos estan disponibles.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #800080;\">:SIGIO<\/span> : Este estilo usa senales I\/O con un manejador de senales SIGIO. Lisp recibe peticiones de Emacs con una senal, causando la interrupcion sin importar que se este haciendo para asi dar servicio a la peticion. Esto permite a Emacs lanzar peticiones de manera concurrente.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #800080;\">:SPAWN<\/span> : Utiliza soporte multiproceso en el sistema Lisp para ejecutar cada peticion en un thread separado, pero en este caso no se emplean senales, ademas las peticiones son procesadas por Emacs y pueden ser ejecutadas de manera paralela.<\/p>\n<p>El estilo para el manejo de peticiones es elegido dependiendo del soporte de nuestro sistema Lisp. El orden general por preferencia es; :SPAWN, :SIGIO, :FD-HANDLER, NIL.<\/p>\n<p style=\"padding-left: 30px;\">Otras configuraciones:<\/p>\n<p style=\"padding-left: 30px;\">Las siguientes variables Lisp pueden ser configuradas mediante el fichero ~\/.swank.lisp:<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #800080;\">SWANK:*CONFIGURE-EMACS-INDENTATION*<\/span> : Controla el estilo de identacion para los argumentos &amp;body en las macros que son descubiertas y enviadas a Emacs. Esta opcion esta activada por defecto.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #800080;\">SWANK:*GLOBALLY-REDIRECT-IO*<\/span> : Cuando esta activada, causa que los streams standars (*standard-output*, etc) sean globalmente redireccionados al REPL en Emacs. Si el valor es NIL (que es por defecto) estos streams son solo redireccionados de manera temporal a Emacs usando bindings dinamicos mientras se manejan las peticiones. *standard-input* nunca es redireccionado a Emacs, debido a que puede interactuar de manera erronea con el REPL nativo de Lisp.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #800080;\">SWANK:*GLOBAL-DEBUGGER*<\/span> : Cuando es true (opcion por defecto) causa que *DEBUGGER-HOOK*\u00a0 sea globalmente configurado a SWANK:SWANK-DEBUGGER-HOOK y por lo tanto SLIME manejara todo el debugging en una imagen Lisp. Se utiliza para debugging en multithread y aplicaciones callback-driven.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #800080;\">SWANK:*SLDB-QUIT-RESTART*<\/span> : Nombra el reinicio que es invocado cuando se pulsa q (para sldb-quit) en SLDB. Para la evaluacion de peticiones SLIME esto es usado de manera incondicional para reiniciar y volver a un punto seguro. Ejemplo:\u00a0 (setf swank:*sldb-quit-restart* &#8216;sb-thread:terminate-thread)<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #800080;\">SWANK:*BACKTRACE-PRINTER-BINDINGS*<\/span>, <span style=\"color: #800080;\">SWANK:*MACROEXPAND-PRINTER-BINDINGS*<\/span>, <span style=\"color: #800080;\">SWANK:*SLDB-PRINTER-BINDINGS*<\/span>, <span style=\"color: #800080;\">SWANK:*SWANK-PPRINT-BINDINGS*<\/span> : Estas variables se emplean para configurar el printer en distintas situaciones. Por ejemplo para activar el pretty printer para el formato de los backtraces en SLDB podemos emplear:\u00a0 (push &#8216;(*print-pretty* . t) swank:*sldb-printer-bindings*).<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #800080;\">SWANK:*USE-DEDICATED-OUTPUT-STREAM*<\/span> : Esta variable controla el uso para hackear una eficiencia insegura cuando enviamos a la salida para impresion desde Lisp a Emacs. El valor por defecto es nil. Se recomienda no cambiar el valor de esta variable, ya que cuando es t, un socket separado se establece desde Lisp para enviar a la salida de impresion para Emacs, el cual es mas rapido que enviar la salida en los mensajes de protocolo a Emacs. Sin embargo, no esta garantizado el tiempo entre la salida de stream dedicada y la salida de mensajes de protocolo, por lo que la salida de un comando Lisp puede llegare antes o despues de los correspondientes resultados de REPL, o bien llegar en orden incorrecto, e incluso interferidos en el buffer REPL.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #800080;\">SWANK:*DEDICATED-OUTPUT-STREAM-PORT*<\/span> : Cuando *USE-DEDICATED-OUTPUT-STREAM* es t, el stream sera abierto en este puerto. El valor por defecto es 0, lo que significa que el stream sera abierto en un puerto aleatorio.<\/p>\n<p style=\"padding-left: 30px;\">SWANK:*LOG-EVENTS* : Configurando esta variable t causara que todos los mensajes de protocolos intercambiados con Emacs seran mostrados en *TERMINAL-IO*. Esto es util para debugging a bajo nivel y para observar como SLIME trabaja &#8216;on the wire&#8217;. La salida de *TERMINAL-IO* puede ser mostrada en nuestro propio listener de nuestro sistema Lisp, usualmente en el buffer *inferior-lisp*.<\/p>\n<p style=\"padding-left: 30px; text-align: center;\"><a href=\"https:\/\/www.blackhats.es\/wordpress\/?attachment_id=573\" rel=\"attachment wp-att-573\"><img loading=\"lazy\" decoding=\"async\" alt=\"1\" src=\"https:\/\/www.blackhats.es\/wordpress\/wp-content\/uploads\/2014\/03\/1.png\" width=\"695\" height=\"562\" \/><\/a><\/p>\n<p style=\"text-align: center;\">Ejemplo de configuracion del puerto para el servidor de Swank.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Swank (servidor Lisp) y Emacs (como cliente) puede ser altamente configurado, de manera que podemos desde elegir los estilos de comunicacion, comportamiento y hooks entre otras cosas. Configuracion del grupo SLIME mediante customize Cliente Emacs La parte de Emacs de SLIME puede ser configurada con el sistema customize de Emacs, mas concretamente mediante M-x customize-group-slime. [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[297],"tags":[309,307,67,8,66,173,308,71,306],"class_list":["post-558","post","type-post","status-publish","format-standard","hentry","category-advanced","tag-client","tag-cliente","tag-elisp","tag-emacs","tag-lisp","tag-server","tag-servidor","tag-slime","tag-swank"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/558"}],"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=558"}],"version-history":[{"count":9,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/558\/revisions"}],"predecessor-version":[{"id":746,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/558\/revisions\/746"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=558"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=558"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=558"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}