{"id":52,"date":"2009-03-09T04:45:07","date_gmt":"2009-03-09T02:45:07","guid":{"rendered":"http:\/\/www.blackhats.es\/wordpress\/?p=52"},"modified":"2022-08-20T18:26:12","modified_gmt":"2022-08-20T16:26:12","slug":"lisp-en-emacs","status":"publish","type":"post","link":"https:\/\/www.blackhats.es\/wordpress\/?p=52","title":{"rendered":"Lisp en Emacs"},"content":{"rendered":"<p>Existen distintos dialectos de emacs, por lo que disponemos de distintos modos en lisp.<\/p>\n<p><img decoding=\"async\" class=\"alignleft\" style=\"float: left;\" src=\"http:\/\/farm1.static.flickr.com\/61\/213466641_926a862aac.jpg\" alt=\"lisp\" \/><\/p>\n<p><strong>M-x emacs-lisp-mode<\/strong> : usado para editar emacs lisp\/elisp (<span style=\"color: #ff6600;\">.emacs<\/span> o <span style=\"color: #ff6600;\">.el<\/span>)<br \/>\n<strong>M-x lisp-mode<\/strong> : usado para editar codigo common lisp (<span style=\"color: #ff6600;\">.l<\/span>, <span style=\"color: #ff6600;\">.lsp<\/span> o <span style=\"color: #ff6600;\">.lisp<\/span>)<br \/>\n<strong>M-x lisp-interaction-mode<\/strong> : usado para editar y ejecutar <span style=\"color: #ff6600;\">elisp<\/span>.<\/p>\n<p>Existen otros dialectos, entre ellos <strong>scheme<\/strong> (que es minimalista) o <strong>CL<\/strong> (common lisp, que es an\u00e1logo a scheme). Tambi\u00e9n decir que existe alguna implementaci\u00f3n curiosa llamada <strong>sbcl<\/strong> (steal bank common lisp) que es un lisp bastante peculiar, el cual se puede usar bajo slime en emacs, aunque esto sobrepasa el objetivo de este art\u00edculo. Cambiando de tercio, decir que muchos keystrokes estan asociados a <strong>S-expressiones<\/strong> (expresiones simb\u00f3licas) que se refiere a cualquier expresi\u00f3n simbolica correcta (n\u00famero, s\u00edmbolo, variable, lista, etc). En el caso de <strong>listas<\/strong> son S-expressiones especiales, y <strong>defun<\/strong> (definici\u00f3n de funciones) son casos especiales de listas.<\/p>\n<p>He dividido el art\u00edculo en dos partes, refiriendome a common lisp y scheme en general, o bien a casos particulares de <strong>emacs lisp<\/strong><\/p>\n<p><strong><span style=\"color: #0000ff;\">Common lisp y scheme general<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #993366;\"><strong>S-exp<\/strong><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-M-b<\/strong> : &#8216;<span style=\"color: #0000ff;\">backward-sexp<\/span>&#8216;; se desplaza a la S-exp anterior.<br \/>\n<strong>C-M-f<\/strong> : &#8216;<span style=\"color: #0000ff;\">forward-sexp<\/span>&#8216;; se desplaza a la siguiente S-exp.<br \/>\n<strong>C-M-t<\/strong> : &#8216;<span style=\"color: #0000ff;\">transpose-sexps<\/span>&#8216;; transpone 2 S-exps.<br \/>\n<strong>C-M-@<\/strong> : &#8216;<span style=\"color: #0000ff;\">mark-sexp<\/span>&#8216;; pone la marca al final de la actual S-exp y el cursor al principio.<br \/>\n<strong>C-M-k<\/strong> : &#8216;<span style=\"color: #0000ff;\">kill-sexp<\/span>&#8216;; elimina la S-exp.<br \/>\n<strong>(sin keystroke asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">backward-kill-sexp<\/span>&#8216;; elimina la anterior S-exp.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #993366;\"><strong>Listas<\/strong><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-M-n<\/strong> : &#8216;<span style=\"color: #0000ff;\">forward-list<\/span>&#8216;; siguiente lista.<br \/>\n<strong>C-M-p<\/strong> : &#8216;<span style=\"color: #0000ff;\">backward-list<\/span>&#8216;; anterior lista.<br \/>\n<strong>C-M-d<\/strong> : &#8216;<span style=\"color: #0000ff;\">down-list<\/span>&#8216;; se desplaza hacia delante un nivel hacia abajo de los par\u00e9ntesis.<br \/>\n<strong>(sin keystroke asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">up-list<\/span>&#8216;; se desplaza hacia delante un nivel de los par\u00e9ntesis.<br \/>\n<strong>C-M-u<\/strong> : &#8216;<span style=\"color: #0000ff;\">backward-up-list<\/span>&#8216;; se desplaza hacia atr\u00e1s un nivel de los par\u00e9ntesis.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #993366;\"><strong>Funciones<\/strong><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-M-a<\/strong> : &#8216;<span style=\"color: #0000ff;\">beginning-of-defun<\/span>&#8216;; inicio de la definici\u00f3n de funci\u00f3n.<br \/>\n<strong>C-M-e<\/strong> : &#8216;<span style=\"color: #0000ff;\">end-of-defun<\/span>&#8216;; fin de la definici\u00f3n de funci\u00f3n.<br \/>\n<strong>C-M-h<\/strong> : &#8216;<span style=\"color: #0000ff;\">mark-defun<\/span>&#8216;; marca una definici\u00f3n de funci\u00f3n.<\/p>\n<p style=\"padding-left: 30px;\">Los keystrokes b\u00e1sicos empleados en lisp son;<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #993366;\"><strong>Para indentaci\u00f3n:<\/strong><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>TAB<\/strong> : para indentar<br \/>\n<strong>C-j <\/strong>: introduce el salto de l\u00ednea y adicionalmente <strong>TAB<\/strong> para indentar la siguiente.<br \/>\n<strong>C-M-q<\/strong> : indenta el bloque m\u00e1s interno de la expresi\u00f3n actual, es decir, de la s-expresi\u00f3n.<\/p>\n<p style=\"padding-left: 30px;\"><span style=\"color: #993366;\"><strong>Para comentarios:<\/strong><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>M-; <\/strong>: A\u00f1ade un comentario al final de linea, siempre despu\u00e9s de cualquier instrucci\u00f3n de c\u00f3digo. Si se realiza en un comentario, se desplaza al inicio del mismo, justo detr\u00e1s del \u00faltimo car\u00e1cter delimitador de comentario que es &#8216;<strong>;<\/strong>&#8216; o &#8216;<strong>;;<\/strong>&#8216;. Si se realiza en una l\u00ednea en blanco, a\u00f1ade &#8216;<strong>;;<\/strong>&#8216;.<br \/>\n<strong>M-j<\/strong> : Si se realiza en medio de un comentario, divide el comentario actual en varias l\u00edneas con el forma correcto. No se debe usar en la parte de c\u00f3digo, ya que no tiene un formato correcto.<br \/>\n<strong>(sin keystroke asociada)<\/strong> : &#8216;<span style=\"color: #0000ff;\">kill-comment<\/span>&#8216;; elimina un comentario.<\/p>\n<p><span style=\"color: #0000ff;\"><strong>Emacs lisp espec\u00edfico<\/strong><\/span><\/p>\n<p style=\"padding-left: 30px;\"><strong>C-M-x<\/strong> : &#8216;<span style=\"color: #0000ff;\">eval-defun<\/span>&#8216;; eval\u00faa la definici\u00f3n de funci\u00f3n.<br \/>\n<strong>M-TAB<\/strong> : &#8216;<span style=\"color: #0000ff;\">complete-lisp-symbol<\/span>&#8216;; completa el s\u00edmbolo seg\u00fan los s\u00edmbolos ya conocidos.<br \/>\n<strong>C-j<\/strong> : &#8216;<span style=\"color: #0000ff;\">newline-and-indent<\/span>&#8216;; crea un salto de l\u00ednea (dividiendo la l\u00ednea) e indenta la nueva l\u00ednea respecto la anterior.<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #993366;\">Modo mayor y menor lisp<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\">Es posible trabajar con el lisp-mode como un modo mayor en vez de menor, para ello tenemos el siguiente juego de keystrokes:<\/p>\n<p style=\"padding-left: 30px;\"><strong>C-c C-z <\/strong>: &#8216;<span style=\"color: #0000ff;\">switch-to-lisp<\/span>&#8216;; cambia el modo lisp para que se ejecute como un modo menor en lugar de mayor.<br \/>\n<strong>C-M-x <\/strong>: &#8216;<span style=\"color: #0000ff;\">lisp-eval-defun<\/span>&#8216;; eval\u00faa la definici\u00f3n de funci\u00f3n en modo menor.<\/p>\n<p style=\"padding-left: 30px;\"><strong><span style=\"color: #993366;\">Otra forma de evaluar s-expressiones<\/span><\/strong><\/p>\n<p style=\"padding-left: 30px;\"><strong>M-:<\/strong> : &#8216;<span style=\"color: #0000ff;\">eval-expression<\/span>&#8216;; eval\u00faa una expresi\u00f3n dada al instante via modeline.<br \/>\n<strong>C-x C-e<\/strong> : &#8216;<span style=\"color: #0000ff;\">lisp-eval-last-sexp<\/span>&#8216;; eval\u00faa la \u00faltima s-expresi\u00f3n en lisp.<\/p>\n<p>Antes de finalizar, decir que se puede acceder a la ayuda de funciones mediante <strong>C-h f<\/strong> que invoca &#8216;<span style=\"color: #0000ff;\">describe-function<\/span>&#8216; y ahi buscar una funci\u00f3n que nos interese, que adem\u00e1s es posible acceder al c\u00f3digo y ver como esta implementado mirando el fichero donde este implementado (ya que existe un enlace a la funci\u00f3n del fichero fuente en el que se encuentre). Esto se puede reconocer porque suele ir precedido de <em><span style=\"color: #3366ff;\">function-name is an interactive compiled Lisp function in &#8216;file.el&#8217;<\/span><\/em>.<\/p>\n<p style=\"text-align: center;\"><img decoding=\"async\" class=\"aligncenter\" src=\"http:\/\/www.lisperati.com\/casting-spels-emacs\/images\/lisp-alien-logo.png\" alt=\"lisplogo\" \/><\/p>\n<p style=\"text-align: left;\">Existen otros modos y entornos dentro de emacs m\u00e1s interesantes y potentes como slime, pero ello conllevar\u00e1 un art\u00edculo entero.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Existen distintos dialectos de emacs, por lo que disponemos de distintos modos en lisp. M-x emacs-lisp-mode : usado para editar emacs lisp\/elisp (.emacs o .el) M-x lisp-mode : usado para editar codigo common lisp (.l, .lsp o .lisp) M-x lisp-interaction-mode : usado para editar y ejecutar elisp. Existen otros dialectos, entre ellos scheme (que es [&hellip;]<\/p>\n","protected":false},"author":3,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[17],"tags":[69,67,8,66,70,68,71],"class_list":["post-52","post","type-post","status-publish","format-standard","hentry","category-basic","tag-common-lisp","tag-elisp","tag-emacs","tag-lisp","tag-sbcl","tag-scheme","tag-slime"],"_links":{"self":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/52"}],"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=52"}],"version-history":[{"count":1,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/52\/revisions"}],"predecessor-version":[{"id":788,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=\/wp\/v2\/posts\/52\/revisions\/788"}],"wp:attachment":[{"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fmedia&parent=52"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Fcategories&post=52"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/www.blackhats.es\/wordpress\/index.php?rest_route=%2Fwp%2Fv2%2Ftags&post=52"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}