{"id":534,"date":"2013-05-21T22:49:15","date_gmt":"2013-05-21T20:49:15","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=534"},"modified":"2022-08-20T18:25:37","modified_gmt":"2022-08-20T16:25:37","slug":"slime-uso-basico-y-medio","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=534","title":{"rendered":"SLIME: uso basico y medio"},"content":{"rendered":"<p>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.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Evaluacion<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\">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.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-x C-e<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-eval-last-expression<\/span>&#8216; ; evalua la expresion antes del cursor.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-M-x<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-eval-defun<\/span>&#8216; ; evalua el buffer a modo toplevel.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c :<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-interactive-eval<\/span>&#8216; ; evalua la expresion leida desde el minibuffer.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-r<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-eval-region<\/span>&#8216; ; evalua la region.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-p<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-pprint-eval-last-expression<\/span>&#8216; ; evalua la expresion anterior e imprime el resultado en un nuevo buffer.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c E<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-edit-value<\/span>&#8216;; edita el valor en un nuevo buffer con la forma *Edit &lt;form&gt;*. El valor es insertado en un buffer temporal para la edicion y asignado en Lisp para cuando sea committeado mediante C-c C-c.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-x M-e<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-eval-last-expression-display-output<\/span>&#8216; ; 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.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-u<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-undefine-function<\/span>&#8216; ; un-define una funcion, con fmakunbound, para el simbolo que se encuentra en el punto actual.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Compilacion<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #000000;\"><strong>C-c C-c<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-compile-defun<\/span>&#8216; ; 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.<br \/>\n<\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-k<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-compile-and-load-file<\/span>&#8216; ; Compila y carga el fichero fuente del buffer actual. Si el paso de compilacion falla, el fichero no sera cargado.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c M-k<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-compile-file<\/span>&#8216; ; Compila pero no carga el fichero fuente del buffer actual.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-l<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-load-file<\/span>&#8216; ; Carga un fichero Lisp. Este comando usa la funcion LOAD de CL.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asignada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-compile-region<span style=\"color: #000000;\">&#8216;<\/span><\/span> ; Compila la region seleccionada.<\/p>\n<p style=\"padding-left: 30px;\"><strong>M-n<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-next-note<\/span>&#8216; ; Mueve el puntero a la siguiente nota de compilacion y muestra dicha nota.<\/p>\n<p style=\"padding-left: 30px;\"><strong>M-p<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-previous-note<\/span>&#8216; ; Mueve el puntero a la anterior nota de compilacion y muestra dicha nota.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c M-c<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-remove-notes<\/span>&#8216; ; Elimina todas las anotaciones del buffer.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-x `<\/strong> : &#8216;<span style=\"color: #0000ff;\">next-error<\/span>&#8216; ; Visita el siguiente mensaje de error. (No es realmente un comando SLIME).<\/p>\n<p><strong><span style=\"color: #ff6600;\">Completado<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #000000;\"><strong>M-TAB<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-complete-symbol<\/span>&#8216; ; 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.<br \/>\n<\/span><\/p>\n<p><strong><span style=\"color: #ff6600;\">Busqueda de definiciones o Meta-Point<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #000000;\"><strong>M-.<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-edit-definition<\/span>&#8216; ; Se desplaza a la definicion del simbolo del puntero actual.<br \/>\n<\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>M-,<\/strong> o <strong>M-*<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-pop-find-definition-stack<\/span>&#8216; ; Se desplaza hacia atras donde M-. fue invocado. Esto da un multi-nivel de backtracking cuando M-. haya sido usado en distintas ocasiones.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-x 4 . :<\/strong> &#8216;<span style=\"color: #0000ff;\">slime-edit-definition-other-window<\/span>&#8216; ; Como slime-edit-definition, pero cambia a otra ventana para editar la definicion.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-x 5 . :<\/strong> &#8216;<span style=\"color: #0000ff;\">slime-edit-definition-other-frame<\/span>&#8216; ; Como slime-edit-definition, pero cambia a otro frame para editar la definicion.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybiding asignada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-edit-definition-with-etags<\/span>&#8216; ; Emplea una tabla ETAGS para encontrar la definicion en el punto actual.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Documentacion<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #000000;\"><strong>SPC<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-space<\/span>&#8216; ; Inserta un espacio, pero al mismo tiempo busca y muestra la lista de argumentos de la funcion en el punto actual.<br \/>\n<\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-d d<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-describe-symbol<\/span>&#8216; ; Describe el simbolo en el punto actual.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-f<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-describe-function<\/span>&#8216; ; Describe la funcion en el punto actual.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-d a<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-apropos<\/span>&#8216; ; 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.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-d z<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-apropos-all<\/span>&#8216; ; Como slime-apropos pero buscatam bien por defecto en los simbolos internos.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-d p<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-apropos-package<\/span>&#8216; ; Muestra los resultados de apropos de todos los simbolos de un paquete. Este comando es empleado para buscar un paquete a alto nivel.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-d h<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-hyperspec-lookup<\/span>&#8216; ; Busca el simbolo en el punto actual en la Hyperspec Common Lisp.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-d ~<\/strong> : &#8216;<span style=\"color: #0000ff;\">common-lisp-hyperspec-format<\/span>&#8216; ; Busca un caracter de formato en la Hyperspec Common Lisp.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Referencia cruzada (cross-reference)<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\">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.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #000000;\"><strong>C-c C-w c<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-who-calls<\/span>&#8216; ; Muestra las funciones que llaman a la funcion actual.<br \/>\n<\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-w w<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-calls-who<\/span>&#8216; ; Muestra las funciones que son llamadas desde la funcion actual.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-w r<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-who-references<\/span>&#8216; ; Muestra las referencias a la variable global.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-w b<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-who-binds<\/span>&#8216; ; Muestra los bindings a la variable global.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-w s<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-who-sets<\/span>&#8216; ; Muestra las tareas a la variable global.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-w m<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-who-macroexpands<\/span>&#8216; ; Muestra expansiones de una macro.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybiding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-who-specializes<\/span>&#8216; ; Muestra todos los metodos conocidos especializados en una clase.<\/p>\n<p style=\"padding-left: 30px;\">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.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c &lt;<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-list-callers<\/span>&#8216; ; Lista las funciones que llaman.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c &gt;<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-list-callees<\/span>&#8216; ; Lista las funciones que son llamadas.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Expansion de macros<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-m<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-macroexpand-1<\/span>&#8216; ; Hace expansion de macro de la expresion en el punto actual. Si es invocado con argumentos, usa macroexpand en lugar de macroexpand-1.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c M-m<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-macroexpand-all<\/span>&#8216; ; Expande la macro completamente de la expresion en el punto actual.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-compiler-macroexpand-1<\/span>&#8216; ; Muestra la expansion macro del compilador de una s-expression en el punto actual.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-compiler-macroexpand<\/span>&#8216; ; Repetidamente expande macros del compilador de una s-expression en el punto actual.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Desensamblado<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c M-d<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-disassemble-symbol<\/span>&#8216; ; Desensambla la definicion de la funcion de un simbolo en el punto actual.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-t<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-toggle-trace-fdefinition<\/span>&#8216; ; 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.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-untrace-all<\/span>&#8216; ; Elimina las trazas para todas las funciones.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Abortaje y recuperacion<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-b<\/strong> : &#8216;slime-interrupt&#8217; ; Interrumpe Lisp (envia SIGINT).<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-restart-inferior-lisp<\/span>&#8216; ; Reinicia el proceso inferior-lisp.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c ~<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-sync-package-and-default-directory<\/span>&#8216; ; Sincroniza el paquete actual y el directorio de trabajo desde Emacs a Lisp.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c M-p :<\/strong> &#8216;<span style=\"color: #0000ff;\">slime-repl-set-package<\/span>&#8216; ; Establece el paquete actual del REPL.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-cd<\/span>&#8216; ; Establece el directorio actual del proceso Lisp. Esto ademas cambia el directorio actual del buffer REPL.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-pwd<\/span>&#8216; ; Muestra el directorio actual del proceso Lisp.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Inspeccion<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\">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.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c I<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-inspect<\/span>&#8216; ; Inspecciona el valor de una expresion insertada en el minibuffer.<\/p>\n<p style=\"padding-left: 30px;\"><strong>RET<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-inspector-operate-on-point<\/span>&#8216; ; 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.<\/p>\n<p style=\"padding-left: 30px;\"><strong>d<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-inspector-describe<\/span>&#8216; ; Describe el slot en el punto actual.<\/p>\n<p style=\"padding-left: 30px;\"><strong>v<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-inspector-toggle-verbose<\/span>&#8216; ; Hace toggle entre el modo verbose (detallado) y terse (conciso). El valor por defecto viene determinado por swank:*inspector-verbose*.<\/p>\n<p style=\"padding-left: 30px;\"><strong>l<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-inspector-pop<\/span>&#8216; ; Se desplaza hacia el objeto anterior. (De vuelta desde RET).<\/p>\n<p style=\"padding-left: 30px;\"><strong>n<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-inspector-next<\/span>&#8216; ; La inversa de l.<\/p>\n<p style=\"padding-left: 30px;\"><strong>q<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-inspector-quit<\/span>&#8216; ; Sale del buffer inspector.<\/p>\n<p style=\"padding-left: 30px;\"><strong>M-RET<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-inspector-copy-down<\/span>&#8216; ; Almacena el valor bajo el punto actual en la variable *. Este puede ser entonces usado para el acceso al objeto en el REPL.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Profiling<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-toggle-profile-fdefinition<\/span>&#8216; ; Hace toggle de profiling de una funcion.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-profile-package<\/span>&#8216; ; Hace profiling de todas las funciones de un paquete.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-unprofile-all<\/span>&#8216; ; Elimina el profiling de todas las funciones.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-profile-report<\/span>&#8216; ; Realiza un reporte de los datos del profiler.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-profile-reset<\/span>&#8216; ; Resetea los datos del profiler.<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybinding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-profiled-functions<\/span>&#8216; ; Muestra la lista de las funciones actuales incluidas en el profiler.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Comandos shadowed<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-a, M-x slime-nop<\/strong> : Estos comandos son ocultos desde inf-lisp.<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-v, M-x slime-nop<\/strong> : Estos comandos son ocultos desde inf-lisp.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Indentacion semantica<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\">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 &amp;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:<\/p>\n<p style=\"padding-left: 60px;\">(swank:print-indentation-lossage)<\/p>\n<p style=\"padding-left: 30px;\">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.<\/p>\n<p style=\"padding-left: 30px;\">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:<\/p>\n<p style=\"padding-left: 30px;\"><strong>(sin keybiding asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">slime-update-indentation<\/span>&#8216; ; Fuerza todos los simbolos a ser escaneados para la informacion de indentacion.<\/p>\n<p><strong><span style=\"color: #ff6600;\">Fontificacion condicional del reader<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\">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.<\/p>\n<p>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.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>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 [&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":[248,69,8,270,258,271,66,269,71],"class_list":["post-534","post","type-post","status-publish","format-standard","hentry","category-medium","tag-cl","tag-common-lisp","tag-emacs","tag-entorno-de-desarrollo","tag-environment","tag-ide","tag-lisp","tag-mode","tag-slime"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/534"}],"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=534"}],"version-history":[{"count":8,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/534\/revisions"}],"predecessor-version":[{"id":748,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/534\/revisions\/748"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=534"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=534"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=534"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}