summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDavid Arroyo Menéndez <davidam@gmail.com>2026-03-02 14:25:07 +0100
committerDavid Arroyo Menéndez <davidam@gmail.com>2026-03-02 14:25:07 +0100
commit159790f1daaaa9bbea67f38ab837d8d689f6c304 (patch)
treefecd3340e0748cb06aa739e37d0aebc9737c57f5
parent8f0d7537e1ffe91d6d96083aa613b81b1171f0aa (diff)
deleting object files: emacs-lisp-intro-es.pdf emacs-lisp-intro-es.html
-rw-r--r--emacs-lisp-intro-es.html26359
-rw-r--r--emacs-lisp-intro-es.pdfbin1031086 -> 0 bytes
2 files changed, 0 insertions, 26359 deletions
diff --git a/emacs-lisp-intro-es.html b/emacs-lisp-intro-es.html
deleted file mode 100644
index d441658..0000000
--- a/emacs-lisp-intro-es.html
+++ /dev/null
@@ -1,26359 +0,0 @@
-<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
-<html>
-<!-- Esto es una Introduccio'n a la Programacio'n en Emacs Lisp,
-para personas que no son programadoras.
-Traducido desde la edicio'n 3.10.
-Copyright (C) 2015 Libremanuals.
-
-
-Publicado por el:
-
-
-Libremanuals, http://www.libremanuals.net/
-
-
-
-ISBN: 978-84-608-5935-2
-
-Permission is granted to copy, distribute and/or modify this document under
-the terms of the GNU Free Documentation License, Version 1.3 or any later
-version published by the Free Software Foundation; there being no Invariant
-Section, with the Front-Cover Texts being "A GNU Manual", and with the
-Back-Cover Texts as in (a) below. A copy of the license is included in the
-section entitled "GNU Free Documentation License".
-
-(a) The FSF's Back-Cover Text is: "You have the freedom to copy and modify
-this GNU manual. Buying copies from the FSF supports it in developing GNU
-and promoting software freedom."
- -->
-<!-- Created on el 28 febrero 2026 by texi2html 5.0
-texi2html was written by:
- Lionel Cons <Lionel.Cons@cern.ch> (original author)
- Karl Berry <karl@freefriends.org>
- Olaf Bachmann <obachman@mathematik.uni-kl.de>
- and many others.
-Maintained by: Many creative people.
-Send bugs and suggestions to <texi2html-bug@nongnu.org>
--->
-<head>
-<title>Programaci&oacute;n en Emacs Lisp</title>
-
-<meta name="description" content="Programaci&oacute;n en Emacs Lisp">
-<meta name="keywords" content="Programaci&oacute;n en Emacs Lisp">
-<meta name="resource-type" content="document">
-<meta name="distribution" content="global">
-<meta name="Generator" content="texi2html 5.0">
-<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
-<style type="text/css">
-<!--
-a.summary-letter {text-decoration: none}
-blockquote.smallquotation {font-size: smaller}
-div.display {margin-left: 3.2em}
-div.example {margin-left: 3.2em}
-div.lisp {margin-left: 3.2em}
-div.smalldisplay {margin-left: 3.2em}
-div.smallexample {margin-left: 3.2em}
-div.smalllisp {margin-left: 3.2em}
-pre.display {font-family: serif}
-pre.format {font-family: serif}
-pre.menu-comment {font-family: serif}
-pre.menu-preformatted {font-family: serif}
-pre.smalldisplay {font-family: serif; font-size: smaller}
-pre.smallexample {font-size: smaller}
-pre.smallformat {font-family: serif; font-size: smaller}
-pre.smalllisp {font-size: smaller}
-span.nocodebreak {white-space:pre}
-span.nolinebreak {white-space:pre}
-span.roman {font-family:serif; font-weight:normal}
-span.sansserif {font-family:sans-serif; font-weight:normal}
-ul.no-bullet {list-style: none}
--->
-</style>
-
-
-</head>
-
-<body lang="es" bgcolor="#FFFFFF" text="#000000" link="#0000FF" vlink="#800080" alink="#FF0000">
-
-<br>
-<br>
-<br>
-<br>
-<br>
-<br>
-<h1 class="titlefont">Una Introducci&oacute;n a la</h1>
-<br>
-<br>
-<h1 class="titlefont">Programaci&oacute;n en Emacs Lisp</h1>
-<br>
-<br>
-<p align="center">Revisada la tercera edici&oacute;n
-</p><br>
-<br>
-<br>
-<br>
-<p align="center">Escrito por Robert J. Chassell. Traducido por David Arroyo Men&eacute;ndez.
-</p>
-
-<p>Esto es una <cite>Introducci&oacute;n a la Programaci&oacute;n en Emacs Lisp</cite>,
-para personas que no son programadoras.
-</p><br>
-<p>Traducido desde la edici&oacute;n 3.10.
-</p><br>
-<p>Copyright &copy; 2015 Libremanuals.
-</p><br>
-
-
-<p>Publicado por el:
-</p>
-<div class="example">
-<pre class="example">Libremanuals, @hfill <a href="http://www.libremanuals.net/">http://www.libremanuals.net/</a>
-
-</pre></div>
-
-<br>
-<p>ISBN: 978-84-608-5935-2
-</p>
-<p>Permission is granted to copy, distribute and/or modify this document under
-the terms of the GNU Free Documentation License, Version 1.3 or any later
-version published by the Free Software Foundation; there being no Invariant
-Section, with the Front-Cover Texts being &ldquo;A GNU Manual&rdquo;, and with the
-Back-Cover Texts as in (a) below. A copy of the license is included in the
-section entitled &ldquo;GNU Free Documentation License&rdquo;.
-</p>
-<p>(a) The FSF&rsquo;s Back-Cover Text is: &ldquo;You have the freedom to copy and modify
-this GNU manual. Buying copies from the FSF supports it in developing GNU
-and promoting software freedom.&rdquo;
-</p><hr>
-<a name="Top"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[ &lt; ]</td>
-<td valign="middle" align="left">[<a href="#Prefacio" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Una-Introduccion-a-la-Programacion-en-Emacs-Lisp"></a>
-<h1 class="top">Una Introducci&oacute;n a la Programaci&oacute;n en Emacs Lisp</h1>
-
-<p>Esto es una <cite>Introducci&oacute;n a la Programaci&oacute;n en Emacs Lisp</cite>,
-para personas que no son programadoras.
-</p><br>
-<p>Traducido desde la edici&oacute;n 3.10.
-</p><br>
-<p>Copyright &copy; 2015 Libremanuals.
-</p><br>
-
-
-<p>Publicado por el:
-</p>
-<div class="example">
-<pre class="example">Libremanuals, @hfill <a href="http://www.libremanuals.net/">http://www.libremanuals.net/</a>
-
-</pre></div>
-
-<br>
-<p>ISBN: 978-84-608-5935-2
-</p>
-<p>Permission is granted to copy, distribute and/or modify this document under
-the terms of the GNU Free Documentation License, Version 1.3 or any later
-version published by the Free Software Foundation; there being no Invariant
-Section, with the Front-Cover Texts being &ldquo;A GNU Manual&rdquo;, and with the
-Back-Cover Texts as in (a) below. A copy of the license is included in the
-section entitled &ldquo;GNU Free Documentation License&rdquo;.
-</p>
-<p>(a) The FSF&rsquo;s Back-Cover Text is: &ldquo;You have the freedom to copy and modify
-this GNU manual. Buying copies from the FSF supports it in developing GNU
-and promoting software freedom.&rdquo;
-</p>
-<p>Este men&uacute; maestro primero lista cada cap&iacute;tulo e
-indexa; entonces lista cada nodo en cada cap&iacute;tulo.
-</p>
-
-
-
-
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Prefacio">Prefacio</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Qu&eacute; buscas
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Procesamiento-de-listas">1 Procesamiento de listas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iquest;Qu&eacute; es Lisp?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Practicando-evaluaci_00f3n">2 Practicando evaluaci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejecutando varios programas.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Escribiendo-funciones">3 C&oacute;mo escribir definiciones de funciones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers">4 Unas pocas funciones de buffer relacionadas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Explorando unas pocas funciones
- relacionadas con los b&uacute;ffers.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#M_00e1s-complejidad">5 Unas pocas funciones m&aacute;s complejas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Unas pocas, incluso m&aacute;s complejas funciones.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Encogiendo-y-extendiendo">6 Encogiendo y extendiendo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Restringi&eacute;ndote a t&iacute; y a Emacs a una
- regi&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Car-cdr-y-cons">7 <code>car</code>, <code>cdr</code>, <code>cons</code>: Funciones fundamentales</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Funciones fundamentales en Lisp.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Cortando-y-almacenando-texto">8 Cortando y almacenando texto</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Eliminando texto y guard&aacute;ndolo.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Implementaci_00f3n-de-listas">9 C&oacute;mo las listas se implementan</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo las listas se implementan en el
- ordenador
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Pegando">10 Pegando texto</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Pegando texto almacenado.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Bucles-y-recursi_00f3n">11 Bucles y recursi&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo repetir un proceso.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Buscar-regexp">12 B&uacute;squedas de expresiones regulares</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Contando-palabras">13 Contando: repetici&oacute;n y regexps</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una revisi&oacute;n de repetici&oacute;n y regexps.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Palabras-en-una-funci_00f3n">14 Contando palabras en una <code>defun</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Leyendo-un-grafo">15 Leyendo un grafo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un grafo prototipo imprimiendo una funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Inicializaci_00f3n-de-Emacs">16 Tu fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo escribir un fichero &lsquo;<tt>.emacs</tt>&rsquo;.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Depurando">17 Depurando</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo ejecutar los depuradores de Emacs Lisp.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Conclusi_00f3n">18 Conclusi&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ahora tienes las bases.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#the_002dthe">Appendix A La funci&oacute;n <code>the-the</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un ap&eacute;ndice: c&oacute;mo encontrar palabras
- reduplicadas.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Kill-Ring">Appendix B Manejando el anillo de la muerte</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un ap&eacute;ndice: c&oacute;mo el kill ring funciona.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Grafo-completo">Appendix C Un grafo con ejes etiquetados</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo crear un grafo con ejes etiquetados.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Software-Libre-y-Manuales-Libres">Appendix D Software Libre y Manuales Libres</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#GNU-Free-Documentation-License">Appendix E GNU Free Documentation License</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#g_t_00cdndice">&Iacute;ndice</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Acerca-del-Autor">Acerca del Autor</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment"> &mdash; El Listado Detallado de Nodos &mdash;
-
-
-
-Prefacio
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Por-qu_00e9">&iquest;Por qu&eacute; estudiar Emacs Lisp?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iquest;Por qu&eacute; aprender Emacs Lisp?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Leyendo-este-texto">Leyendo este texto</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Leer, ganar familiaridad, coger h&aacute;bitos...
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Quien-eres">Para quien est&aacute; esto escrito</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Para quien es este escrito.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Historia-de-Lisp">Historia de Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Nota-para-principiantes">Una nota para principiantes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Tu puedes leer esto como un novato
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Se-agradece">Se agradece</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Procesamiento de listas
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Listas-Lisp">1.1 Listas Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iquest;Qu&eacute; son listas?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejecutar-un-programa">1.2 Ejecutar un programa</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cualquier lista en Lisp es un programa listo
- para ejecutarse.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Creando-errores">1.3 Generar un mensaje de error</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Generando un mensaje de error.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Nombres-y-definiciones">1.4 Nombres de s&iacute;mbolos y definiciones de funciones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Nombres de s&iacute;mbolos y
- definiciones de funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Interpr_00e9te-Lisp">1.5 El int&eacute;rprete Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Qu&eacute; hace el int&eacute;rprete Lisp.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Evaluaci_00f3n">1.6 Evaluaci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejecutando un programa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Variables">1.7 Variables</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Devolviendo un valor desde una variable.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Argumentos">1.8 Argumentos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Pasando informaci&oacute;n a una funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#set-y-setq">1.9 Configurando el valor de una variable</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Resumen">1.10 Resumen</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Los mayores puntos.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicios-de-mensajes-de-error">1.11 Ejercicios</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicios de mensajes de error
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Listas Lisp
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Listas-de-n_00fameros">N&uacute;meros, listas dentro de listas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Lista tener n&uacute;meros, otras listas, en ellas.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#g_t_00c1tomos-Lisp">1.1.1 &Aacute;tomos Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Entidades Elementales.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Espacios-en-blanco-en-listas">1.1.2 Espacios en blanco en listas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Formatenado listas para ser legibles.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Escribiendo-listas">1.1.3 GNU Emacs te ayuda a escribir listas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo GNU Emacs te ayuda a escribir listas.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-El int&eacute;rprete Lisp
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Complicaciones">Complicaciones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Variables, formas especiales, Listas.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Compilaci_00f3n-de-bytes">1.5.1 Compilaci&oacute;n de bytes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Especialmente procesando c&oacute;digo por la
- velocidad.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Evaluaci&oacute;n
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#C_00f3mo-el-int_00e9rprete-act_00faa">C&oacute;mo el int&eacute;rprete act&uacute;a</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Devolver y Efectos Colaterales...
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Evaluando-listas-propias">1.6.1 Evaluando listas propias</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Listas con listas...
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Variables
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Ejemplo-de-rellenar-columna"><code>fill-column</code>, un ejemplo de variable</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo de rellenar columna
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Funci_00f3n-vac_00eda">1.7.1 Mensaje de error de un s&iacute;mbolo sin una funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El mensaje de error para un
- s&iacute;mbolo sin una funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Variable-vac_00eda">1.7.2 Mensaje de error de un s&iacute;mbolo sin un valor</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El mensaje de error para un
- s&iacute;mbolo sin un valor.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Argumentos
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Tipos-de-datos">1.8.1 Tipos de argumentos de datos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Tipos de datos pasados a una funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Argumentos-como-variables-o-listas">1.8.2 Un argumento como el valor de una variable o lista</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un argumento puede ser el valor de
- una variable o lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#N_00famero-de-variables-de-argumentos">1.8.3 N&uacute;mero de variables de argumentos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Algunas funciones pueden tomar un
- n&uacute;mero variable de argumentos.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Tipo-incorrecto-de-argumento">1.8.4 Usando el tipo incorrecto de objeto como un argumento</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Pasando un argumento del tipo incorrecto a
- una funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#message">1.8.5 La funci&oacute;n <code>message</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una funci&oacute;n &uacute;til para enviar mensajes.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Configurando el valor de una variable
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Usando-set">1.9.1 Usando <code>set</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Configurando valores.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Usando-setq">1.9.2 Usando <code>setq</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Configurando un valor citado.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Contando">1.9.3 Contando</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usando <code>setq</code> para contar.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Practicando evaluaci&oacute;n
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#C_00f3mo-evaluar">C&oacute;mo evaluar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Escribiendo comandos de edici&oacute;n o con
- <kbd>C-x C-e</kbd>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Nombres-de-b_00faffer">2.1 Nombres de b&uacute;ffer</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Buffers y ficheros son diferentes.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Obteniendo-b_00faffers">2.2 Obteniendo b&uacute;ffers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Obteniendo un buffer por s&iacute;
- mismo, no solamente su nombre.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Cambiando-b_00faffers">2.3 Cambiando b&uacute;ffers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo cambiar a otro buffer.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Tama_00f1o-de-b_00faffer-y-localizaciones">2.4 Tama&ntilde;o de b&uacute;ffer y la ubicaci&oacute;n del punto</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> D&oacute;nde el punto est&aacute;
- localizado y el tama&ntilde;o del
- buffer.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-de-evaluaci_00f3n">2.5 Ejercicio</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio de evaluaci&oacute;n
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-C&oacute;mo escribir definiciones de funciones
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Funciones-primitivas">Una v&iacute;a acerca de funciones primitivas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Funciones primitivas
-</td></tr>
-<tr><td align="left" valign="top"><a href="#defun">3.1 La forma especial <code>defun</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Instalar">3.2 Instalar una definici&oacute;n de funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Interactive">3.3 Crear una funci&oacute;n interactive</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Creando una funci&oacute;n interactive.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Opciones-de-interactive_002e">3.4 Diferentes opciones para <code>interactive</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Instalaci_00f3n-Permanente">3.5 Instalar c&oacute;digo permanentemente</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Instalando c&oacute;digo permanentemente.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#let">3.6 <code>let</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Creando e inicializando variables locales.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#if">3.7 La forma especial <code>if</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iquest;Y qu&eacute; si?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#else">3.8 Expresiones if&ndash;then&ndash;else</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Expresiones If&ndash;then&ndash;else.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Verdad-y-falsedad">3.9 Verdad y falsedad en Emacs Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Que considera Lisp falso y cierto.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#save_002dexcursion">3.10 <code>save-excursion</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Guardando la traza del punto, la marca, y el
- buffer.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Revisar">3.11 Revisar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicios-defun">3.12 Ejercicios</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicios defun
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Instalar una definici&oacute;n de funci&oacute;n
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Efecto-de-instalaci_00f3n">El efecto de instalaci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Efecto de instalaci&oacute;n
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Cambiar-un-defun">3.2.1 Cambiar una definici&oacute;n de funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo cambiar una definici&oacute;n de funci&oacute;n
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Crear una funci&oacute;n interactive
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#multiply_002dby_002dseven-interactivo">Un <code>multiply-by-seven</code> interactivo, Un resumen</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un resumen
-</td></tr>
-<tr><td align="left" valign="top"><a href="#multiply_002dby_002dseven-en-detalle">3.3.1 <code>multiplicar-por-siente</code> interactivo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La versi&oacute;n interactive.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>let</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Prevenir-confusi_00f3n"><code>let</code> evita confusiones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Prevenir confusi&oacute;n
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Partes-de-la-expresi_00f3n-let">3.6.1 Las partes de una expresi&oacute;n <code>let</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Partes de la expresi&oacute;n let
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejemplo-de-expresi_00f3n-let">3.6.2 Ejemplo de Expresi&oacute;n <code>let</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo de expresi&oacute;n let
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Variables-let-inicializadas">3.6.3 Variables sin inicializar en un sentencia <code>let</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Variables let inicializadas
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-La forma especial <code>if</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#if-en-m_00e1s-detalle"><code>if</code> en m&aacute;s detalle</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> if en m&aacute;s detalle
-</td></tr>
-<tr><td align="left" valign="top"><a href="#tipo_002dde_002danimal-en-detalle">3.7.1 La funci&oacute;n <code>tipo-de-animal</code> en detalle</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un ejemplo de una expresi&oacute;n <code>if</code>.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Verdad y falsedad en Emacs Lisp
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#nil-explicado">Una explicaci&oacute;n de <code>nil</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> <code>nil</code> tiene dos significados.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>save-excursion</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Punto-y-marca">Punto y Marca</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una revisi&oacute;n de varias localizaciones.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Plantilla-para-save_002dexcursion">3.10.1 Plantilla para una expresi&oacute;n <code>save-excursion</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Plantilla para save-excursion
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Unas pocas funciones de buffer relacionadas
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Encontrando-m_00e1s">4.1 Encontrando m&aacute;s informaci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo encontrar m&aacute;s informaci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#simplified_002dbeginning_002dof_002dbuffer">4.2 Una definici&oacute;n simplificada de <code>beginning-of-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Muestra <code>goto-char</code>,
- <code>point-min</code>, y <code>push-mark</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#mark_002dwhole_002dbuffer">4.3 La definici&oacute;n de <code>mark-whole-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Casi lo mismo que <code>beginning-of-buffer</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#append_002dto_002dbuffer">4.4 La definici&oacute;n de <code>append-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usa <code>save-excursion</code> y
- <code>insert-buffer-substring</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Revisa-lo-relacionado-con-el-b_00faffer">4.5 Revisar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Revisa
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicios-de-b_00faffer">4.6 Ejercicios</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicios de b&uacute;ffer
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-La definici&oacute;n de <code>mark-whole-buffer</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#resumen-de-mark_002dwhole_002dbuffer">Un resumen de <code>mark-whole-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> resumen de mark-whole-buffer
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Cuerpo-de-mark_002dwhole_002dbuffer">4.3.1 Cuerpo de <code>mark-whole-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Solo tres l&iacute;neas de c&oacute;digo.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-La definici&oacute;n de <code>append-to-buffer</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#resumen-de-append_002dto_002dbuffer">Un resumen de <code>append-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> resumen de append-to-buffer
-</td></tr>
-<tr><td align="left" valign="top"><a href="#append-interactivo">4.4.1 La expresi&oacute;n interactiva <code>append-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una expresi&oacute;n interactiva de dos partes.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#cuerpo-append_002dto_002dbuffer">4.4.2 El cuerpo de <code>append-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Incorpora una expresi&oacute;n <code>let</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#append-save_002dexcursion">4.4.3 <code>save-excursion</code> en <code>append-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo <code>save-excursion</code> trabaja.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Unas pocas funciones m&aacute;s complejas
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#copy_002dto_002dbuffer">5.1 La definici&oacute;n de <code>copy-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Con <code>set-buffer</code>,
- <code>get-buffer-create</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#insert_002dbuffer">5.2 La definici&oacute;n de <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Solo lectura, y con <code>or</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#beginning_002dof_002dbuffer">5.3 Definici&oacute;n completa de <code>beginning-of-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Muestra <code>goto-char</code>, <code>point-min</code>, y
- <code>push-mark</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Revisar-el-segundo-b_00faffer-relacionado">5.4 Revisar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Revisar el segundo b&uacute;ffer
- relacionado
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-opcional">5.5 Ejercicio de argumento <code>opcional</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio opcional
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-La definici&oacute;n de <code>insert-buffer</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#c_00f3digo-insert_002dbuffer">El c&oacute;digo para <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> c&oacute;digo insert-buffer
-</td></tr>
-<tr><td align="left" valign="top"><a href="#insert_002dbuffer-interactivo">5.2.1 La expresi&oacute;n interactiva en <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cuando tu puedes leer, pero no escribir.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#cuerpo-insert_002dbuffer">5.2.2 El cuerpo de la funci&oacute;n <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El cuerpo tiene un <code>or</code> y un <code>let</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#si-y-o">5.2.3 <code>insert-buffer</code> con un <code>if</code> en vez de un <code>or</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usando un <code>if</code> en vez de un <code>or</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Insertar-o">5.2.4 El <code>or</code> en el cuerpo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo la expresi&oacute;n <code>or</code> funciona.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Insertar-let">5.2.5 La expresi&oacute;n <code>let</code> en <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Dos expresiones <code>save-excursion</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Nuevo-insert_002dbuffer">5.2.6 Nuevo cuerpo para <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Nuevo insert-buffer
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-La expresi&oacute;n interactiva en <code>insert-buffer</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#B_00faffer-solo-lectura">Un b&uacute;ffer de solo lectura</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cuando un buffer no puede ser modificado.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#b-para-interactivo">&lsquo;<samp>b</samp>&rsquo; en una expresi&oacute;n interactiva</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un buffer existe o adem&aacute;s su nombre.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Definici&oacute;n completa de <code>beginning-of-buffer</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Argumentos-opcionales">5.3.1 Argumentos opcionales</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#beginning_002dof_002dbuffer-opt-arg">5.3.2 <code>beginning-of-buffer</code> con un argumento</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo con argumento opcional.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Completo-beginning_002dof_002dbuffer">5.3.3 El <code>beginning-of-buffer</code> completo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Completo beginning-of-buffer
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>beginning-of-buffer</code> con un argumento
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Desenmara_00f1ar-beginning_002dof_002dbuffer">Desenmara&ntilde;ar <code>beginning-of-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Desenmara&ntilde;ar beginning-of-buffer
-</td></tr>
-<tr><td align="left" valign="top"><a href="#El-caso-del-buffer-largo">Qu&eacute; ocurre en un b&uacute;ffer largo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El caso del buffer largo
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Peque_00f1o-caso-de-b_00faffer">Qu&eacute; ocurre en un b&uacute;ffer peque&ntilde;o</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Peque&ntilde;o caso de b&uacute;ffer
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Encogiendo y extendiendo
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Ventajas-de-encoger">Las ventajas de encoger</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#save_002drestriction">6.1 La forma especial <code>save-restriction</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#what_002dline">6.2 <code>what-line</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El n&uacute;mero de la l&iacute;nea que
- apunta est&aacute; activa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-narrow">6.3 Ejercicio de encoger</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio narrow
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>car</code>, <code>cdr</code>, <code>cons</code>: Funciones fundamentales
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Nombres-extra_00f1os">Nombres extra&ntilde;os</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un lado hist&oacute;rico: &iquest;por qu&eacute;
- los nombres extra&ntilde;os?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#car-y-cdr">7.1 <code>car</code> y <code>cdr</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Funciones para extraer parte de una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#cons">7.2 <code>cons</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Construyendo una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#nthcdr">7.3 <code>nthcdr</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Llamando <code>cdr</code> repetidamente.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#nth">7.4 <code>nth</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> nth
-</td></tr>
-<tr><td align="left" valign="top"><a href="#setcar">7.5 <code>setcar</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cambiando el primer elemento de una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#setcdr">7.6 <code>setcdr</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cambiando el resto de una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-cons">7.7 Ejercicio</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio cons
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>cons</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Construir-una-lista">Construir una lista</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#length">7.2.1 Encuentra el tama&ntilde;o de una lista: <code>length</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo encontrar el tama&ntilde;o de una lista.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Cortando y almacenando texto
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Almacenando-Texto">Almacenando texto en una lista</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El texto est&aacute; almacenado en una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#zap_002dto_002dchar">8.1 <code>zap-to-char</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cortando texto a un car&aacute;cter.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#kill_002dregion">8.2 <code>kill-region</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cortando texto de una regi&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#copy_002dregion_002das_002dkill">8.3 <code>copy-region-as-kill</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una definici&oacute;n para copiar texto.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Disgresi_00f3n-dentro-de-C">8.4 Disgresi&oacute;n dentro de C</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Nota menor en macros del lenguaje de
- programaci&oacute;n C.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#defvar">8.5 Inicializando una variable con <code>defvar</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo dar a una variable un valor inicial.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Revisi_00f3n-de-cons-y-search_002dfwd">8.6 Revisar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Revisi&oacute;n de cons y search-fwd
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Buscar-ejercicios">8.7 Buscando ejercicios</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Buscar ejercicios
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>zap-to-char</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Completar-zap_002dto_002dchar">La implementaci&oacute;n completa <code>zap-to-char</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La implementaci&oacute;n completa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#zap_002dto_002dchar-interactivo">8.1.1 La expresi&oacute;n <code>interactive</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una expresi&oacute;n interactiva de tres partes.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#cuerpo-zap_002dto_002dchar">8.1.2 El cuerpo de <code>zap-to-char</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un resumen corto
-</td></tr>
-<tr><td align="left" valign="top"><a href="#search_002dforward">8.1.3 La funci&oacute;n <code>search-forward</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo buscar una cadena.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#progn">8.1.4 La forma especial <code>progn</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Resumiendo-zap_002dto_002dchar">8.1.5 Resumiendo <code>zap-to-char</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usando <code>point</code> y <code>search-forward</code>.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>kill-region</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Completa-kill_002dregion">La definici&oacute;n completa <code>kill-region</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La definici&oacute;n de funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#condition_002dcase">8.2.1 <code>condition-case</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Tratando con un problema.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Macro-Lisp">8.2.2 Macro Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>copy-region-as-kill</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Completar-copy_002dregion_002das_002dkill">La definici&oacute;n de la funci&oacute;n completa <code>copy-region-as-kill</code>.</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La definici&oacute;n completa de funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#cuerpo-copy_002dregion_002das_002dkill">8.3.1 El cuerpo de <code>copy-region-as-kill</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-El cuerpo de <code>copy-region-as-kill</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#last_002dcommand-_0026-this_002dcommand"><code>last-command</code> y <code>this-command</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> last-command &amp; this-command
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Funci_00f3n-kill_002dappend">La funci&oacute;n <code>kill-append</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Funci&oacute;n kill-append
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Funci&oacute;n kill-new
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Inicializando una variable con <code>defvar</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Mira-el-valor-actual-de-la-variable">Mirando el actual valor de una variable</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Mira el valor actual de la variable
-</td></tr>
-<tr><td align="left" valign="top"><a href="#defvar-y-asterisk">8.5.1 <code>defvar</code> y un asterisco</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> defvar y asterisk
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-C&oacute;mo las listas se implementan
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Listas-diagramadas">Listas diagramadas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#S_00edmbolos-como-cajas">9.1 S&iacute;mbolos como una caja con cajones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Explorando una met&aacute;fora poderosa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-Lista">9.2 Ejercicio</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio Lista
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Pegando texto
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Resumen-del-anillo-de-la-muerte">10.1 Resumen del anillo de la muerte</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#kill_002dring_002dyank_002dpointer">10.2 La variable <code>kill-ring-yank-pointer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El anillo de la muerte es una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#pegar-Ejercicio-nthcdr">10.3 Ejercicios con <code>yank</code> y <code>nthcdr</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La variable <code>kill-ring-yank-pointer</code>.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Bucles y recursi&oacute;n
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#while">11.1 <code>while</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Causando un cierto c&oacute;digo para repetir.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Dolist-y-dotimes">11.2 Ahorra tiempo: <code>dolist</code> y <code>dotimes</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Dolist y dotimes
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Recursi_00f3n">11.3 Recursi&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Causando que una funci&oacute;n se llame a
- s&iacute; misma.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-de-Bucle">11.4 Ejercicio de bucles</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio de Bucle
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>while</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Bucles-while">Bucles con <code>while</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Repetir tantas veces como el test devuelva
- verdadero.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejemplo-de-bucle">11.1.1 Un bucle <code>while</code> y una lista</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un bucle <code>while</code> que usa una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#print_002delements_002dof_002dlist">11.1.2 Un ejemplo: <code>imprimir-elementos-de-la-lista</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usos <code>while</code>, <code>car</code>, <code>cdr</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Incrementando-el-Bucle">11.1.3 Un bucle con un contaje incremental</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un bucle con un contador de incremento.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Incrementando-los-detalles-de-los-bucles">Detalles de un bucle que se incrementa</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Incrementando los detalles de
- los bucles
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Bucle-que-se-decrementa">11.1.4 Bucle que decrementa</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un bucle con un decrementando contador.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Detalles de un bucle que se incrementa
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Ejemplo-de-Incremento">Ejemplo con contador incremental</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Contando esquinas en un tri&aacute;ngulo.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Partes-Inc-de-Ejemplo">Las partes de la definici&oacute;n de funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Ejemplo-Inc-junto">Poniendo la definici&oacute;n de la funci&oacute;n junta</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Poniendo la definici&oacute;n de funci&oacute;n junta.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Bucle que decrementa
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Ejemplo-de-Decremento">Ejemplo con el contador que se decrementa</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> M&aacute;s piedras en la playa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Partes-de-Ejemplo-Dec">Las partes de la definici&oacute;n de funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Ejemplo-Dec-junto">Poniendo la definici&oacute;n de la funci&oacute;n junta</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Poniendo la definici&oacute;n de funci&oacute;n junta.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Ahorra tiempo: <code>dolist</code> y <code>dotimes</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#dolist">La macro <code>dolist</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> dolist
-</td></tr>
-<tr><td align="left" valign="top"><a href="#dotimes">La macro <code>dotimes</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> dotimes
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Recursi&oacute;n
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Construyendo-robots">11.3.1 Construyendo robots: Extendiendo la met&aacute;fora</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Mismo modelo, diferente n&uacute;mero serie ...
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Partes-de-definici_00f3n-recursiva">11.3.2 Las partes de una definici&oacute;n recursiva</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Paseo hasta que tu pares ...
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Recursi_00f3n-con-lista">11.3.3 Recursi&oacute;n con una lista</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usando una lista con el test si para recurso.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Funci_00f3n-recursiva-tri_00e1ngulo">11.3.4 Recursi&oacute;n en lugar de un contador</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Funci&oacute;n recursiva tri&aacute;ngulo
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Recursi_00f3n-con-cond">11.3.5 Ejemplo de recursi&oacute;n usando <code>cond</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Recursi&oacute;n con cond
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Patrones-recursivos">11.3.6 Patrones recursivos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Plantillas usadas con frecuencia.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Sin-Aplazar">11.3.7 Recursi&oacute;n sin diferir</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> No almacenar trabajo ...
-</td></tr>
-<tr><td align="left" valign="top"><a href="#No-aplazar-la-soluci_00f3n">11.3.8 No hay soluci&oacute;n pospuesta</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> No aplazar la soluci&oacute;n
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Recursi&oacute;n en lugar de un contador
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Ejemplo-recursivo-y-argumento-con-valor-1-o-2">Un argumento de 1 o 2</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo recursivo y
- argumento con valor 1 o 2
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejemplo-Recursivo-de-3-o-4-argumentos">Un argumento de 3 o 4</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo Recursivo de 3 o 4
- argumentos
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Patrones recursivos
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Cada">Patr&oacute;n recursivo: <em>every</em></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cada
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Acumular">Patr&oacute;n recursivo: <em>accumulate</em></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Acumular
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Guardar">Patr&oacute;n recursivo: <em>keep</em></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Guardar
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-B&uacute;squedas de expresiones regulares
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#sentence_002dend">12.1 La expresi&oacute;n regular para <code>sentence-end</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#re_002dsearch_002dforward">12.2 La funci&oacute;n <code>re-search-forward</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Muy similar a <code>search-forward</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#forward_002dsentence">12.3 <code>forward-sentence</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un ejemplo sencillo de b&uacute;squeda con
- expresiones regulares.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#forward_002dparagraph">12.4 <code>forward-paragraph</code>: una mina de oro de funciones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un ejemplo complejo de alguna cosa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#etags">12.5 Crea tu propio fichero &lsquo;<tt>TAGS</tt>&rsquo;</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo crear tu propia tabla &lsquo;<tt>TAGS</tt>&rsquo;.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Revisar-regexp">12.6 Revisar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Revisar regexp
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicios-re_002dsearch">12.7 Ejercicios con <code>re-search-forward</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicios re-search
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>forward-sentence</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Completa-forward_002dsentence">Completa la definici&oacute;n <code>forward-sentence</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Completa forward-sentence
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Bucles-while-fwd_002dsentence">Los bucles <code>while</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Dos bucles <code>while</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Volver-a-buscar-la-frase-en-sentido-directo">La b&uacute;squeda de expresiones regulares</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una b&uacute;squeda de
- expresi&oacute;n regular.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>forward-paragraph</code>: una mina de oro de funciones
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#forward_002dparagraph-en-breve">Definici&oacute;n de funci&oacute;n <code>forward-paragraph</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Partes clave de la definici&oacute;n de la
- funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#fwd_002dpara-let">La expresi&oacute;n <code>let*</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#fwd_002dpara-while">El bucle <code>while</code> hacia adelante</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El bucle <code>while</code> con modo hacia adelante.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Contando: repetici&oacute;n y regexps
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Por-qu_00e9-Contar-Palabras">Contando palabras</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Por qu&eacute; Contar Palabras
-</td></tr>
-<tr><td align="left" valign="top"><a href="#count_002dwords_002dexample">13.1 La funci&oacute;n <code>count-words-example</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usa un regexp, pero encuentra un problema.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#recursive_002dcount_002dwords">13.2 Cuenta palabras recursivamente</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Empezar en caso de que no haya palabras en la
- regi&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-de-Contar">13.3 Ejercicio: contando puntuaci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio de Contar
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-La funci&oacute;n <code>count-words-example</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Dise_00f1ar-count_002dwords_002dexample">Dise&ntilde;ando <code>count-words-example</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La definici&oacute;n usando un bucle
- <code>while</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Error-de-espacio-en-blanco">13.1.1 El error de espacio en blanco en <code>count-words-example</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Contando palabras en una <code>defun</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Divide-y-vencer_00e1s">Divide y vencer&aacute;s</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Palabras-y-S_00edmbolos">14.1 &iquest;Qu&eacute; contar?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Sintaxis">14.2 &iquest;Qu&eacute; constituye una palabra o s&iacute;mbolo?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#count_002dwords_002din_002ddefun">14.3 La funci&oacute;n <code>count-words-in-defun</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Similar a <code>count-words-example</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Varias-funciones">14.4 Contar varias <code>defuns</code> en un fichero</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Contando varias funciones en un fichero.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Encontrar-un-fichero">14.5 Encontrar un fichero</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iquest;Quieres buscar en un fichero?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#lengths_002dlist_002dfile">14.6 <code>lengths-list-file</code> en detalle</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una lista de los tama&ntilde;os de muchas
- definiciones.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Varios-ficheros">14.7 Contar palabras en <code>defuns</code> en diferentes ficheros</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Contando en definiciones en diferentes
- ficheros.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Varios-ficheros-recursivamente">14.8 Recursivamente cuenta palabras en diferentes ficheros</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Recursivamente contando en diferentes
- ficheros.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Preparar-los-datos">14.9 Preparar los datos para mostrarlos en un grafo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Contar palabras en <code>defuns</code> en diferentes ficheros
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#lengths_002dlist_002dmany_002dfiles">Determina las longitudes de <code>defuns</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Devolver una lista de tama&ntilde;os de funciones.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#append">14.7.1 La funci&oacute;n <code>append</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Adjuntar una lista a otra.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Preparar los datos para mostrarlos en un grafo
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Datos-para-mostrar-en-detalle">El dato para mostrar en detalle</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Datos para mostrar en detalle
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ordenando">14.9.1 Ordenando listas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Listar-ficheros">14.9.2 Creando una lista de ficheros</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Contando-definiciones-de-funci_00f3n">14.9.3 Contando definiciones de funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Leyendo un grafo
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Columnas-de-un-grafo">Imprimiendo las columnas de un grafo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Columnas de un grafo
-</td></tr>
-<tr><td align="left" valign="top"><a href="#graph_002dbody_002dprint">15.1 La funci&oacute;n <code>graph-body-print</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo imprimir el cuerpo de un grafo.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#recursive_002dgraph_002dbody_002dprint">15.2 La funci&oacute;n <code>recursive-graph-body-print</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> recursive-graph-body-print
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejes-Impresos">15.3 Necesidad para ejes impresos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejes Impresos
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-de-L_00ednea-de-Grafo">15.4 Ejercicio</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio de
- L&iacute;nea de Grafo
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Tu fichero &lsquo;<tt>.emacs</tt>&rsquo;
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Configuraci_00f3n-por-defecto">Configuraci&oacute;n por defecto de Emacs</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Configuraci&oacute;n por defecto
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Site_002dwide-Init">16.1 Fichero de inicializaci&oacute;n site-wide</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Se puede escribir site-wide ficheros init.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#defcustom">16.2 Especificar variables usando <code>defcustom</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Emacs escribir&aacute; c&oacute;digo para ti.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Empezando-un-fichero-_002eemacs">16.3 Empieza por un fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo escribir un <code>fichero .emacs</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Texto-y-Autorelleno">16.4 Modo texto y auto relleno</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Corta l&iacute;neas autom&aacute;ticamente.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Alias-de-correo">16.5 Alias de correo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usar abreviaciones para direcciones de correo
- electr&oacute;nico.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Indentar-modo-de-tabulaciones">16.6 Indentar modo de tabulaciones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> No usar tabulaciones con TeX
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Crear algunos atajos de teclado personales.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Mapas-de-teclado">16.8 Mapas de teclado</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> M&aacute;s acerca de atajos de teclado.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Cargando-ficheros">16.9 Cargando ficheros</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cargar (por ej. evaluar) ficheros
- autom&aacute;ticamente.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Autocarga">16.10 Autoloading</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Crear funciones disponibles.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Extensi_00f3n-simple">16.11 Una extensi&oacute;n simple: <code>line-to-top-of-window</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Definir una funci&oacute;n; enlazarla a una tecla.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Colores-X11">16.12 Colores X11</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Colores en X.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Miscel_00e1nea">16.13 Configuraciones miscel&aacute;neas para un fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Miscel&aacute;nea
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Mode-Line">16.14 Una l&iacute;nea modificada</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo personalizar tu mode line.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Depurando
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#depurar">17.1 <code>depurar</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo usar el depurador construido.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#debug_002don_002dentry">17.2 <code>debug-on-entry</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Empezar depurando cuando se llama a una
- funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#debug_002don_002dquit">17.3 <code>debug-on-quit</code> y <code>(debug)</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Empezar depurando cuando se sale con <kbd>C-g</kbd>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#edebug">17.4 El depurador de nivel de fuentes <code>edebug</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo usar Edebug, un depurador a nivel de
- fuentes.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicios-de-depuraci_00f3n">17.5 Ejercicios de depuraci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Manejando el anillo de la muerte
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Qu_00e9-hace-el-anillo-de-la-muerte">Qu&eacute; hace el anillo de la muerte</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#current_002dkill">B.1 La funci&oacute;n <code>current-kill</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> current-kill
-</td></tr>
-<tr><td align="left" valign="top"><a href="#pegar">B.2 <code>pegar</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Pegar una copia de un elemento ya cortado.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#yank_002dpop">B.3 <code>yank-pop</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Insertar elemento apuntado.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#fichero-anillo">B.4 El fichero &lsquo;<tt>ring.el</tt>&rsquo;</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> fichero anillo
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-La funci&oacute;n <code>current-kill</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#C_00f3digo-para-current_002dkill">El c&oacute;digo <code>current-kill</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;digo para current-kill
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Comprendiendo-current_002dkill"><code>current-kill</code> en outline</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Comprendiendo current-kill
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-<code>current-kill</code> en outline
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Cuerpo-de-current_002dkill">El cuerpo de <code>current-kill</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cuerpo de current-kill
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Disgresi_00f3n-concerniente-de-error">Disgresi&oacute;n acerca de la palabra &lsquo;error&rsquo;</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo confundir humanos, pero no
- ordenadores.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Determinando-el-elemento">Determinando el elemento</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Un grafo con ejes etiquetados
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Ejemplo-etiquetado">Grafo de ejemplo etiquetado</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo etiquetado
-</td></tr>
-<tr><td align="left" valign="top"><a href="#print_002dgraph-Varlist">C.1 La varlist <code>print-graph</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Expresi&oacute;n <code>let</code> en <code>print-graph</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#print_002dY_002daxis">C.2 La funci&oacute;n <code>print-Y-axis</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Imprimir una etiqueta para los ejes verticales.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#print_002dX_002daxis">C.3 La funci&oacute;n <code>print-X-axis</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Imprimir una etiqueta horizontal.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Imprimir-Grafo-Entero">C.4 Imprimiendo el grafo completo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La funci&oacute;n para imprimir un grafo completo.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-La funci&oacute;n <code>print-Y-axis</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#print_002dY_002daxis-en-Detalle">La funci&oacute;n <code>print-Y-axis</code> en detalle</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> print-Y-axis en Detalle
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Altura-de-etiqueta">&iquest;A qu&eacute; altura se deber&iacute;a etiquetar?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iquest;Qu&eacute; altura para el eje Y?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Calcular-un-resto">C.2.1 Viaje lateral: Calcula un resto</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo calcular el resto de una divisi&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Elemento-del-Eje-Y">C.2.2 Construye un elemento del eje Y</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Construir una l&iacute;nea para el eje
- Y.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Y_002daxis_002dcolumn">C.2.3 Crea un eje de la columna Y</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Generar una lista de etiquetas del eje Y.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Pen_00faltimo-print_002dY_002daxis">C.2.4 La versi&oacute;n no demasiado final de <code>print-Y-axis</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una versi&oacute;n no muy final.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-La funci&oacute;n <code>print-X-axis</code>
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#Diferencias-similares">Similaridades y diferencias</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Mucho como <code>print-Y-axis</code>, pero no
- exactamente.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Eje-X-marca-tic">C.3.1 Eje X marca tic</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Crear marcas de tic para los ejes horizontales.
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-Imprimiendo el grafo completo
-
-
-
-</pre></th></tr><tr><td align="left" valign="top"><a href="#La-versi_00f3n-final">Cambios para la versi&oacute;n final</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Unos pocos cambios
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Testear-print_002dgraph">C.4.1 Testeando <code>print-graph</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejecutar un r&aacute;pido test.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Graficar-palabras-en-funciones">C.4.2 Creando gr&aacute;ficas de n&uacute;meros de palabras y s&iacute;mbolos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejecutando el c&oacute;digo final.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#lambda">C.4.3 Una expresi&oacute;n <code>lambda</code>: Anonimicidad &uacute;til</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo escribir una funci&oacute;n an&oacute;nima.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#mapcar">C.4.4 La funci&oacute;n <code>mapcar</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Aplicar una funci&oacute;n a elementos de una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Otro-Error">C.4.5 Otro error &hellip; m&aacute;s insidioso</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Todav&iacute;a otro error &hellip; m&aacute;s
- insidioso.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Grafo-impreso-final">C.4.6 El gr&aacute;fico impreso</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iexcl;El grafo en s&iacute;!
-</td></tr>
-<tr><th colspan="3" align="left" valign="top"><pre class="menu-comment">
-</pre></th></tr></table>
-
-<hr size="6">
-<a name="Prefacio"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Top" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Por-qu_00e9" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Prefacio-1"></a>
-<h1 class="unnumbered">Prefacio</h1>
-
-<p>La mayor&iacute;a del entorno integrado GNU Emacs est&aacute;
-escrito en el lenguaje de programaci&oacute;n llamado Emacs Lisp. El
-c&oacute;digo escrito en este lenguaje de programaci&oacute;n es el
-software&mdash;el conjunto de instrucciones&mdash;que cuenta al ordenador qu&eacute;
-hacer cuando tu le das comandos. Emacs est&aacute; dise&ntilde;ado
-de forma que se puede escribir nuevo c&oacute;digo en Emacs Lisp
-y f&aacute;cilmente instalarlo como una extensi&oacute;n al editor.
-</p>
-<p>(GNU Emacs se define muchas veces como un &ldquo;editor extensible&rdquo;, pero
-hace mucho m&aacute;s que proporcionar capacidad de edici&oacute;n. Es mejor
-referirse a Emacs como un &ldquo;entorno de computaci&oacute;n extensible&rdquo;. Sin
-embargo, esta frase es un poco pretenciosa. Es m&aacute;s f&aacute;cil referirse
-a Emacs simplemente como un editor. De hecho, cada cosa que se hace en
-Emacs&mdash;encontrar la fecha Maya y fases de la luna, simplificar
-polinomios, depurar c&oacute;digo, administrar ficheros, leer cartas,
-escribir libros&mdash;todas estas actividades son maneras de editar en un
-sentido amplio de la palabra.)
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Por-qu_00e9">&iquest;Por qu&eacute; estudiar Emacs Lisp?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iquest;Por qu&eacute; aprender Emacs Lisp?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Leyendo-este-texto">Leyendo este texto</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Leer, ganar familiaridad, coger h&aacute;bitos...
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Quien-eres">Para quien est&aacute; esto escrito</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Para quien es este escrito.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Historia-de-Lisp">Historia de Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Nota-para-principiantes">Una nota para principiantes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Tu puedes leer esto como un novato
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Se-agradece">Se agradece</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-</table>
-
-<hr>
-<a name="Por-qu_00e9"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Prefacio" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Prefacio" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Prefacio" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-este-texto" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="g_t_00bfPor-que-estudiar-Emacs-Lisp_003f"></a>
-<h2 class="unnumberedsec">&iquest;Por qu&eacute; estudiar Emacs Lisp?</h2>
-
-<p>Aunque Emacs Lisp normalmente se asocia solo con Emacs, es un lenguaje
-de programaci&oacute;n completo. Se puede usar Emacs Lisp del mismo modo
-que con cualquier otro lenguaje de programaci&oacute;n.
-</p>
-<p>Quiz&aacute;s se quiere comprender la programaci&oacute;n; quiz&aacute;s se quiere
-extender Emacs; o quiz&aacute;s se quiere llegar a ser un programador. Esta
-introducci&oacute;n a Emacs Lisp est&aacute; dise&ntilde;ada para ayudar a empezar en
-todo esto: para guiarse en el aprendizaje de los fundamentos de
-programaci&oacute;n, y de manera m&aacute;s importante, para ense&ntilde;ar como uno
-mismo puede ir m&aacute;s all&aacute;.
-</p>
-<hr>
-<a name="Leyendo-este-texto"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Prefacio" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Por-qu_00e9" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Prefacio" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Quien-eres" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Leyendo-este-texto-1"></a>
-<h2 class="unnumberedsec">Leyendo este texto</h2>
-
-<p>A trav&eacute;s de este libro, se ver&aacute;n peque&ntilde;os programas de ejemplo
-que se pueden ejecutar dentro de Emacs. Si se lee este documento en
-Info dentro de GNU Emacs, se pueden ejecutar los programas tal y como
-aparecen. (Esto es f&aacute;cil de hacer y se explica cuando los ejemplos
-se presentan). Alternativamente, se puede leer esta introducci&oacute;n
-como un libro impreso mientras se est&aacute; sentando con un ordenador
-ejecutando Emacs. (Esto es lo que me gusta hacer; me gustan los libros
-impresos.) Si no se est&aacute; ejecutando Emacs, todav&iacute;a se
-puede leer este libro, pero en este caso, lo mejor es tratarlo como
-una novela, o como una gu&iacute;a de v&iacute;aje a un pa&iacute;s a&uacute;n
-no visitado: interesante, pero no es lo mismo
-que estar all&iacute;.
-</p>
-<p>Gran parte de esta introducci&oacute;n se dedica a paseos guiados de
-c&oacute;digo usado en GNU Emacs. Estos paseos est&aacute;n dise&ntilde;ados para dos
-prop&oacute;sitos: primero, familiarizarse con c&oacute;digo real que funciona
-(c&oacute;digo que se usa cada d&iacute;a); y, segundo,
-familiarizarse con c&oacute;mo funciona Emacs. Es interesante ver c&oacute;mo se
-implementa un entorno completamente operativo. Tambi&eacute;n, espero que
-se adquiera el h&aacute;bito de navegar a trav&eacute;s del c&oacute;digo fuente. Se
-puede aprender mucho comparando c&oacute;digo de otros con el propio,
-ganando nuevas ideas. Tener GNU Emacs es como tener la cueva del
-drag&oacute;n de los tesoros.
-</p>
-<p>Adem&aacute;s de aprender acerca de Emacs como editor y Emacs Lisp como
-lenguaje de programaci&oacute;n, los ejemplos y visitas guiadas le
-dar&aacute;n una oportunidad para familiarizarse con Emacs como un
-entorno de programaci&oacute;n Lisp. GNU Emacs soporta programaci&oacute;n y
-provee herramientas que llegar&aacute;n a usarse c&oacute;modamente,
-como <kbd>M-.</kbd> (la clave que invoca el comando
-<code>find-tag</code>). Tambi&eacute;n aprendera sobre b&uacute;ffers y otros
-objetos que forman parte del entorno. Aprender estas funcionalidades de
-Emacs es como aprender nuevas rutas alrededor de tu hogar.
-</p>
-
-<p>Finalmente, espero poder transmitir algunas habilidades de Emacs
-para aprender aspectos de programaci&oacute;n que no se conocen. Con
-frecuencia se puede usar Emacs para ayudar a comprender qu&eacute; puzzles
-encontrar o como hacer alguna cosa nueva. Este auto-descubrimiento no es
-solo un placer, tambi&eacute;n es una ventaja.
-</p>
-<hr>
-<a name="Quien-eres"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Prefacio" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-este-texto" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Prefacio" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Historia-de-Lisp" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Para-quien-esta-esto-escrito"></a>
-<h2 class="unnumberedsec">Para quien est&aacute; esto escrito</h2>
-
-<p>Este texto est&aacute; escrito como una introducci&oacute;n elemental para
-personas que no son programadoras. Quien ya programa, puede no estar
-satisfecho con este libro. La raz&oacute;n es que un programador puede
-tener que convertirse en experto leyendo manuales de referencia y este
-texto no est&aacute; organizado como un manual de referencia.
-</p>
-<p>Un programador experto que revis&oacute; este texto me dijo:
-</p>
-<blockquote>
-<p><i>Prefiero aprender desde manuales de referencia. Yo &ldquo;me sumerjo&rdquo; en
-cada p&aacute;rrafo y &ldquo;subo a por aire&rdquo; entre p&aacute;rrafos.</i>
-</p>
-<p><i>Cuando llego al fin de un p&aacute;rrafo, asumo que este asunto est&aacute;
-hecho, finalizado, que conozco cada cosa que necesito (con la posible
-excepci&oacute;n del caso en el que el siguiente p&aacute;rrafo empiece hablando
-acerca de eso mismo en m&aacute;s detalle). Yo espero que un manual de
-referencia bien escrito no tendr&aacute; un mont&oacute;n de redundancia, y
-tendr&aacute; excelentes punteros a (un) lugar donde est&aacute; la
-informaci&oacute;n que quiero.</i>
-</p></blockquote>
-
-<p>&iexcl;Esta introducci&oacute;n no est&aacute; escrita para esta persona!
-</p>
-<p>Primero, intento decir cada cosa al menos tres veces: primero,
-introducirlo; segundo, mostrarlo en contexto; y tercero, mostrarlo en
-un contexto diferente, o revisarlo.
-</p>
-<p>Segundo, yo no siempre pongo toda la informaci&oacute;n acerca de un asunto
-en un mismo lugar, ni mucho menos en un p&aacute;rrafo. Desde mi punto de
-vista, se necesita una carga bastante fuerte en el lector. En vez de
-eso intento explicar solo lo que se necesita saber en el
-momento. (Algunas veces incluyo una peque&ntilde;a informaci&oacute;n extra,
-para que no haya sorpresas m&aacute;s tarde cuando la informaci&oacute;n
-adicional se presente formalmente.)
-</p>
-<p>Cuando uno lee este texto, no espera aprender todo la primera
-vez. Frecuentemente, solo necesita hacer un &lsquo;reconocimiento&rsquo; con
-alguno de los elementos mencionados. Mi esperanza es haber
-estructurado el texto y dar suficientes indicios que dejar&aacute;n alerta
-de lo que es importante y concentrarse en ellos.
-</p>
-<p>Es necesario &ldquo;sumergirse&rdquo; en algunos p&aacute;rrafos; no hay otro modo de
-leerlos. Pero yo he intentado guardar el n&uacute;mero de tales
-p&aacute;rrafos. Este libro pretende ser como una colina asequible, en vez
-de una monta&ntilde;a abrumadora.
-</p>
-<p>Esta introducci&oacute;n de <cite>Programaci&oacute;n en Emacs Lisp</cite> viene
-acompa&ntilde;ada de un documento complementario.
-<a href="El Manual de Referencia de GNU Emacs Lisp.html#Arriba">(El Manual de Referencia de GNU Emacs Lisp)El Manual de Referencia de GNU Emacs Lisp</a>.
-El manual de referencia tiene m&aacute;s detalles que esta
-introducci&oacute;n. En el manual de referencia, toda la informaci&oacute;n
-sobre un asunto est&aacute; concentrada en un lugar. Se debe cambiar si es
-como el programador citado arriba. Y, por supuesto, despu&eacute;s de haber
-leido esta <cite>Introducci&oacute;n</cite>, ser&aacute; muy &uacute;til consultar el
-<cite>Manual de Referencia</cite> al escribir programas propios.
-</p>
-<hr>
-<a name="Historia-de-Lisp"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Prefacio" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Quien-eres" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Prefacio" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Nota-para-principiantes" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Historia-de-Lisp-1"></a>
-<h2 class="unnumberedsec">Historia de Lisp</h2>
-<a name="index-Historia-de-Lisp"></a>
-
-<p>Lisp fu&eacute; originariamente desarrollado en los 50 en el Instituto
-Tecnol&oacute;gico de Massachusetts para investigar en inteligencia
-artificial. El gran poder del lenguaje Lisp lo hace superior para
-otros prop&oacute;sitos tambi&eacute;n, tal como escribir comandos de edici&oacute;n y
-entornos integrados.
-</p>
-<a name="index-Maclisp"></a>
-<a name="index-Common-Lisp"></a>
-<p>GNU Emacs Lisp est&aacute; fuertemente inspirado en Maclisp, que est&aacute;
-escrito en el MIT en los sesenta. Est&aacute; en cierto modo inspirado en
-Common Lisp, que llega a ser un est&aacute;ndar en los 80. Sin embargo,
-Emacs Lisp es mucho m&aacute;s simple que Common Lisp. (La distribuci&oacute;n
-est&aacute;ndar de Emacs contiene un fichero de extensiones opcional,
-&lsquo;<tt>cl.el</tt>&rsquo;, que a&ntilde;ade muchas funcionalidades a Emacs Lisp.)
-</p>
-<hr>
-<a name="Nota-para-principiantes"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Prefacio" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Historia-de-Lisp" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Prefacio" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Se-agradece" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Una-nota-para-principiantes"></a>
-<h2 class="unnumberedsec">Una nota para principiantes</h2>
-
-<p>Aunque no se conozca GNU Emacs, este documento puede resultar
-&uacute;til. Sin embargo, es mejor aprender Emacs, al menos aprender a
-moverse alrededor de la pantalla del ordenador. Uno puede aprender de
-manera autodidacta c&oacute;mo usar Emacs con el tutorial on-line. Para
-usarlo, se debe escribir <kbd>C-h t</kbd>. (Esto significa que se presione
-la tecla &lt;CTRL&gt; y la <kbd>h</kbd> al mismo tiempo, y despu&eacute;s se
-presiona <kbd>t</kbd>).
-</p>
-<p>Con frecuencia, tambi&eacute;n aludo a uno de los comandos de Emacs
-est&aacute;ndar listando las teclas que se presionan para invocar el
-comando y, luego dar el nombre del comando entre par&eacute;ntesis,
-asi: <kbd>M-C-\</kbd> (<code>indent-region</code>). Esto significa invocar el
-comando <code>indent-region</code> presionando <kbd>M-C-\</kbd>.(Si lo desea, se pueden
-cambiar las teclas que son escritas para invocar el comando; esto se
-llama <em>rebinding</em>. V&eacute;ase la secci&oacute;n <a href="#Mapas-de-teclado">Mapas de Teclado</a>.)
-La abreviaci&oacute;n <kbd>M-C-\</kbd> significa que se presiona la tecla
-&lt;META&gt;, &lt;CTRL&gt;, y &lt;\&gt; todo al mismo tiempo. (En muchos
-teclados modernos la tecla &lt;META&gt; es etiquetada con &lt;ALT&gt;.)
-Algunas veces una combinaci&oacute;n como esta se llama <em>keychord</em>,
-puesto que es similar a tocar un acorde en un piano. Si el teclado no
-tiene una tecla &lt;META&gt;, en su lugar se usa la tecla &lt;ESC&gt;
-como prefijo. En este caso <kbd>M-C-\</kbd> significa que se presiona y libera
-&lt;ESC&gt;
-y luego presiona la tecla &lt;CTRL&gt; y la tecla &lt;\&gt; al mismo
-tiempo. Pero
-normalmente <kbd>M-C-\</kbd> significa presionar la tecla &lt;CTRL&gt; junto
-a la tecla que est&aacute; etiquetada &lt;ALT&gt; y, al mismo tiempo,
-presionar la tecla &lt;\&gt;.
-</p>
-<p>Adem&aacute;s de pulsar una sola combinaci&oacute;n de teclas, se puede
-prefijar lo que se escribe con <kbd>C-u</kbd>, que es llamado el &lsquo;argumento
-universal&rsquo;. El atajo <kbd>C-u</kbd> pasa a ser un argumento para el comando
-subsiguiente. De este modo, para indentar una regi&oacute;n de texto plano
-a 6 espacios, se marca la regi&oacute;n, y entonces se presiona <kbd><span class="nolinebreak">C-u</span>&nbsp;6&nbsp;<span class="nolinebreak">M-C-\</span></kbd>. (Si no se especifica un n&uacute;mero, Emacs pasa el n&uacute;mero 4
-al comando o de otra manera ejecuta el comando de manera
-diferente). See <a href="emacs.html#Argumentos">Argumentos Num&eacute;ricos</a> in <cite>El Manual de GNU Emacs</cite>.
-</p>
-<p>Si se est&aacute; leyendo esto en Info usando GNU Emacs, se puede avanzar a
-trav&eacute;s de este documento completo solo presionando la barra de espacio,
-&lt;SPC&gt;. (Para aprender acerca de Info, presiona <kbd>C-h i</kbd> y
-luego selecciona Info.)
-</p>
-<p>Una nota en terminolog&iacute;a: cuando uso la palabra Lisp
-sola, con frecuencia me estoy refiriendo a los dialectos de Lisp en
-general, pero cuando hablo de Emacs Lisp, me estoy refiriendo a
-GNU Emacs Lisp en particular.
-</p>
-<hr>
-<a name="Se-agradece"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Prefacio" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Nota-para-principiantes" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Prefacio" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Se-agradece-1"></a>
-<h2 class="unnumberedsec">Se agradece</h2>
-
-<p>Estoy agradecido a todas las personas que me ayudaron con este
-libro. Especialmente agradecido a <span class="roman">Jim Blandy</span>, <span class="roman">Noah Friedman</span>,
-Jim&nbsp;Kingdon, <span class="roman">Roland McGrath</span>, Frank&nbsp;Ritter, Randy&nbsp;Smith, Richard&nbsp;M.&nbsp;&nbsp;Stallman, y Melissa&nbsp;Weisshaus. Gracias
-tambi&eacute;n a Philip&nbsp;Johnson y David&nbsp;Stampe por su &aacute;nimo
-paciente. Mis errores son m&iacute;os.
-</p>
-<p align="right">Robert J. Chassell
-<a href="mailto:bob@gnu.org">bob@gnu.org</a>
-</p>
-
-
-
-
-<hr>
-<a name="Procesamiento-de-listas"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Prefacio" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Se-agradece" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Listas-Lisp" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Procesamiento-de-listas-1"></a>
-<h1 class="chapter">1 Procesamiento de listas</h1>
-
-<p>Para el ojo inexperto, Lisp es un lenguaje de
-programaci&oacute;n extra&ntilde;o. En c&oacute;digo Lisp hay par&eacute;ntesis por todas
-partes. Algunas personas incluso reclaman que el nombre signfica &lsquo;Lots
-of Isolated Silly Parentheses&rsquo; (&lsquo;Montones de Par&eacute;ntesis Aislados
-Est&uacute;pidos&rsquo;). Pero la protesta no tiene fundamento. Lisp es para
-procesamiento de listas, y el lenguaje de programaci&oacute;n maneja
-<em>listas</em> (y listas de listas) poni&eacute;ndolas entre
-par&eacute;ntesis. Los par&eacute;ntesis marcan los l&iacute;mites de la
-lista. Algunas veces una lista va precedida por un ap&oacute;strofe simple
-o una marca de cita, &lsquo;<samp>'</samp>&rsquo;<a name="DOCF1" href="#FOOT1">(1)</a>
-Las listas son el fundamento de Lisp.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Listas-Lisp">1.1 Listas Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iquest;Qu&eacute; son listas?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejecutar-un-programa">1.2 Ejecutar un programa</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cualquier lista en Lisp es un programa listo
- para ejecutarse.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Creando-errores">1.3 Generar un mensaje de error</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Generando un mensaje de error.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Nombres-y-definiciones">1.4 Nombres de s&iacute;mbolos y definiciones de funciones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Nombres de s&iacute;mbolos y
- definiciones de funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Interpr_00e9te-Lisp">1.5 El int&eacute;rprete Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Qu&eacute; hace el int&eacute;rprete Lisp.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Evaluaci_00f3n">1.6 Evaluaci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejecutando un programa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Variables">1.7 Variables</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Devolviendo un valor desde una variable.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Argumentos">1.8 Argumentos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Pasando informaci&oacute;n a una funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#set-y-setq">1.9 Configurando el valor de una variable</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Resumen">1.10 Resumen</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Los mayores puntos.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicios-de-mensajes-de-error">1.11 Ejercicios</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicios de mensajes de error
-</td></tr>
-</table>
-
-<hr>
-<a name="Listas-Lisp"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Listas-de-n_00fameros" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Listas-Lisp-1"></a>
-<h2 class="section">1.1 Listas Lisp</h2>
-<a name="index-Listas-Lisp"></a>
-
-<p>En Lisp, una lista como esta: <code>'(rosa violeta margarita
-bot&oacute;ndeoro)</code>. Esta lista es precedida por una comilla.
-Bien, podr&iacute;a estar escrita de la siguente manera, que se
-parece
-m&aacute;s al tipo de lista con la que se est&aacute; familiarizado:
-</p>
-<div class="smallexample">
-<pre class="smallexample">'(rosa
- violeta
- margarita
- bot&oacute;ndeoro)
-</pre></div>
-
-<p>Los elementos de esta lista son los nombres de 4 flores diferentes,
-separados por espacios en blanco y rodeados de par&eacute;ntesis, como
-flores en un campo con un muro de piedras alrededor de ellas.
-<a name="index-Flores-en-un-campo"></a>
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Listas-de-n_00fameros">N&uacute;meros, listas dentro de listas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Lista tener n&uacute;meros, otras listas, en ellas.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#g_t_00c1tomos-Lisp">1.1.1 &Aacute;tomos Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Entidades Elementales.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Espacios-en-blanco-en-listas">1.1.2 Espacios en blanco en listas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Formatenado listas para ser legibles.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Escribiendo-listas">1.1.3 GNU Emacs te ayuda a escribir listas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo GNU Emacs te ayuda a escribir listas.
-</td></tr>
-</table>
-
-<hr>
-<a name="Listas-de-n_00fameros"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Listas-Lisp" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Listas-Lisp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00c1tomos-Lisp" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Numeros_002c-listas-dentro-de-listas"></a>
-<h3 class="unnumberedsubsec">N&uacute;meros, listas dentro de listas</h3>
-
-<p>Las listas pueden tambi&eacute;n tener n&uacute;meros dentro, como en esta lista:
-<code>(+ 2 2)</code>. Esta lista tiene un signo m&aacute;s, &lsquo;<samp>+</samp>&rsquo;, seguido por
-dos &lsquo;<samp>2</samp>&rsquo;, cada uno separado por espacios en blanco.
-</p>
-<p>En Lisp, tanto datos como programas est&aacute;n representados de la misma
-manera; es decir, s&oacute;n a la vez listas de palabras, n&uacute;meros, u otras
-listas,
-separadas por espacios en blanco y rodeadas de par&eacute;ntesis. (Puesto
-que un programa son datos, un programa puede f&aacute;cilmente servir datos
-a otros programas; esta es una funcionalidad muy poderosa de Lisp.)
-(Incidentalmente, estas dos marcas de par&eacute;ntesis <em>no</em> son
-listas Lisp, porque contienen &lsquo;<samp>;</samp>&rsquo; y &lsquo;<samp>.</samp>&rsquo; como marcas
-de puntuaci&oacute;n.)
-</p>
-<p>Aqu&iacute; hay otra lista, esta vez con una lista dentro:
-</p>
-<div class="smallexample">
-<pre class="smallexample">'(esta lista tiene (una lista dentro de ella))
-</pre></div>
-
-<p>Los componentes de esta lista son las palabras &lsquo;<samp>esta</samp>&rsquo;,
-&lsquo;<samp>lista</samp>&rsquo;, &lsquo;<samp>tiene</samp>&rsquo;, y la lista &lsquo;<samp>(una lista dentro de
-ella)</samp>&rsquo;. La lista interior se construye con las palabras &lsquo;<samp>una</samp>&rsquo;,
-&lsquo;<samp>lista</samp>&rsquo;, &lsquo;<samp>dentro</samp>&rsquo;, &lsquo;<samp>de</samp>&rsquo;, &lsquo;<samp>ella</samp>&rsquo;.
-</p>
-<hr>
-<a name="g_t_00c1tomos-Lisp"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Listas-de-n_00fameros" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Listas-Lisp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Espacios-en-blanco-en-listas" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Atomos-Lisp"></a>
-<h3 class="subsection">1.1.1 &Aacute;tomos Lisp</h3>
-<a name="index-Atomos-Lisp"></a>
-
-<p>En Lisp, lo que hemos estado llamando palabras son en realidad
-<em>&aacute;tomos</em>. Este t&eacute;rmino viene del significado hist&oacute;rico de la
-palabra
-&aacute;tomo, que significa &lsquo;indivisible&rsquo;. En lo que a Lisp concierne, las
-palabras
-que hemos estado usando en las listas no pueden ser divididas en
-peque&ntilde;as partes, sin perder su significado dentro del programa; lo
-mismo ocurre con n&uacute;meros y s&iacute;mbolos de un caracterer
-como &lsquo;<samp>+</samp>&rsquo;. Por otro lado, a diferencia de un &aacute;tomo, una
-lista puede ser dividida en peque&ntilde;as partes. Ver <a href="@code{cdr} y @code{cons}.html#Car-cdr-y-cons"><code>car</code></a> in <cite>Funciones Fundamentales</cite>.
-</p>
-<p>En una lista, los &aacute;tomos se separan unos de otros por espacios en
-blanco. Pueden ir pegados a un par&eacute;ntesis.
-</p>
-<a name="index-lista-vacia-definida"></a>
-<p>T&eacute;cnicamente hablando, una lista en Lisp consiste de par&eacute;ntesis
-alrededor de &aacute;tomos separados por espacios en blanco o alrededor de
-otras lista o alrededor de ambos &aacute;tomos u otras listas. Una lista
-puede tener solo un &aacute;tomo o no tener absolutamente nada en
-ella. Una lista con nada dentro se ve as&iacute;: <code>()</code>, y
-se llama <em>lista vac&iacute;a</em>. A diferencia de cualquier
-otra cosa, una lista vac&iacute;a es tanto un &aacute;tomo, como una
-lista al mismo tiempo.
-</p>
-<a name="index-Expresiones-simbolicas_002c-introducidas"></a>
-<a name="index-expresion-definida"></a>
-<a name="index-forma-definida"></a>
-<p>La representaci&oacute;n impresa de &aacute;tomos y listas se llama
-<em>expresiones simb&oacute;licas</em> o, m&aacute;s concisamente,
-<em>s-expresiones</em>. La palabra <em>expresi&oacute;n</em> por s&iacute;
-misma puede referir o bien a la representaci&oacute;n impresa, o al &aacute;tomo
-o a la lista como se maneja internamente en el ordenador. Con
-frecuencia, las personas usan el t&eacute;rmino <em>expresi&oacute;n</em>
-indiscriminadamente. (Tambi&eacute;n, en muchos textos, la palabra
-<em>forma</em> se usa como un sin&oacute;nimo para la expresi&oacute;n.)
-</p>
-<p>Por cierto, los &aacute;tomos que componen nuestro universo fueron nombrados
-as&iacute;
-cuando se pensaba que eran indivisibles; pero
-pero se ha encontrado que los &aacute;tomos fisicos no son
-indivisibles. Las partes pueden dividir un &aacute;tomo o puede fisionarse
-en 2 partes de igual tama&ntilde;o. Los &aacute;tomos f&iacute;sicos
-se nombraron prematuramente, antes de que su verdadera naturaleza
-fuese encontrada. En Lisp, ciertos tipos de &aacute;tomos, como un array,
-pueden ser separados en partes; pero el mecanismo de hacer esto es
-diferente de el mecanismo para dividir una lista. En lo que se refiere
-a operaciones de lista, los &aacute;tomos de una lista
-son indivisibles.
-</p>
-<p>Como en español, el significado de las letras que componen un &aacute;tomo Lisp
-difiere del significado de las letras compuestas como una palabra.
-Por ejemplo, la expresi&oacute;n &lsquo;<samp>ay</samp>&rsquo;, es
-completamente diferente de las dos palabras &lsquo;<samp>a</samp>&rsquo;, e &lsquo;<samp>y</samp>&rsquo;.
-</p>
-<p>Hay muchos tipos de &aacute;tomos en la naturaleza, pero solo unos pocos en Lisp:
-por ejemplo, <em>n&uacute;meros</em>, tales como 37, 511, o 1729, y
-<em>s&iacute;mbolos</em>, tales como &lsquo;<samp>+</samp>&rsquo;, &lsquo;<samp>foo</samp>&rsquo;, o
-&lsquo;<samp>forward-line</samp>&rsquo;. Las palabras que hemos listado en los ejemplos
-anteriores son todos s&iacute;mbolos. En una conversaci&oacute;n cotidiana
-de
-Lisp, la palabra &ldquo;&aacute;tomo&rdquo; no se usa con frecuencia,
-porque los programadores normalmente intentan ser m&aacute;s
-espec&iacute;ficos acerca de que tipo de &aacute;tomo est&aacute;n
-tratando. La programaci&oacute;n Lisp es sobre todo de
-s&iacute;mbolos (y algunas veces n&uacute;meros) con
-listas. (De ese modo, tres palabras rodeadas de par&eacute;ntesis son una
-apropiada lista en Lisp, ya que consiste de &aacute;tomos, que en
-este caso son s&iacute;mbolos, separados por espacios en blanco
-y cerrados por par&eacute;ntesis, sin ninguna puntuaci&oacute;n no Lisp.)
-</p>
-<p>Texto entre comillas&mdash;incluso frases o p&aacute;rrafos&mdash;son
-tambi&eacute;n un &aacute;tomo. Aqu&iacute; hay un ejemplo:
-<a name="index-Texto-entre-comillas"></a>
-</p>
-<div class="smallexample">
-<pre class="smallexample">'(esta lista incluye &quot;texto entre comillas.&quot;)
-</pre></div>
-
-<a name="index-cadena-definida"></a>
-<p>En Lisp, todo el texto citado incluyendo la marca de puntuaci&oacute;n y
-los espacios en blanco son un solo &aacute;tomo. Este tipo de &aacute;tomo es
-llamado <em>string</em> (por &lsquo;cadena de caracteres&rsquo;) y es el tipo de cosa
-que es usada para mensajes que un ordenador puede imprimir para que un
-humano lea. Las cadenas son un tipo de &aacute;tomo diferente a los
-n&uacute;meros, o s&iacute;mbolos y se usan de manera diferente.
-</p>
-<hr>
-<a name="Espacios-en-blanco-en-listas"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00c1tomos-Lisp" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Listas-Lisp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-listas" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Espacios-en-blanco-en-listas-1"></a>
-<h3 class="subsection">1.1.2 Espacios en blanco en listas</h3>
-<a name="index-Espacio-en-blanco-en-listas"></a>
-
-<p>La cantidad de espacios en blanco en una lista no importa. Desde el
-punto de vista del lenguaje Lisp,
-</p>
-<div class="smallexample">
-<pre class="smallexample">'(esta lista
- parece esto)
-</pre></div>
-
-<p>es exactamente lo mismo que esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">'(esta lista parece esto)
-</pre></div>
-
-<p>Ambos ejemplos muestran que en Lisp es la misma lista, la lista hecha de
-los s&iacute;mbolos &lsquo;<samp>esta</samp>&rsquo;, &lsquo;<samp>lista</samp>&rsquo;, &lsquo;<samp>parece</samp>&rsquo;,
-y &lsquo;<samp>esto</samp>&rsquo; en este orden.
-</p>
-<p>Los espacios en blanco adicionales y los saltos de l&iacute;nea est&aacute;n
-dise&ntilde;ados
-para crear una lista m&aacute;s legible por humanos. Cuando Lisp lee la
-expresi&oacute;n, asimila los espacios en blanco extra (pero necesita tener
-al menos un espacio entre &aacute;tomos en orden para contarlos aparte.)
-</p>
-<p>Aunque parezca raro, los ejemplos que hemos visto cubren casi todo lo
-aparece en las listas Lisp. Cualquier otra lista en Lisp se ve m&aacute;s o menos
-igual a uno
-de estos ejemplos, excepto que la lista puede ser m&aacute;s larga y m&aacute;s
-compleja. En resumen, una lista est&aacute; entre par&eacute;ntesis, una cadena
-est&aacute; entre comillas, un s&iacute;mbolo parece como una
-palabra, y un n&uacute;mero parece un n&uacute;mero. (Para ciertas situaciones,
-corchetes, puntos y otros caracteres especiales pueden ser usados; sin
-embargo; iremos bastante lejos sin ellos.)
-</p>
-<hr>
-<a name="Escribiendo-listas"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Espacios-en-blanco-en-listas" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Listas-Lisp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejecutar-un-programa" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="GNU-Emacs-te-ayuda-a-escribir-listas"></a>
-<h3 class="subsection">1.1.3 GNU Emacs te ayuda a escribir listas</h3>
-<a name="index-Ayuda-escribiendo-listas"></a>
-<a name="index-Formateando-ayuda"></a>
-
-<p>Cuando se escribe una expresi&oacute;n Lisp en GNU Emacs usando bien el
-modo de Interacci&oacute;n Lisp o el modo Emacs Lisp, est&aacute;n disponibles
-varios comandos para formatear la expresi&oacute;n Lisp, de modo que sea
-f&aacute;cil de leer. Por ejemplo, presionando la tecla &lt;TAB&gt;
-autom&aacute;ticamente se indenta la l&iacute;nea donde se encuetra el
-cursor
-a la cantidad correcta. Un comando para indentar
-apropiadamente el c&oacute;digo en una regi&oacute;n est&aacute; asociado a
-<kbd>M-C-\</kbd>. La indentaci&oacute;n est&aacute; dise&ntilde;ada de modo que se pueda ver qué
-elementos percecen a cada lista&mdash;los
-elementos de una sublista est&aacute;n m&aacute;s indentados que los elementos
-de una lista cerrada.
-</p>
-<p>Adem&aacute;s, cuando se escribe un par&eacute;ntesis de cierre, Emacs
-moment&aacute;neamente salta el cursor atr&aacute;s para hacer el matching
-(emparejamiento) con el par&eacute;ntesis de apertura, para ver cu&aacute;l
-es. Esto es muy &uacute;til, ya que cada lista que se escribe en Lisp debe
-tener sus par&eacute;ntesis emparejados con sus par&eacute;ntesis de
-apertura. (Ver <a href="El Manual de GNU Emacs.html#Modos-Mayores">(El Manual de GNU Emacs)emacs</a>, para m&aacute;s informaci&oacute;n acerca de modos de Emacs.)
-</p>
-<hr>
-<a name="Ejecutar-un-programa"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-listas" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Creando-errores" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejecutar-un-programa-1"></a>
-<h2 class="section">1.2 Ejecutar un programa</h2>
-<a name="index-Ejecuta-un-programa"></a>
-<a name="index-Programa_002c-ejecutando-uno"></a>
-
-<a name="index-se-definio-evaluate"></a>
-<p>Una lista en Lisp &mdash;cualquier lista&mdash; es un programa listo para ser
-ejecutado. Si lo ejecutas (lo que la jerga Lisp llama <em>evaluar</em>),
-el ordenador har&aacute; una de tres cosas: nada excepto devolverte la
-lista misma; enviar un mensaje de error; o, tomar el primer
-s&iacute;mbolo en la lista como un comando para hacer alguna
-cosa. (&iexcl;Normalmente, es lo &uacute;ltimo de estas tres cosas de
-lo que realmente se quiere!).
-</p>
-<p>El ap&oacute;strofe, <code>'</code>, que se pone enfrente de alg&uacute;nos ejemplos de
-lista en secciones anteriores se llama <em>quote</em>; (citar);
-cuando precede a una lista, se informa a Lisp no hacer nada con la lista,
-mas que la tomarla tal como est&aacute; escrita. Pero si no hay una cita
-precediendo la lista, el primer &iacute;tem de la lista es
-especial: es un comando para que el ordenador obedezca. (En Lisp,
-estos comandos son llamados <em>funciones</em>.) A continuación se muestra la
-lista no citada <code>(+ 2 2)</code>, por lo que Lisp comprende que
-<code>+</code> es una instrucci&oacute;n para hacer alguna cosa con
-el resto de la lista: suma los n&uacute;meros que siguen.
-</p>
-<p>Si est&aacute;s leyendo esto dentro de GNU Emacs en Info,
-aqu&iacute; est&aacute; como puedes evaluar una lista: coloca tu cursor
-justo después del paréntesis derecho de la siguiente lista y presiona
-<kbd>C-x C-e</kbd>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 2 2)
-</pre></div>
-
-<p>Ver&aacute;s que el n&uacute;mero <code>4</code> aparece en el &aacute;rea echo. (En la jerga, lo
-que acabas de hacer es &ldquo;evaluar la lista.&rdquo; El &aacute;rea echo es la
-l&iacute;nea en la parte inferior de la pantalla que muestra o
-hace &ldquo;echo&rdquo; del texto). Ahora intenta la misma cosa con una lista
-citada: posiciona el cursor justo despu&eacute;s de la siguiente
-lista y presiona <kbd>C-x C-e</kbd>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">'(esto es una lista con comillas)
-</pre></div>
-
-<p>Se ver&aacute; aparecer <code>(esto es una lista con comillas)</code> en el &aacute;rea
-echo.
-</p>
-<a name="index-Interprete-Lisp_002c-explicada"></a>
-<a name="index-Interprete_002c-Lisp_002c-explicado"></a>
-<p>En ambos casos, lo que est&aacute;s haciendo es dar un comando al programa
-dentro de GNU Emacs llamado <em>int&eacute;rprete Lisp</em> &mdash; dando al
-int&eacute;rprete un comando para evaluar la expresi&oacute;n. El nombre del
-int&eacute;rprete Lisp viene de la palabra para la tarea hecha por un
-humano que viene con el significado de una expresi&oacute;n &mdash; quien lo
-&ldquo;interpreta&rdquo;.
-</p>
-<p>Tambi&eacute;n se puede evaluar un &aacute;tomo que no es parte de una lista &mdash;
-uno que no est&aacute; rodeado por par&eacute;ntesis; de nuevo, el int&eacute;rprete
-Lisp traduce desde la expresi&oacute;n humanamente legible al lenguaje del
-ordenador. Pero antes de discutir esto (ver <a href="#Variables">Variables</a>), vamos a
-discutir lo que el int&eacute;rprete de Lisp hace cuando tu creas el
-error.
-</p>
-<hr>
-<a name="Creando-errores"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejecutar-un-programa" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Nombres-y-definiciones" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Generar-un-mensaje-de-error"></a>
-<h2 class="section">1.3 Generar un mensaje de error</h2>
-<a name="index-Genera-un-mensaje-de-error"></a>
-<a name="index-Generacion-de-mensaje-de-Error"></a>
-
-<p>No se preocupe si genera un mensaje de error de manera accidental, ahora
-daremos un comando al int&eacute;rprete de Lisp que genara un mensaje de error.
-Esta es una accion inofensiva; y de hecho, a menudo se intenta generar
-mensajes de error de manera intencional. Una vez se comprende la
-jerga, los mensajes de error pueden ser informativos. En vez de ser
-llamados mensajes de &ldquo;error&rdquo;, deber&iacute;an ser llamados
-mensajes de &ldquo;ayuda&rdquo;. Son como letreros para un viajero en un país extraño;
-descifrarlos puede ser duro, pero una vez comprendidos, pueden señalar el
-camino.
-</p>
-<p>El mensaje de error es generado por un depurador de c&oacute;digo
-incorporado dentro de GNU Emacs. As&iacute; se &lsquo;entra al
-depurador&rsquo;. Se puede salir del depurador pulsando <code>q</code>.
-</p>
-<p>Lo que se hace es evaluar una lista que no est&aacute; citada y no tiene un
-comando con significado como su primer elemento. Aqu&iacute;
-hay una lista casi exactamente igual a la que acabamos de usar, pero sin
-la cita al inicio. Coloque el cursor a la derecha donde esta finaliza y
-presione <kbd>C-x C-e</kbd>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(esto es una lista sin cita)
-</pre></div>
-
-
-<p>Se abrir&aacute; una ventana &lsquo;<tt>*Backtrace*</tt>&rsquo; y se ver&aacute; lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">---------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error: (void-function esto)
- (esto es una lista sin cita)
- eval((esto es una lista sin cita) nil)
- eval-last-sexp-1(nil)
- eval-last-sexp(nil)
- call-interactively(eval-last-sexp nil nil)
- command-execute(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-</pre></div>
-
-<p>Su cursor estar&aacute; en esta ventana (puede tener que esperar unos
-pocos segundos antes de que sea visible). Para salir del
-depurador y de su ventana, presione:
-</p>
-<div class="smallexample">
-<pre class="smallexample">q
-</pre></div>
-
-<p>Por favor, ahora pulsa <kbd>q</kbd>, as&iacute; se comprueba que se
-puede salir del depurador. A continuacion, presione &quot;<kbd>C-x C-e</kbd> una
-vez m&aacute;s para re-entrar.
-</p>
-<a name="index-funcion-definida"></a>
-<p>Sobre la base de lo que ya sabemos, casi podemos leer este mensaje de error.
-</p>
-<p>Leer el b&uacute;ffer &lsquo;<tt>*Backtrace*</tt>&rsquo; de abajo hacia arriba; informa lo que
-Emacs ha hecho. Cuando se presiona <kbd>C-x C-e</kbd>, se hace una llamada
-interactiva a el comando <code>eval-last-sexp</code>. <code>eval</code> es una
-abreviatura para &lsquo;evaluar&rsquo; y <code>sexp</code> es una abreviatura para
-&lsquo;expresi&oacute;n simb&oacute;lica&rsquo;. El comando significa &lsquo;eval&uacute;a la
-&uacute;ltima expresi&oacute;n simb&oacute;lica&rsquo;, que es la expresi&oacute;n justo antes
-de tu cursor.
-</p>
-<p>Cada l&iacute;nea anterior a esta cuenta lo que el int&eacute;rprete de
-Lisp evaluo despu&eacute;s. La acci&oacute;n m&aacute;s reciente est&aacute; en la parte
-superior. El
-b&uacute;ffer es llamado &lsquo;<tt>*Backtrace*</tt>&rsquo; ya que permite realizar un
-seguimiento
-de Emacs hacia atr&aacute;s.
-</p>
-<p>En la parte superior del b&uacute;ffer &lsquo;<tt>*Backtrace*</tt>&rsquo;, ver&aacute; la
-l&iacute;nea:
-</p>
-<div class="smallexample">
-<pre class="smallexample">Debugger entered--Lisp error: (void-function esto)
-</pre></div>
-
-<p>El int&eacute;rprete Lisp intent&oacute; evaluar el primer &aacute;tomo de la lista,
-la palabra &lsquo;<samp>esto</samp>&rsquo;. Esta es la acci&oacute;n que gener&oacute; el mensaje de error
-&lsquo;<samp>void-function esto</samp>&rsquo;.
-</p>
-<p>El mensaje contiene las palabras &lsquo;<samp>void-function</samp>&rsquo; y &lsquo;<samp>esto</samp>&rsquo;.
-</p>
-<a name="index-funcion-definida-1"></a>
-<p>La palabra &lsquo;<samp>function</samp>&rsquo; fu&eacute; mencionada antes. Es una palabra muy
-importante. Para nuestros prop&oacute;sitos, podemos definirla diciendo
-que una <em>funci&oacute;n</em> (<em>function</em>) es un conjunto de
-instrucciones para decirle al ordenador que haga alguna cosa.
-</p>
-<p>Ahora podemos empezar a comprender el mensaje de error:
-&lsquo;<samp>void-function this</samp>&rsquo;. La funci&oacute;n (que es, la palabra
-&lsquo;<samp>this</samp>&rsquo;) no tiene la definici&oacute;n de ningun conjunto de
-instrucciones que el ordenador pueda realizar.
-</p>
-<p>La palabra ligeramente extra&ntilde;a, &lsquo;<samp>void-function</samp>&rsquo;, est&aacute; dise&ntilde;ada
-para
-cubrir la forma en que Emacs Lisp lo implementa, que es cuando un s&iacute;mbolo
-no tiene una definici&oacute;n de funci&oacute;n atribuido, el sitio que contiene la
-instrucci&oacute;n esta &lsquo;vac&iacute;o&rsquo; (&lsquo;<samp>void</samp>&rsquo;).
-</p>
-<p>Por otro lado, ya que fuimos capaces de a&ntilde;adir 2 m&aacute;s 2 de
-manera exitosa, evaluando <code>(+ 2 2)</code>, se puede inferir que el
-s&iacute;mbolo <code>+</code> debe tener un conjunto de instrucciones
-que el ordenador ejecuta y estas instrucciones deben sumar
-los n&uacute;meros despues del <code>+</code>.
-</p>
-<p>Es posible evitar que Emacs entre en el depurador en casos como
-este. No se explicar&aacute; c&oacute;mo hacer esto aqu&iacute;, pero se
-mencionar&aacute; un resultado asi, porque se puede encontrar una
-situaci&oacute;n similar si hay un error en alg&uacute;n c&oacute;digo de Emacs que
-este usando. En tales casos, ver&aacute; solo una l&iacute;nea del
-mensaje de error; aparecer en el &aacute;rea echo con el siguente aspecto
-</p>
-<div class="smallexample">
-<pre class="smallexample">Symbol's function definition is void: esto
-</pre></div>
-
-<p>El mensaje aparece tan pronto se presiono una tecla, aunque sólo sea para
-mover el cursor.
-</p>
-<p>Conocemos el significado de la palabra
-&lsquo;<samp>S&iacute;mbolo</samp>&rsquo;. Se refiere al primer &aacute;tomo de la
-lista, la palabra &lsquo;<samp>este</samp>&rsquo;. La palabra &lsquo;<samp>funci&oacute;n</samp>&rsquo; se refiere
-a las instrucciones que dicen al ordenador que
-hacer. (T&eacute;cnicamente, el s&iacute;mbolo indica al ordenador
-donde encontrar las instrucciones, pero esta es una complicaci&oacute;n que
-podemos ignorar por el momento.)
-</p>
-<p>El mensaje de error puede ser comprendido: &lsquo;<samp>La definici&oacute;n del
-s&iacute;mbolo est&aacute; vac&iacute;a: este</samp>&rsquo;. El
-s&iacute;mbolo (que es, la palabra &lsquo;<samp>este</samp>&rsquo;) carece de
-instrucciones que el ordenador realize.
-</p>
-<hr>
-<a name="Nombres-y-definiciones"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Creando-errores" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Interpr_00e9te-Lisp" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Nombres-de-simbolos-y-definiciones-de-funciones"></a>
-<h2 class="section">1.4 Nombres de s&iacute;mbolos y definiciones de funciones</h2>
-<a name="index-Nombres-de-Simbolos"></a>
-
-<p>Se puede articular otra caracter&iacute;stica de Lisp basada en
-lo que se discuti&oacute; hace tiempo&mdash;una caracter&iacute;stica
-importante: un s&iacute;mbolo, como <code>+</code>, no es en
-s&iacute; mismo el conjunto de instrucciones que el ordenador
-realiza. En su lugar, el s&iacute;mbolo es usado,
-quiz&aacute;s temporalmente, como una manera de localizar la definici&oacute;n o
-conjunto de instrucciones. Lo que vemos es el nombre
-con el cual se pueden encontrar las instrucciones. Los nombres de las
-personas
-funcionan de la misma manera. Por ejemplo, puede referirse a mi
-como &lsquo;<samp>Bob</samp>&rsquo;; sin embargo, no soy las letras &lsquo;<samp>B</samp>&rsquo;, &lsquo;<samp>o</samp>&rsquo;, &lsquo;<samp>b</samp>&rsquo;
-pero soy, o
-o fu&iacute;, conscientemente asociado con una forma de vida
-particular. El
-nombre no soy yo, pero puede ser usado para referirme.
-</p>
-<p>En Lisp, un conjunto de instrucciones puede ligarse a varios
-nombres. Por ejemplo, las instrucciones de ordenador para a&ntilde;adir
-n&uacute;meros pueden ser enlazados al s&iacute;mbolo <code>m&aacute;s</code>
-tan bien como el s&iacute;mbolo <code>+</code> (y se encuantran en algunos
-dialectos de Lisp). Entre humanos, puede referirse a &lsquo;<samp>Robert</samp>&rsquo; tan
-bien como &lsquo;<samp>Bob</samp>&rsquo; y en otras palabras tambi&eacute;n.
-</p>
-<p>Por otra parte, un s&iacute;mbolo puede estar ligado solo con una
-funci&oacute;n
-a la vez. De lo contrario, el ordenador
-estar&iacute;a confundido acerca de qu&eacute; definici&oacute;n usar. Si
-este fuera el caso, solo una persona en el mundo podr&iacute;a
-llamarse &lsquo;<samp>Bob</samp>&rsquo;. Sin embargo, la definici&oacute;n de funci&oacute;n a la
-que el nombre hace referencia puede cambiarse f&aacute;cilmente.
-(Ver <a href="#Instalar">Instalar una Definici&oacute;n de Funci&oacute;n</a>.)
-</p>
-<p>Ya que Emacs Lisp es extenso, se acostumbra nombrar los
-s&iacute;mbolos de un modo que pueda establecerse a que parte de
-Emacs
-pertenece la funci&oacute;n. En consecuencia, todos los nombres de
-funciones relacionadas con Texinfo empiezan con &lsquo;<samp>texinfo-</samp>&rsquo; y aquellas
-relaciondas con la lectura de correo empiezan con
-&lsquo;<samp>rmail-</samp>&rsquo;.
-</p>
-<hr>
-<a name="Interpr_00e9te-Lisp"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Nombres-y-definiciones" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Complicaciones" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-interprete-Lisp"></a>
-<h2 class="section">1.5 El int&eacute;rprete Lisp</h2>
-<a name="index-Interprete-Lisp_002c-que-hace"></a>
-<a name="index-Interprete_002c-que-hace"></a>
-
-<p>Basado en lo que se ha visto, ahora podemos empezar a entender lo que
-el int&eacute;prete Lisp hace cuando mandamos a evaluar una
-lista. Primero, examina si hay un s&iacute;mbolo cita
-antes de la lista; si lo hay, el int&eacute;rprete nos da la lista. Por otro
-lado, si no hay cita, el int&eacute;prete mira si el primer elemento en la
-lista tiene una definici&oacute;n de funci&oacute;n. Si no, el
-int&eacute;rprete imprime un mensaje de error.
-</p>
-<p>As&iacute; es como Lisp trabaja. Simple. Hay complicaciones
-a&ntilde;adidas que veremos en un minuto, pero estos son
-los fundamentos. Claro est&aacute;, para escribir programas Lisp, se necesita
-conocer como escribir definiciones de funci&oacute;n y vincularlas a
-nombres, y como hacer esto sin confundirnos a nosotros mismos o al
-ordenador.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Complicaciones">Complicaciones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Variables, formas especiales, Listas.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Compilaci_00f3n-de-bytes">1.5.1 Compilaci&oacute;n de bytes</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Especialmente procesando c&oacute;digo por la
- velocidad.
-</td></tr>
-</table>
-
-<hr>
-<a name="Complicaciones"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Interpr_00e9te-Lisp" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Interpr_00e9te-Lisp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Compilaci_00f3n-de-bytes" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Complicaciones-1"></a>
-<h3 class="unnumberedsubsec">Complicaciones</h3>
-
-<p>Ahora, una primera complicaci&oacute;n. Adem&aacute;s de las listas, el
-int&eacute;rprete Lisp puede evaluar un s&iacute;mbolo no
-citado que no tiene par&eacute;ntesis
-en torno a el. El int&eacute;rprete Lisp intentar&aacute; determinar el valor del
-s&iacute;mbolo como una <em>variable</em>. Esta situaci&oacute;n es
-descrita en el apartado de las variablesla. (Ver <a href="#Variables">Variables</a>.)
-</p>
-<a name="index-Forma-Especial"></a>
-<p>La segunda complicaci&oacute;n ocurre debido a que algunas funciones son
-inusuales y no funcionan de la manera habitual. Estas son llamadas
-<em>formas especiales</em>. Son usadas para trabajos especiales, como
-definir una funci&oacute;n, y no son muchas de ellas. En los siguientes
-cap&iacute;tulos, se introducir&aacute;n varias de las
-formas especiales m&aacute;s importantes.
-</p>
-<p>La tercera y final complicaci&oacute;n es la siguiente: si la funci&oacute;n que
-el int&eacute;rprete Lisp est&aacute; buscando no es una forma especial, y si
-es parte de una lista, el int&eacute;rprete Lisp mira si la lista
-tiene una lista dentro de ella. Si hay una lista dentro, el int&eacute;rprete
-Lisp
-primero descubre qu&eacute; hacer con la lista interior, y luego trabaja en la
-lista exterior. Si a&uacute;n hay otra lista embebida
-dentro de la lista interna, trabaja en esta primero, y
-as&iacute;. Siempre se trabaja en la lista m&aacute;s interna primero. El
-int&eacute;rprete trabaja en la lista más interana primero, para evaluar el
-resultado de esta lista. El resultado puede ser usado por la
-expresi&oacute;n entre par&eacute;ntesis.
-</p>
-<p>Por lo dem&aacute;s, el int&eacute;rprete trabaja de izquierda a derecha, desde
-una expresi&oacute;n a la siguiente.
-</p>
-<hr>
-<a name="Compilaci_00f3n-de-bytes"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Complicaciones" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Interpr_00e9te-Lisp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Evaluaci_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Compilacion-de-bytes"></a>
-<h3 class="subsection">1.5.1 Compilaci&oacute;n de bytes</h3>
-<a name="index-Compilando-Byte"></a>
-
-<p>Otro aspecto de interpretaci&oacute;n: el int&eacute;rprete Lisp es capaz de
-interpretar dos tipos de entidad: c&oacute;digo humanamente legible, en el
-que nos centraremos exclusivamente, y c&oacute;digo especialmente procesado,
-llamado <em>byte compilado</em>, que no es humanamente legible. El
-c&oacute;digo m&aacute;quina compilado se ejecuta m&aacute;s r&aacute;pido que el c&oacute;digo
-humanamente legible.
-</p>
-<p>Tu puedes transformar c&oacute;digo legible por humanos en c&oacute;digo compilado
-ejecutando uno de los comandos de compilacion como
-<code>byte-compile-file</code>. El c&oacute;digo compilado es normalmente
-almacenado en un fichero que finaliza con una extensi&oacute;n &lsquo;<tt>.elc</tt>&rsquo;
-en vez de una extensi&oacute;n &lsquo;<tt>.el</tt>&rsquo;. Ver&aacute;s ambos tipos de ficheros
-en el directorio &lsquo;<tt>emacs/lisp</tt>&rsquo;; los ficheros para leer estos
-tienen la extensi&oacute;n &lsquo;<tt>.el</tt>&rsquo;.
-</p>
-<p>Como una cuesti&oacute;n pr&aacute;ctica, para hacer la mayor&iacute;a de las
-cosas como personalizar o extender Emacs, no
-necesitas compilar byte; y no comentare el asunto
-aqu&iacute;. Ver <a href="elisp.html#Compilaci_00f3n-de-Byte">Compilaci&oacute;n de Byte</a> in <cite>El Manual de Referencia de GNU Emacs</cite>, para una completa
-descripci&oacute;n sobre compilar c&oacute;digo.
-</p>
-<hr>
-<a name="Evaluaci_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Compilaci_00f3n-de-bytes" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#C_00f3mo-el-int_00e9rprete-act_00faa" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Evaluacion"></a>
-<h2 class="section">1.6 Evaluaci&oacute;n</h2>
-<a name="index-Evaluacion"></a>
-
-<p>Cuando el int&eacute;rprete Lisp trabaja en una expresi&oacute;n, el t&eacute;rmino
-para la actividad es llamada <em>evaluaci&oacute;n</em>. Decimos que el
-int&eacute;rprete &lsquo;eval&uacute;a la expresi&oacute;n&rsquo;. Yo he usado este t&eacute;rmino
-varias veces antes. La palabra proviene de su uso en el lenguaje
-cotidiano, &lsquo;para determinar el valor o la cantidad de; para
-estimar&rsquo; de acuerdo a <cite>Webster&rsquo;s New Collegiate Dictionary</cite>.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#C_00f3mo-el-int_00e9rprete-act_00faa">C&oacute;mo el int&eacute;rprete act&uacute;a</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Devolver y Efectos Colaterales...
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Evaluando-listas-propias">1.6.1 Evaluando listas propias</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Listas con listas...
-</td></tr>
-</table>
-
-<hr>
-<a name="C_00f3mo-el-int_00e9rprete-act_00faa"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Evaluaci_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Evaluaci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Evaluando-listas-propias" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Como-el-interprete-actua"></a>
-<h3 class="unnumberedsubsec">C&oacute;mo el int&eacute;rprete act&uacute;a</h3>
-
-<a name="index-valor-devuelto-explicado"></a>
-<p>Despu&eacute;s de evaluar una expresi&oacute;n, el int&eacute;rprete Lisp normalmente
-<em>devuelve</em> el valor que el ordenador produce al llevar a cabo
-las instrucciones encontradas en la definici&oacute;n de la funci&oacute;n, o
-quiz&aacute;s dar&aacute; esta funci&oacute;n y producir&aacute; un mensaje de error. (El
-int&eacute;rprete puede tambi&eacute;n quedarse colgado, por as&iacute;
-decirlo, a una funci&oacute;n diferente o puede intentar repetir
-continuamente lo que est&aacute; haciendo y para siempre en lo que
-se llama un &lsquo;bucle infinito&rsquo;. Estas acciones son menos
-comunes; y pueden ignorarse). M&aacute;s frecuentemente, el int&eacute;rprete
-devuelve un valor.
-</p>
-<a name="index-efecto-lateral-definido"></a>
-<p>Al mismo tiempo el int&eacute;rprete devuelve un valor, puede hacer
-cualquier cosa m&aacute;s tambi&eacute;n, tal como mover un cursor o copiar un
-fichero; este otro tipo de acci&oacute;n es llamado <em>efecto
-secundario</em>. Acciones que los humanos creen que son importantes tales
-como imprimir resultados, con frecuencia son, &ldquo;efectos secundarios&rdquo; del
-int&eacute;rprete Lisp. La jerga puede sonar peculiar, pero resulta que es
-bastante f&aacute;cil aprender a utilazar los efectos secundarios.
-</p>
-<p>En resumen, evaluar una expresi&oacute;n simb&oacute;lica normalmente
-causa que el int&eacute;rprete devuelva un valor y tal vez llevar a cabo un
-efecto
-secundario; o al menos produce un error.
-</p>
-<hr>
-<a name="Evaluando-listas-propias"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#C_00f3mo-el-int_00e9rprete-act_00faa" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Evaluaci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Variables" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Evaluando-listas-propias-1"></a>
-<h3 class="subsection">1.6.1 Evaluando listas propias</h3>
-<a name="index-Evaluacion-de-listas-internas"></a>
-<a name="index-Evaluando-listas-internas"></a>
-
-<p>Si la evaluaci&oacute;n se aplica a una lista que est&aacute; dentro de una
-lista, la lista externa puede usar el valor devuelto por la primera
-evaluaci&oacute;n como informaci&oacute;n cuando la lista externa es
-evaluada. Esto explica por qu&eacute; las expresiones internas son evaluadas
-primero: los valores devueltos son usados por las expresiones
-externas.
-</p>
-<p>Nosotros podemos investigar este proceso evaluando otro ejemplo
-adicional. Coloca tu cursor despu&eacute;s de la siguiente expresi&oacute;n y
-presiona <kbd>C-x C-e</kbd>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 2 (+ 3 3))
-</pre></div>
-
-<p>El n&uacute;mero 8 aparecer&aacute; en el &aacute;rea echo.
-</p>
-<p>Lo que ocurre es que el int&eacute;rprete Lisp primero eval&uacute;a la
-expresi&oacute;n interna, <code>(+ 3 3)</code>, para que el valor 6 se devuelva;
-a continuaci&oacute;n eval&uacute;a la expresi&oacute;n externa como si fuera escrita
-<code>(+ 2 6)</code>, que devuelve el valor 8. Puesto que no hay m&aacute;s
-expresiones entre parentesis a evaluar el int&eacute;rprete imprime este valor
-en el &aacute;rea echo.
-</p>
-<p>Ahora es f&aacute;cil comprender el nombre del comando invocado por
-el atajo <kbd>C-x C-e</kbd>: el nombre es <code>eval-last-sexp</code>. Las letras
-<code>sexp</code> son una abreviaci&oacute;n para &lsquo;expresi&oacute;n simb&oacute;lica&rsquo;, y
-<code>eval</code> es una abreviaci&oacute;n para &lsquo;evaluar&rsquo;. El comando significa
-&lsquo;evaluar la &uacute;ltima expresi&oacute;n simb&oacute;lica&rsquo;.
-</p>
-<p>Como un experimento, puedes intentar evaluar la expresi&oacute;n
-poniendo el cursor al principio de la siguiente l&iacute;nea
-inmediatamente despu&eacute;s de la expresi&oacute;n, o dentro de la expresi&oacute;n.
-</p>
-<p>Aqu&iacute; hay otra copia de la expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 2 (+ 3 3))
-</pre></div>
-
-<p>Si se posiciona el cursor al principio de la l&iacute;nea en
-blanco que sigue inmediatamente a la expresi&oacute;n y presionas <kbd>C-x
-C-e</kbd>, todav&iacute;a se obtendr&aacute; el valor 8 impreso en el
-&aacute;rea echo. Ahora intenta poner el cursor dentro de la
-expresi&oacute;n. Si lo coloca justo despu&eacute;s del penultimo
-par&eacute;ntesis (dara la impresi&oacute;n de situarse sobre el
-&uacute;ltimo par&eacute;ntesis), &iexcl;obtendr&aacute; un 6 impreso en
-el &aacute;rea echo! Esto es porque el comando eval&uacute;a la expresi&oacute;n
-<code>(+ 3 3)</code>.
-</p>
-<p>Ahora coloque el cursor inmediatamente despu&eacute;s de un
-n&uacute;mero. Presiona <kbd>C-x C-e</kbd> y obtendr&aacute; el n&uacute;mero en
-s&iacute;. En Lisp, si eval&uacute;as un n&uacute;mero, obtienes el
-n&uacute;mero en s&iacute;&mdash;as&iacute; es c&oacute;mo los n&uacute;meros difieren
-de los s&iacute;mbolos. Si se eval&uacute;a una lista que inicia con
-un s&iacute;mbolo como <code>+</code>, tendr&aacute;s un valor devuelto
-que es el resultado del ordenador tras ejecutar las instrucciones que
-aparecen
-en la definici&oacute;n de la funci&oacute;n adjunta a este nombre. Si un
-s&iacute;mbolo por s&iacute; mismo es evaluado, algo
-diferente sucede, como veremos en la siguiente secci&oacute;n.
-</p>
-<hr>
-<a name="Variables"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Evaluando-listas-propias" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-de-rellenar-columna" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Variables-1"></a>
-<h2 class="section">1.7 Variables</h2>
-<a name="index-Variables"></a>
-
-<p>En Emacs Lisp, un s&iacute;mbolo puede estar ligado a un valor
-como a una definici&oacute;n de funci&oacute;n. Las dos son
-diferentes. La definici&oacute;n de funci&oacute;n es un conjunto de
-instrucciones que el ordenador ejecuta. Un valor, por otro lado, es
-algo, como un n&uacute;mero o un nombre, que puede variar (es por ello, que
-tal s&iacute;mbolo es llamado variable). El valor
-de un s&iacute;mbolo puede ser cualquier expresi&oacute;n en Lisp, por
-ejemplo un s&iacute;mbolo, n&uacute;mero, lista, o cadena. Un
-s&iacute;mbolo que tiene un valor es con frecuencia llamado una
-<em>variable</em>.
-</p>
-<p>Un s&iacute;mbolo puede tener ambos, una definici&oacute;n de
-funci&oacute;n y un valor adjunto al mismo tiempo. O puede tener solo uno u
-otro. Los dos son independientes. Esto es algo similar a la forma en que el
-nombre Cambridge puede referirse a la ciudad en Massachusetts y tener
-alguna informaci&oacute;n ligada al nombre, por ejemplo, un &ldquo;gran
-centro de programaci&oacute;n&rdquo;.
-</p>
-
-<p>Otra forma de pensar en esto es imaginar un s&iacute;mbolo como un mueble con
-cajones. La definici&oacute;n de funci&oacute;n se pone en un caj&oacute;n, el valor en
-otro, y
-asi sucesivamente. Lo que se pone en el cajón que contiene el valor puede
-ser cambiado sin afectar los contenidos del caj&oacute;n que almacena la
-definici&oacute;n de funci&oacute;n, y viceversa.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Ejemplo-de-rellenar-columna"><code>fill-column</code>, un ejemplo de variable</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo de rellenar columna
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Funci_00f3n-vac_00eda">1.7.1 Mensaje de error de un s&iacute;mbolo sin una funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El mensaje de error para un
- s&iacute;mbolo sin una funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Variable-vac_00eda">1.7.2 Mensaje de error de un s&iacute;mbolo sin un valor</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El mensaje de error para un
- s&iacute;mbolo sin un valor.
-</td></tr>
-</table>
-
-<hr>
-<a name="Ejemplo-de-rellenar-columna"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Variables" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Variables" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Funci_00f3n-vac_00eda" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="fill_002dcolumn_002c-un-ejemplo-de-variable"></a>
-<h3 class="unnumberedsubsec"><code>fill-column</code>, un ejemplo de variable</h3>
-
-<a name="index-fill_002dcolumn_002c-una-variable-de-ejemplo"></a>
-<a name="index-Variable-de-Ejemplo_002c-fill_002dcolumn"></a>
-<a name="index-Variable_002c-ejemplo-de_002c-fill_002dcolumn"></a>
-<p>La variable <code>fill-column</code> ilustra un s&iacute;mbolo con un
-valor adjunto: en cada buffer de GNU Emacs, este s&iacute;mbolo
-se establece a alg&uacute;n valor, normalmente 72 o 70, pero algunas veces
-a alg&uacute;n otro valor. Para encontrar el valor de este
-s&iacute;mbolo, eval&uacute;alo por s&iacute; mismo. Si est&aacute;
-leyendo esto en Info dentro de GNU Emacs, puedes hacer esto
-poniendo el cursor despu&eacute;s del s&iacute;mbolo y pulsar
-<kbd>C-x C-e</kbd>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">fill-column
-</pre></div>
-
-<p>Despu&eacute;s de presionar <kbd>C-x C-e</kbd>, Emacs imprimi&oacute; el
-n&uacute;mero 72 en mi &aacute;rea echo. Este es el valor que he establecido para
-<code>fill-column</code> mientras escribo esto. Puede
-ser diferente para ti en tu b&uacute;ffer Info. Observe que el valor devuelto
-como una variable es impreso exactamente de la misma forma que el
-valor devuelto por una funci&oacute;n tras ejecutar sus instrucciones. Desde
-el punto de vista del int&eacute;rprete Lisp, un valor devuelto es un valor
-devuelto. Que
-tipo de expresi&oacute;n sea, deja de importar una vez que el valor
-se conoce.
-</p>
-<p>Un s&iacute;mbolo puede tener cualquier valor ligado a él o,
-siendo tecnicos, se puede <em>bind</em> (asociar) la variable a un valor: a
-un n&uacute;mero, por ejemplo 72; a una cadena, <code>\&quot;como esta\&quot;</code>; a
-una lista, como <code>(abeto pino roble)</code>; podemos incluso asociar
-una variable a una definici&oacute;n de funci&oacute;n.
-</p>
-<p>Un s&iacute;mbolo puede vincularse a un valor de varias
-maneras. Ver <a href="#set-y-setq">Configurando el valor de una variable</a>,
-para obtener informaci&oacute;n sobre una manera de hacer esto.
-</p>
-<hr>
-<a name="Funci_00f3n-vac_00eda"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-de-rellenar-columna" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Variables" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Variable-vac_00eda" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Mensaje-de-error-de-un-simbolo-sin-una-funcion"></a>
-<h3 class="subsection">1.7.1 Mensaje de error de un s&iacute;mbolo sin una funci&oacute;n</h3>
-<a name="index-Simbolo-sin-funcion-de-error"></a>
-<a name="index-Error-para-simbolo-sin-funcion"></a>
-
-<p>Cuando se eval&uacute;a <code>fill-column</code> para encontrar el valor de una
-variable, no se ponen par&eacute;ntesis alrededor de la palabra. Esto es
-porque no pretendemos usarlos como un nombre de funci&oacute;n.
-</p>
-<p>Si <code>fill-column</code> fuese el primer o &uacute;nico elemento de una lista,
-el int&eacute;rprete de Lisp intentar&iacute;a encontrar la
-definici&oacute;n de funci&oacute;n adjunta. Pero <code>fill-column</code> no tiene
-una definici&oacute;n de funci&oacute;n. Prueba evaluando esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(fill-column)
-</pre></div>
-
-<p>Se crear&aacute; un buffer &lsquo;<tt>*Backtrace*</tt>&rsquo; que dice:
-</p>
-<div class="smallexample">
-<pre class="smallexample">---------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error: (void-function fill-column)
- (fill-column)
- eval((fill-column))
- eval-last-sexp-1(nil)
- eval-last-sexp(nil)
- call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-</pre></div>
-
-<p>(Recuerda, para salir del depurador y hacer que la ventana del depurador
-desaparezca, presiona <kbd>q</kbd> en el buffer &lsquo;<tt>*Backtrace*</tt>&rsquo;.)
-</p>
-
-<hr>
-<a name="Variable-vac_00eda"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Funci_00f3n-vac_00eda" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Variables" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Argumentos" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Mensaje-de-error-de-un-simbolo-sin-un-valor"></a>
-<h3 class="subsection">1.7.2 Mensaje de error de un s&iacute;mbolo sin un valor</h3>
-<a name="index-Simbolo-sin-valor-de-error"></a>
-<a name="index-Error-para-simbolo-sin-valor"></a>
-
-<p>Si se intenta evaluar un s&iacute;mbolo que no tiene un valor
-asociado, recibir&aacute; un mensaje de error. Esto se puede ver
-experimentando con nuestra suma 2 m&aacute;s 2. En la siguiente
-expresi&oacute;n, pon el cursor correcto despu&eacute;s del <code>+</code>, antes del
-primer n&uacute;mero 2, presiona <kbd>C-x C-e</kbd>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 2 2)
-</pre></div>
-
-<p>En GNU Emacs 24, se crear&aacute; un buffer &lsquo;<tt>*Backtrace*</tt>&rsquo; que dice:
-</p>
-<div class="smallexample">
-<pre class="smallexample">---------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error: (void-variable +)
- eval(+)
- eval-last-sexp-1(nil)
- eval-last-sexp(nil)
- call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-</pre></div>
-
-<p>(De nuevo, se puede salir del depurador pulsando <kbd>q</kbd> en el
-b&uacute;ffer &lsquo;<tt>*Backtrace*</tt>&rsquo;.)
-</p>
-<p>Esta traza es diferente del primer mensaje de error que
-vimos, que dijimos, &lsquo;<samp>Debugger entered--Lisp error: (void-function
-esto)</samp>&rsquo;. En este caso, la funci&oacute;n no
-tiene una valor como una variable; mientras en el otro mensaje de
-error, la funci&oacute;n (la palabra &lsquo;esto&rsquo;) no tuvo una definici&oacute;n.
-</p>
-<p>En este experimento con el <code>+</code>, lo que se hizo fu&eacute; causar
-que el int&eacute;rprete Lisp eval&uacute;e el <code>+</code> y busque el valor de la
-variable en vez de la definici&oacute;n de la funci&oacute;n. Hicimos
-esto colocando el cursor justo despu&eacute;s del s&iacute;mbolo en
-lugar de ponerlo al final de los par&eacute;ntesis que cierran la lista como
-hicimos
-antes. Como consecuencia, el int&eacute;rprete Lisp evalu&oacute; la
-s-expresi&oacute;n anterior, que en este caso fu&eacute; el <code>+</code> en
-s&iacute;.
-</p>
-<p>Ya que <code>+</code> no tiene un valor asociado, solo la definici&oacute;n de
-funci&oacute;n, el mensaje de error informa que el valor del
-s&iacute;mbolo como una variable estaba vac&iacute;o.
-</p>
-
-<hr>
-<a name="Argumentos"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Variable-vac_00eda" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Tipos-de-datos" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Argumentos-1"></a>
-<h2 class="section">1.8 Argumentos</h2>
-<a name="index-Argumentos"></a>
-<a name="index-Pasando-informacion-para-funciones"></a>
-
-<p>Para ver c&oacute;mo la informaci&oacute;n se pasa a las funciones, veamos
-de nuevo a nuestro viejo recurso, la adici&oacute;n de dos m&aacute;s dos. En
-Lisp, esto se escribe como sigue:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 2 2)
-</pre></div>
-
-<p>Si se eval&uacute;a esta expresi&oacute;n, el n&uacute;mero 4 aparecer&aacute; en tu &aacute;rea
-echo. Lo que el int&eacute;rprete de Lisp hace es sumar los n&uacute;meros despues
-del <code>+</code>.
-</p>
-<a name="index-argumento-definido"></a>
-<p>Los n&uacute;meros sumados por <code>+</code> son llamados <em>argumentos</em> de
-la funci&oacute;n <code>+</code>. Estos n&uacute;meros son la informaci&oacute;n que se
-da o <em>pasa</em> a la funci&oacute;n.
-</p>
-<p>La palabra &lsquo;argumento&rsquo; viene del &aacute;mbito de las matem&aacute;ticas y no se
-refiere a una disputa entre 2 personas, sino que se refiere a la
-informaci&oacute;n presentada a la funci&oacute;n, en este caso, al <code>+</code>. En
-Lisp, los argumentos de una funci&oacute;n son los &aacute;tomos o listas que
-siguen a la funci&oacute;n. Los valores devueltos por la evaluaci&oacute;n de
-estos &aacute;tomos o listas son pasados a la funci&oacute;n. Funciones
-diferentes requieren diferentes n&uacute;meros de argumentos; algunas
-funciones no requieren ninguno en absoluto.<a name="DOCF2" href="#FOOT2">(2)</a>
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Tipos-de-datos">1.8.1 Tipos de argumentos de datos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Tipos de datos pasados a una funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Argumentos-como-variables-o-listas">1.8.2 Un argumento como el valor de una variable o lista</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un argumento puede ser el valor de
- una variable o lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#N_00famero-de-variables-de-argumentos">1.8.3 N&uacute;mero de variables de argumentos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Algunas funciones pueden tomar un
- n&uacute;mero variable de argumentos.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Tipo-incorrecto-de-argumento">1.8.4 Usando el tipo incorrecto de objeto como un argumento</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Pasando un argumento del tipo incorrecto a
- una funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#message">1.8.5 La funci&oacute;n <code>message</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una funci&oacute;n &uacute;til para enviar mensajes.
-</td></tr>
-</table>
-
-<hr>
-<a name="Tipos-de-datos"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Argumentos" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Argumentos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Argumentos-como-variables-o-listas" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Tipos-de-argumentos-de-datos"></a>
-<h3 class="subsection">1.8.1 Tipos de argumentos de datos</h3>
-<a name="index-Tipos-de-datos"></a>
-<a name="index-Tipos-de-datos-1"></a>
-<a name="index-Tipos-de-dato-de-los-argumentos"></a>
-
-<p>Los tipos de datos que deber&iacute;an ser pasados a una
-funci&oacute;n dependen de que tipo de informaci&oacute;n usan. Los argumentos de
-una funci&oacute;n como <code>+</code> deben tener valores que son
-n&uacute;meros, puesto que <code>+</code> a&ntilde;ade n&uacute;meros. Otras funciones usan
-diferentes tipos de datos para sus argumentos.
-</p>
-<a name="index-concatenar"></a>
-<p>Por ejemplo, la funci&oacute;n <code>concat</code> concatena o une dos o m&aacute;s
-cadenas de texto para producir una cadena. Los argumentos son
-cadenas. La concatenaci&oacute;n de los dos caracteres de cadenas
-<code>abc</code>, <code>def</code> produce una cadena <code>abcdef</code>. Esto
-puede ser visto evaluando lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(concat &quot;abc&quot; &quot;def&quot;)
-</pre></div>
-
-<p>El valor producido para evaluar esta expresi&oacute;n es <code>&quot;abcdef&quot;</code>.
-</p>
-<p>Una funci&oacute;n tal como <code>substring</code> usa como argumento tanto una
-cadena como n&uacute;meros. La funci&oacute;n devuelve una parte de la cadena,
-una subcadena del primer argumento. Esta funci&oacute;n toma tres
-argumentos. Su primer argumento es la cadena de caracteres, el segundo
-y tercer argumento son n&uacute;meros que indican el principio y el fin de la
-subcadena. Los n&uacute;meros son un conteo del n&uacute;mero de caracteres
-(incluyendo espacios y puntuaciones) desde el principio de la cadena.
-</p>
-<p>Por ejemplo, si eval&uacute;a lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(substring &quot;El r&aacute;pido zorro marr&oacute;n salt&oacute;.&quot; 10 15)
-</pre></div>
-
-<p>se ver&aacute; <code>&quot;zorro&quot;</code> en el &aacute;rea echo. Los argumentos son la cadena
-y los dos n&uacute;meros.
-</p>
-<p>N&oacute;tese que la cadena pasada a <code>substring</code> es un solo &aacute;tomo
-apesar de estar compuesto de varias palabras separadas por
-espacios. Lisp considera que cualquier cosa entre dos marcas de cita es
-parte
-de la cadena, incluyendo los espacios. Se puede pensar la funci&oacute;n
-<code>substring</code> como un tipo de &lsquo;acelerador de particulas&rsquo; ya que toma
-un &aacute;tomo indivisible y extrae una parte. Sin embargo,
-<code>substring</code> solo es capaz de extraer una subcadena desde un
-argumento que es una cadena, no otro tipo de &aacute;tomo tal como un
-n&uacute;mero o s&iacute;mbolo.
-</p>
-<hr>
-<a name="Argumentos-como-variables-o-listas"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Tipos-de-datos" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Argumentos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#N_00famero-de-variables-de-argumentos" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Un-argumento-como-el-valor-de-una-variable-o-lista"></a>
-<h3 class="subsection">1.8.2 Un argumento como el valor de una variable o lista</h3>
-
-<p>Un argumento puede ser un s&iacute;mbolo que devuelva un valor
-cuando es evaluado. Por ejemplo, evaluar el s&iacute;mbolo
-<code>fill-column</code> en si, devuelve un
-n&uacute;mero. Este n&uacute;mero puede ser usado en una adici&oacute;n.
-</p>
-<p>Posicionar el cursor despu&eacute;s de la siguiente expresi&oacute;n y presiona
-<kbd>C-x C-e</kbd>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 2 fill-column)
-</pre></div>
-
-<p>El valor ser&aacute; dos m&aacute;s el n&uacute;mero que se obtiene al evaluar solamente
-<code>fill-column</code>. En m&iacute; caso, este es 74, porque mi
-valor de <code>fill-column</code> es 72.
-</p>
-<p>Como acabamos de ver, un argumento puede ser un s&iacute;mbolo que
-devuelve un valor cuando se eval&uacute;a. Adem&aacute;s, un argumento puede
-ser una lista que devuelve un valor cuando es evaluada. Por ejemplo,
-en la siguiente expresi&oacute;n, los argumentos de la funci&oacute;n
-<code>concat</code> son las cadenas <code>&quot;Los&quot;</code> y <code>&quot;&nbsp;zorros&nbsp;rojos.&quot;</code> y la lista <code>(number-to-string (+ 2 fill-column))</code>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(concat &quot;Los &quot; (number-to-string (+ 2 fill-column)) &quot; zorros rojos.&quot;)
-</pre></div>
-
-<p>Si se eval&uacute;a esta expresi&oacute;n&mdash;y si, como con mi Emacs,
-<code>fill-column</code> se eval&uacute;a a 72&mdash;aparecer&aacute; <code>&quot;Los 74
-zorros rojos.&quot;</code> en el &aacute;rea echo. (N&oacute;tese que se debe poner espacio
-despu&eacute;s de la palabra &lsquo;<samp>Los</samp>&rsquo; y antes de la palabra &lsquo;<samp>rojos</samp>&rsquo;
-y as&iacute; es como aparecer&aacute; en la cadena final. La
-funci&oacute;n <code>number-to-string</code> convierte el entero que devuelve la
-funci&oacute;n de adici&oacute;n a una cadena. <code>number-to-string</code>
-tambi&eacute;n se conoce como <code>int-to-string</code>.)
-</p>
-<hr>
-<a name="N_00famero-de-variables-de-argumentos"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Argumentos-como-variables-o-listas" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Argumentos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Tipo-incorrecto-de-argumento" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Numero-de-variables-de-argumentos"></a>
-<h3 class="subsection">1.8.3 N&uacute;mero de variables de argumentos</h3>
-<a name="index-Numero-variable-de-argumentos"></a>
-<a name="index-Argumentos_002c-numero-variable-de"></a>
-
-<p>Algunas funciones, como <code>concat</code>, <code>+</code>, o <code>*</code>,
-toman cualquier n&uacute;mero de argumentos. (El <code>*</code> es el
-s&iacute;mbolo para multiplicar.) Esto puede ser visto
-evaluando cada una de las siguientes expresiones de la forma
-habitual. Lo que ver&aacute;s en el &aacute;rea echo se imprime en este texto
-despu&eacute;s de &lsquo;<samp>&rArr;</samp>&rsquo;, que se puede leer como &lsquo;evaluar a&rsquo;.
-</p>
-<p>En el primer conjunto, las funciones no tienen argumentos:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+) &rArr; 0
-
-(*) &rArr; 1
-</pre></div>
-
-<p>En este conjunto, las funciones tienen un argumento cada una:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 3) &rArr; 3
-
-(* 3) &rArr; 3
-</pre></div>
-
-<p>En este conjunto, las funciones tienen tres argumentos cada una:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 3 4 5) &rArr; 12
-
-(* 3 4 5) &rArr; 60
-</pre></div>
-
-<hr>
-<a name="Tipo-incorrecto-de-argumento"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#N_00famero-de-variables-de-argumentos" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Argumentos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#message" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Usando-el-tipo-incorrecto-de-objeto-como-un-argumento"></a>
-<h3 class="subsection">1.8.4 Usando el tipo incorrecto de objeto como un argumento</h3>
-<a name="index-Tipo-incorrecto-de-argumento"></a>
-<a name="index-Argumento_002c-tipo-incorrecto-de"></a>
-
-<p>Cuando a una funci&oacute;n se le pasa un argumento del tipo incorrecto, el
-interpr&eacute;te Lisp produce un mensaje de error. Por ejemplo, la
-funci&oacute;n <code>+</code> espera que los valores de sus argumentos sean
-n&uacute;meros. Como un experimento podemos pasar el
-s&iacute;mbolo citado <code>hola</code> en vez de un
-n&uacute;mero. Coloca el cursor despu&eacute;s de la siguiente expresi&oacute;n y
-presiona <kbd>C-x C-e</kbd>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 2 'hola)
-</pre></div>
-
-<p>Al hacer esto se generar&aacute; un mensaje de error. Lo qu&eacute; ha
-ocurrido es que <code>+</code> ha intentado a&ntilde;adir el 2 al valor
-devuelto por <code>'hola</code>, pero el valor devuelto por <code>'hola</code>
-es el s&iacute;mbolo <code>hola</code>, no un n&uacute;mero. Solo los
-n&uacute;meros pueden ser a&ntilde;adidos. Por tanto <code>+</code>
-no pudo llevar a cabo su adici&oacute;n.
-</p>
-<p>Se crear&aacute; e introducir&aacute; un b&uacute;ffer &lsquo;<tt>*Backtrace*</tt>&rsquo; que dice:
-</p>
-<div class="smallexample">
-<pre class="smallexample">---------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error: (wrong-type-argument number-or-marker-p hola)
- +(2 hola)
- eval((+ 2 (quote hola)))
- eval-last-sexp-1(nil)
- eval-last-sexp(nil)
- call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-</pre></div>
-
-<p>Como de costumbre, el mensaje de error intenta ser &uacute;til y tiene sentido
-despu&eacute;s de aprender c&oacute;mo leerlo.<a name="DOCF3" href="#FOOT3">(3)</a>
-</p>
-<p>La primera parte del mensaje de error es sencilla; dice &lsquo;<samp>wrong
-type argument</samp>&rsquo; (tipo de argumento incorrecto). A continuación viene la
-misteriosa palabra tecnica &lsquo;<samp><span class="nolinebreak">number-or-marker-p</span></samp>&rsquo;. Esta
-palabra est&aacute; intentando decirte qu&eacute; tipo de argumento espera <code>+</code>.
-</p>
-<p>El s&iacute;mbolo <code>number-or-marker-p</code> dice que el
-int&eacute;rprete Lisp est&aacute; intentando determinar si la informaci&oacute;n
-presentada (el valor del argumento) es un n&uacute;mero o una marca (un
-objeto especial que representa una posici&oacute;n de buffer). Lo que hace
-es probar si se le estan dando numeros a sumar a <code>+</code>.
-Tambi&eacute;n chequea si el argumento es algo llamado
-un marcador, que es una caracteristica espec&iacute;fica de
-Emacs Lisp. (En Emacs, las ubicaciones en un b&uacute;ffer se registran
-como marcadores. Cuando se establece la marca con el comando
-<kbd>C-@</kbd> o <kbd>C-&lt;SPC&gt;</kbd>, su posici&oacute;n se guarda como un
-marcador. La marca puede ser considerada como un n&uacute;mero&mdash;el n&uacute;mero de
-caracteres es la localizaci&oacute;n desde el principio del b&uacute;ffer.)
-En Emacs Lisp, <code>+</code> se puede utilizar para a&ntilde;adir el valor
-num&eacute;rico de los marcadores como n&uacute;meros.
-</p>
-<p>La &lsquo;<samp>p</samp>&rsquo; de <code>number-or-marker-p</code> es la encarnaci&oacute;n de una
-pr&aacute;ctica iniciada en los primeros d&iacute;as de la
-programaci&oacute;n Lisp. La &lsquo;<samp>p</samp>&rsquo; significa &lsquo;predicado&rsquo;. En la jerga
-usada por los primeros investigadores de Lisp, un predicado se refiere
-a una funci&oacute;n para determinar si alguna propiedad es verdadera o
-falsa. As&iacute; la &lsquo;<samp>p</samp>&rsquo; nos dice que
-<code>number-or-marker-p</code> es el nombre de una funci&oacute;n que determina
-si el argumento dado es un n&uacute;mero o una marca. Otros
-s&iacute;mbolos Lisp que finalizan en &lsquo;<samp>p</samp>&rsquo; incluyen
-<code>zerop</code>, una funci&oacute;n que chequea si su argumento tienen el
-valor de cero, y <code>listp</code>, una funci&oacute;n que prueba si su
-argumento es una lista.
-</p>
-<p>Finalmente, la &uacute;ltima parte del mensaje de error es el
-s&iacute;mbolo <code>hola</code>. Este es el valor del argumento
-dado a <code>+</code>. Si a la adici&oacute;n se le hubiese pasado el
-tipo correcto de objeto, el valor habr&iacute;a sido un
-n&uacute;mero, como 37, en lugar de un s&iacute;mbolo como
-<code>hola</code>. Pero entonces no habr&iacute;as obtenido el
-mensaje de error.
-</p>
-
-<hr>
-<a name="message"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Tipo-incorrecto-de-argumento" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Argumentos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#set-y-setq" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-message"></a>
-<h3 class="subsection">1.8.5 La funci&oacute;n <code>message</code></h3>
-<a name="index-message"></a>
-
-<p>Al igual que <code>+</code>, la funci&oacute;n <code>message</code> toma un n&uacute;mero variable
-de argumentos. Se utiliza para enviar mensajes al usuario y es
-tan &uacute;til que vamos a describirla.
-</p>
-<p>Se impre un mensaje en el &aacute;rea echo. Por ejemplo, puede
-imprimir un mensaje en su &aacute;rea echo evaluando la siguiente lista:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(message &quot;&iexcl;Este mensaje aparece en el &aacute;rea echo!&quot;)
-</pre></div>
-
-<p>Toda la cadena entre comillas dobles es un unico argumento y se
-imprime <i>en su totalidad</i>. (N&oacute;tese que en este ejemplo, el mensaje en
-s&iacute; aparece en el &aacute;rea echo entre comillas
-dobles; esto se debe a que ves el valor devuelto por la funci&oacute;n
-<code>message</code>. En la mayor&iacute;a de programas que escribiras,
-el texto ser&aacute; impreso en
-el &aacute;rea echo como un efecto secundario de <code>message</code>, sin las
-comillas. Ver <a href="#multiply_002dby_002dseven-en-detalle"><code>multiply-by-seven</code> en detalle</a>, para un ejemplo de esto.)
-</p>
-<p>Sin embargo, si hay un &lsquo;<samp>%s</samp>&rsquo; en la cadena de caracteres citada, la
-funci&oacute;n <code>message</code> no imprime el &lsquo;<samp>%s</samp>&rsquo; como tal, pero mira
-el siguente argumento a continuaci&oacute;n de la cadena. Se eval&uacute;a el segundo
-argumento e
-imprime el valor en la ubicaci&oacute;n de la cadena donde est&aacute; el &lsquo;<samp>%s</samp>&rsquo; .
-</p>
-<p>Puede ver esto colocando el cursor despu&eacute;s de la siguiente
-expresi&oacute;n y presionar <kbd>C-x C-e</kbd>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(message &quot;El nombre de este b&uacute;ffer es: %s.&quot; (buffer-name))
-</pre></div>
-
-<p>En Info, <code>&quot;El nombre de este b&uacute;ffer es: *info*.&quot;</code> aparecer&aacute;
-en el &aacute;rea echo. La funci&oacute;n <code>buffer-name</code> devuelve el nombre
-del b&uacute;ffer como una cadena, que la funci&oacute;n <code>message</code> inserta
-en lugar de <code>%s</code>.
-</p>
-<p>Para imprimir un valor como un entero, utiliza &lsquo;<samp>%d</samp>&rsquo; de la misma forma
-que &lsquo;<samp>%s</samp>&rsquo;. Por ejemplo, para imprimir un mensaje en el
-&aacute;rea echo que indique el valor de <code>fill-column</code>, eval&uacute;a lo
-siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(message &quot;El valor de fill-column es %d.&quot; fill-column)
-</pre></div>
-
-<p>En mi sistema, cuando eval&uacute;o esta lista, <code>&quot;El valor de
-fill-column es 72&quot;</code> aparece en mi &aacute;rea echo<a name="DOCF4" href="#FOOT4">(4)</a>
-</p>
-<p>Si hay m&aacute;s de un &lsquo;<samp>%s</samp>&rsquo; en la cadena citada, el valor del primer
-argumento despu&eacute;s de la cadena citada se imprime en la posici&oacute;n del
-primer &lsquo;<samp>%s</samp>&rsquo; y el valor del segundo argunmento se imprime en la
-posici&oacute;n del segundo &lsquo;<samp>%s</samp>&rsquo;, y as&iacute; sucesivamente.
-</p>
-<p>Por ejemplo, si se eval&uacute;a lo siguiente,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(message &quot;&iexcl;Hay %d %s en la oficina!&quot;
- (- fill-column 14) &quot;elefantes rosas&quot;)
-</pre></div>
-
-<p>un mensaje caracter&iacute;stico aparecer&aacute; en el &aacute;rea
-echo. En mi sistema dice <code>&quot;&iexcl;Hay 58 elefantes rosas en
-la oficina!&quot;</code>
-</p>
-<p>Se evalua la expresi&oacute;n <code>(- fill-column 14)</code> y el n&uacute;mero
-resultante se inserta en lugar del &lsquo;<samp>%d</samp>&rsquo;; y la cadena entre
-comillas dobles, <code>&quot;elefantes rosas&quot;</code>, se trata como un
-solo argumento y se inserta en lugar del &lsquo;<samp>%s</samp>&rsquo;. (Esto es decir,
-una cadena entre comillas dobles se eval&uacute;a as&iacute; misma,
-como un n&uacute;mero.)
-</p>
-<p>Finalmente, aqu&iacute; est&aacute; un ejemplo algo complejo que no
-solo ilustra el c&aacute;lculo de un n&uacute;mero, tambi&eacute;n muestra
-como se puede usar una expresi&oacute;n dentro de una expresi&oacute;n para generar el
-texto que
-sustituira el &lsquo;<samp>%s</samp>&rsquo;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(message &quot;&Eacute;l vi&oacute; %d %s&quot;
- (- fill-column 36)
- (concat (substring
- &quot;Los r&aacute;pidos zorros marrones saltaron.&quot; 12 18)
- &quot; rojos trotando.&quot;))
-</pre></div>
-
-<p>En este ejemplo, <code>message</code> tiene tres argumentos: la cadena,
-<code>&quot;&Eacute;l vi&oacute; %d %s&quot;</code>, la expresi&oacute;n, <code>(- fill-column 32)</code>, y la
-expresi&oacute;n a partir de
-la funci&oacute;n <code>concat</code>. El valor resultante desde la evaluaci&oacute;n
-de <code>(- fill-column 32)</code> se inserta en lugar del &lsquo;<samp>%d</samp>&rsquo;; y
-el valor devuelto por la expresi&oacute;n que inicia con <code>concat</code> se
-inserta en lugar del &lsquo;<samp>%s</samp>&rsquo;.
-</p>
-<p>Cuando <code>fill-column</code> es 70 y se eval&uacute;a la expresi&oacute;n, aparecera el
-mensaje <code>&quot;&Eacute;l vi&oacute; 41 zorros rojos trotando.&quot;</code> en tu
-&aacute;rea echo.
-</p>
-<hr>
-<a name="set-y-setq"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#message" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Usando-set" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Configurando-el-valor-de-una-variable"></a>
-<h2 class="section">1.9 Configurando el valor de una variable</h2>
-<a name="index-Variable_002c-asignando-valor"></a>
-<a name="index-Asignando-valor-de-variable"></a>
-
-<a name="index-bind-se-definio"></a>
-<p>Hay varias formas de asignar un valor a una variable. Una de
-ellas es usar la funci&oacute;n <code>set</code> o la funci&oacute;n
-<code>setq</code>. Otra forma es usar <code>let</code> (v&eacute;ase la secci&oacute;n <a href="#let"><code>let</code></a>). (La jerga
-para este proceso es <em>bind</em> (ligar) una variable a un valor.)
-</p>
-<p>Las siguientes secciones no solo describen c&oacute;mo operan <code>set</code> y
-<code>setq</code>, tambi&eacute;n ilustran como se pasan los argumentos.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Usando-set">1.9.1 Usando <code>set</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Configurando valores.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Usando-setq">1.9.2 Usando <code>setq</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Configurando un valor citado.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Contando">1.9.3 Contando</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usando <code>setq</code> para contar.
-</td></tr>
-</table>
-
-<hr>
-<a name="Usando-set"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#set-y-setq" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#set-y-setq" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Usando-setq" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Usando-set-1"></a>
-<h3 class="subsection">1.9.1 Usando <code>set</code></h3>
-<a name="index-set"></a>
-
-<p>Para establecer el valor del s&iacute;mbolo <code>flores</code> a la
-lista <code>'(rosa violeta margarita bot&oacute;ndeoro)</code>, eval&uacute;a la
-siguiente expresi&oacute;n colocando el cursor despu&eacute;s de la
-expresi&oacute;n y presiona <kbd>C-x C-e</kbd>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(set 'flores '(rosa violeta margarita bot&oacute;ndeoro))
-</pre></div>
-
-<p>La lista <code>(rosa violeta margarita bot&oacute;ndeoro)</code> aparecer&aacute; en el
-&aacute;rea echo. Esto es <em>devuelto</em> por la funci&oacute;n
-<code>set</code>. Como efecto secundario, el s&iacute;mbolo
-<code>flores</code> est&aacute; ligado a la lista; es decir, el
-s&iacute;mbolo <code>flores</code>, puede ser visto como una
-variable, que entrega la lista como su valor. (Este proceso,
-ilustra un efecto lateral al int&eacute;rprete Lisp: asignando el valor,
-que puede ser el efecto primario en el que los humanos
-estamos interesados. Esto se debe a que cada funci&oacute;n Lisp debe devolver
-un valor si no se obtiene un error, pero solo tendr&aacute; un efecto
-secundario si est&aacute; dise&ntilde;ado para tener uno.)
-</p>
-<p>Despu&eacute;s de evaluar la expresi&oacute;n <code>set</code>, se puede evaluar el
-s&iacute;mbolo <code>flores</code> y devolver&aacute; el valor
-asignado. Aqu&iacute; est&aacute; el s&iacute;mbolo. Coloca
-el cursor al final de este y presiona <kbd>C-x C-e</kbd>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">flores
-</pre></div>
-
-<p>Cuando se eval&uacute;a <code>flores</code>, la lista <code>(rosa violeta margarita
-bot&oacute;ndeoro)</code> aparece en el &aacute;rea echo.
-</p>
-<p>Por cierto, si se eval&uacute;a <code>'flores</code>, la variable con una
-comilla en frente, lo que ver&aacute; en el &aacute;rea echo es el
-s&iacute;mbolo en s&iacute; mismo: <code>flores</code>.
-Aqu&iacute; est&aacute; el s&iacute;mbolo citado,
-para que pueda probar esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">'flores
-</pre></div>
-
-<p>N&oacute;tese tambi&eacute;n, que cuando se usa <code>set</code>, se necesitan citar
-ambos argumentos de <code>set</code>, a menos que los quiera evaluar. Puesto
-que nosotros no queremos evaluar, ni la variable
-<code>flores</code>, ni la lista <code>(rosa violeta margarita
-bot&oacute;ndeoro)</code>, ambos se citan. (Cuando se usa <code>set</code> sin citar su
-primer
-argumento, el primer argumento se eval&uacute;a antes de realizar cualquier otra
-cosa. Si hizo esto y <code>flores</code> no ten&iacute;a
-ya un valor, se tendr&iacute;a un mensaje de error con el
-&lsquo;<samp>Valor de s&iacute;mbolo como variable
-vac&iacute;o</samp>&rsquo;; por otro lado, si <code>flores</code> regreso un
-valor despu&eacute;s de ser evaluado, <code>set</code>
-intentar&iacute;a establecer el valor que fue
-devuelto. Hay situaciones donde esto el justo lo que la funci&oacute;n
-a de hacer, pero tales situaciones son poco frecuentes.)
-</p>
-<hr>
-<a name="Usando-setq"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Usando-set" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#set-y-setq" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Usando-setq-1"></a>
-<h3 class="subsection">1.9.2 Usando <code>setq</code></h3>
-<a name="index-setq"></a>
-
-<p>Como una cuesti&oacute;n pr&aacute;ctica, casi siempre se cita el primer argumento de
-<code>set</code>. La combinaci&oacute;n de <code>set</code> y un primer argumento citado
-es tan com&uacute;n que tiene nombre propio: la forma especial
-<code>setq</code>. Esta forma especial es igual a <code>set</code> excepto que
-el primer argumento se cita autom&aacute;ticamente, por lo que no necesita
-escribir la marca de cita. Tambi&eacute;n, como
-una conveniencia a&ntilde;adida, <code>setq</code> permite asignar varias
-variables diferentes a diferentes valores, todo en una expresi&oacute;n.
-</p>
-<p>Para establecer el valor de la variable <code>carn&iacute;voros</code> a
-la lista <code>'(leon tigre leopardo)</code> usando <code>setq</code>, se utiliza la
-siguiente
-expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq carnivoros '(leon tigre leopardo))
-</pre></div>
-
-<p>Esto es exactamente lo mismo que usar <code>set</code> excepto que el primer
-argumento se cita autom&aacute;ticamente por <code>setq</code>. (La &lsquo;<samp>q</samp>&rsquo; en
-<code>setq</code> significa <code>quote</code>.)
-</p>
-<p>Con <code>set</code>, la expresi&oacute;n que se ver&iacute;a es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(set 'carnivoros '(leon tigre leopardo))
-</pre></div>
-
-<p>Adem&aacute;s, <code>setq</code> se puede utilizar para asignar diferentes valores
-a diferentes variables. El primer argumento se une a al valor
-del segundo argumento, el tercer argumento se une a al valor del
-cuarto argumento, y as&iacute; sucesivamente. Por ejemplo, se
-podr&iacute;a usar lo siguiente para asignar una lista de
-&aacute;rboles al s&iacute;mbolo <code>arboles</code> y una lista
-de herb&iacute;voros al s&iacute;mbolo <code>herbivoros</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq arboles '(pino abeto roble arce)
- herbivoros '(gacela antilope cebra))
-</pre></div>
-
-<p>(La expresi&oacute;n podr&iacute;a tambi&eacute;n haber estado en una
-sola l&iacute;nea, pero podr&iacute;a no caber en
-una p&aacute;gina; y a los humanos les resulta m&aacute;s f&aacute;cil leer listas
-con un formato agradable.)
-</p>
-<p>Aunque he estado usando el t&eacute;rmino &lsquo;asignar&rsquo;, hay otra forma de
-pensar respecto a el funcionamiento de <code>set</code> y <code>setq</code>; y consiste
-en
-decir que <code>set</code> y <code>setq</code> crean un s&iacute;mbolo
-que <em>apunta</em> a la lista. Esta ultima forma de pensar es muy
-com&uacute;n y en los cap&iacute;tulos siguientes deberiamos encontrar al
-menos un s&iacute;mbolo con un &lsquo;puntero&rsquo; como parte de su nombre. El
-nombre es elegido porque el s&iacute;mbolo tiene un valor,
-espec&iacute;ficamente una lista, unida a el; o, expresado de otra
-manera, el s&iacute;mbolo se ajusta para &ldquo;apuntar&rdquo; a la lista.
-</p>
-<hr>
-<a name="Contando"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Usando-setq" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#set-y-setq" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Resumen" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Contando-1"></a>
-<h3 class="subsection">1.9.3 Contando</h3>
-<a name="index-Contando"></a>
-
-<p>He aqu&iacute; un ejemplo que muestra c&oacute;mo usar <code>setq</code>
-en un contador. Se podr&iacute;a usar esto para contar cuantas
-veces una parte de un programa se
-repite. En primer lugar asigna una variable a cero; a continuaci&oacute;n suma
-uno al
-n&uacute;mero cada vez que el programa se
-repita. Para ello, se necesita una variable que sirve como un
-contador, y dos expresiones: una expresi&oacute;n <code>setq</code> inicial que asigna
-la
-variable contador a cero; y una segunda expresi&oacute;n <code>setq</code> que
-incrementa el contador cada vez se evalua.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq contador 0) ; <span class="roman">Llamemos a esto el inicializador.</span>
-
-(setq contador (+ contador 1)) ; <span class="roman">Este es el incremento.</span>
-
-contador ; <span class="roman">Esste es el contador.</span>
-</pre></div>
-
-<p>(El texto que sigue al &lsquo;<samp>;</samp>&rsquo; son los comentarios. Ver V&eacute;ase la secci&oacute;n <a href="#Cambiar-un-defun">Cambiar una definici&oacute;n de funci&oacute;n</a>.)
-</p>
-<p>Si eval&uacute;as la primera de estas expresiones, el inicializador,
-<code>(setq contador 0)</code>, y luego eval&uacute;as la tercera expresi&oacute;n,
-<code>contador</code>, el n&uacute;mero <code>0</code> aparecer&aacute; en el &aacute;rea echo. Si
-a continuaci&oacute;n se eval&uacute;a la segunda expresi&oacute;n, el incremento,
-<code>(setq contador (+ contador 1))</code>, el contador tendr&aacute; el valor
-1. As&iacute; que si eval&uacute;as de nuevo <code>contador</code>, el n&uacute;mero
-<code>1</code> aparecer&aacute; en el &aacute;rea echo. Cada vez que se eval&uacute;a la
-segunda expresi&oacute;n, el valor del contador ser&aacute; incrementado.
-</p>
-<p>Al eval&uacute;ar el incremento, <code>(setq contador (+ contador
-1))</code>, el int&eacute;rprete Lisp primero eval&uacute;a la lista interna; esta es
-la adici&oacute;n. Con el fin de evaluar esta lista, se debe evaluar la
-variable <code>contador</code> y el n&uacute;mero <code>1</code>. Cuando eval&uacute;a la
-variable <code>contador</code>, se recibe su valor actual. Se pasa este valor y
-el n&uacute;mero <code>1</code> a <code>+</code> que los a&ntilde;ade. La suma
-es devuelta como el valor de la list interior y pasa a <code>setq</code> que
-asigna la variable <code>contador</code> a este nuevo valor. Por lo tanto, el
-valor de la variable <code>contador</code>, cambia.
-</p>
-<hr>
-<a name="Resumen"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicios-de-mensajes-de-error" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Resumen-1"></a>
-<h2 class="section">1.10 Resumen</h2>
-
-<p>Aprender Lisp es como subir una colina en la que la primera parte
-es la m&aacute;s empinada. Ahora has subido la parte m&aacute;s
-dif&iacute;cil; lo que queda se vuelve m&aacute;s f&aacute;cil a medida que
-avanzas hacia adelante.
-</p>
-<p>En resumen,
-</p>
-<ul>
-<li>
-Los programas Lisp se componen de expresiones, que son listas o &aacute;tomos
-individuales.
-
-</li><li>
-La listas se componen de cero o m&aacute;s &aacute;tomos o listas internas,
-separadas por espacios en blanco y rodeadas por par&eacute;ntesis. Una lista
-puede estar vac&iacute;a.
-
-</li><li>
-Los &aacute;tomos son s&iacute;mbolos multi-car&aacute;cter, como
-<code>forward-paragraph</code>, s&iacute;mbolos de un solo caracterer
-como <code>+</code>, cadenas de caracteres entre comillas dobles,
-o n&uacute;meros.
-
-</li><li>
-Un n&uacute;mero se eval&uacute;a a s&iacute; mismo.
-
-</li><li>
-Una cadena entre comillas dobles tambi&eacute;n se eval&uacute;a a
-s&iacute; mismo.
-
-</li><li>
-Cuando se eval&uacute;a un s&iacute;mbolo a s&iacute; mismo,
-su valor se devuelve.
-
-</li><li>
-Cuando se eval&uacute;a una lista, el int&eacute;rprete Lisp mira el primer
-s&iacute;mbolo en la lista y luego la definici&oacute;n de funci&oacute;n
-asociada a este s&iacute;mbolo. A continuaci&oacute;n, las
-instrucciones en la definici&oacute;n de funci&oacute;n se llevan a cabo.
-
-</li><li>
-Una marca de cita,
-<code>'</code>
-, le indica al int&eacute;rprete Lisp que devuelva la
-siguiente expresi&oacute;n como esta escrita, y no la eval&uacute;a como lo haria si
-la cita
-no estuviera alli.
-
-</li><li>
-Los argumentos son la informaci&oacute;n que se pasa a una funci&oacute;n. Los
-argumentos a una funci&oacute;n son computados evaluando el resto de los
-elementos de la lista de la que la funci&oacute;n es el primer elemento.
-
-</li><li>
-Una funci&oacute;n siempre devuelve un valor cuando se eval&uacute;a (a menos
-que obtenga un error); adem&aacute;s, tambi&eacute;n se puede llevar a cabo algun tipo
-de acci&oacute;n
-llamado &ldquo;efecto secundario&rdquo;. En muchos casos, el prop&oacute;sito principal
-de una funci&oacute;n es crear un efecto secundario.
-</li></ul>
-
-<hr>
-<a name="Ejercicios-de-mensajes-de-error"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Resumen" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicios-1"></a>
-<h2 class="section">1.11 Ejercicios</h2>
-
-<p>Unos ejercicios sencillos:
-</p>
-<ul>
-<li>
-Generar un mensaje de error evaluando un s&iacute;mbolo
-apropiado que no est&aacute; entre par&eacute;ntesis.
-
-</li><li>
-Generar un mensaje de error evaluando un s&iacute;mbolo
-apropiado que est&aacute; entre par&eacute;ntesis.
-
-</li><li>
-Crear un contador que se incrementa en dos en lugar de uno.
-
-</li><li>
-Escribe una expresi&oacute;n que imprima un mensaje en el &aacute;rea eco cuando es
-evaluada.
-</li></ul>
-
-<hr>
-<a name="Practicando-evaluaci_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Procesamiento-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicios-de-mensajes-de-error" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#C_00f3mo-evaluar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Practicando-evaluacion"></a>
-<h1 class="chapter">2 Practicando evaluaci&oacute;n</h1>
-<a name="index-Practicando-evaluacion"></a>
-<a name="index-Evaluacion-practica"></a>
-
-<p>Antes de aprender como escribir una definici&oacute;n de funci&oacute;n en Emacs
-Lisp, es &uacute;til gastar un poco de tiempo evaluando varias expresiones
-que ya han sido escritas. Estas expresiones ser&aacute;n listas con
-funciones como su primer (y con frecuencia &uacute;nico) elemento. Dado que
-algunas de las funciones asociadas con b&uacute;ffers son a la vez simples e
-interesantes, vamos a iniciar con estas. En esta secci&oacute;n,
-vamos a evaluar algunas de este tipo. En otra secci&oacute;n, estudiaremos el
-c&oacute;digo de varias otras funciones relacionadas con b&uacute;ffers, para
-ver la forma c&oacute;mo fueron escritas.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#C_00f3mo-evaluar">C&oacute;mo evaluar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Escribiendo comandos de edici&oacute;n o con
- <kbd>C-x C-e</kbd>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Nombres-de-b_00faffer">2.1 Nombres de b&uacute;ffer</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Buffers y ficheros son diferentes.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Obteniendo-b_00faffers">2.2 Obteniendo b&uacute;ffers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Obteniendo un buffer por s&iacute;
- mismo, no solamente su nombre.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Cambiando-b_00faffers">2.3 Cambiando b&uacute;ffers</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo cambiar a otro buffer.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Tama_00f1o-de-b_00faffer-y-localizaciones">2.4 Tama&ntilde;o de b&uacute;ffer y la ubicaci&oacute;n del punto</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> D&oacute;nde el punto est&aacute;
- localizado y el tama&ntilde;o del
- buffer.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-de-evaluaci_00f3n">2.5 Ejercicio</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio de evaluaci&oacute;n
-</td></tr>
-</table>
-
-<hr>
-<a name="C_00f3mo-evaluar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Nombres-de-b_00faffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Como-evaluar"></a>
-<h2 class="unnumberedsec">C&oacute;mo evaluar</h2>
-
-<p><i>Siempre que proporciona un comando de edici&oacute;n</i> a Emacs Lisp,
-como el comando para mover el cursor o para desplazarse por la pantalla,
-<i>se est&aacute; evaluando una expresi&oacute;n,</i> de la cual el primer elemento es
-una funci&oacute;n. <i>As&iacute; es c&oacute;mo funciona Emacs</i>.
-</p>
-<a name="index-funcion-interactiva-definida"></a>
-<a name="index-comando-definido"></a>
-<p>Al presionar las teclas, se causa que el int&eacute;rprete Lisp eval&uacute;e
-una expresi&oacute;n que devuelve resultados. Incluso escribir texto
-plano implica eval&uacute;ar una funci&oacute;n Emacs Lisp, en este caso,
-se utiliza <code>self-insert-command</code>, que simplemente inserta el
-caracter escrito. Las funciones que se eval&uacute;an presionando
-atajos de teclado se llaman funciones <em>interactive</em>, o
-<em>comandos</em>; como crear una funci&oacute;n interactive ser&aacute; ilustrado
-en el cap&iacute;tulo sobre c&oacute;mo escribir definiciones de
-funciones. Ver <a href="#Interactive">Creando una Funci&oacute;n Interactive</a>.
-</p>
-<p>Adem&aacute;s de presionar comandos de teclado, hemos visto una segunda
-manera de evaluar una expresi&oacute;n: colocar el cursor despu&eacute;s de
-una lista y presionar <kbd>C-x C-e</kbd>. Esto es lo que se har&aacute;
-en el resto de esta secci&oacute;n. Hay otras maneras de evaluar una
-expresi&oacute;n; que ser&aacute;n descritas cuando llegemos a ellas.
-</p>
-<p>Ademas de utilizarse para practicar la evaluaci&oacute;n, las funciones mostradas
-en
-las siguientes secciones son importantes por derecho
-propio. Un estudio de estas funciones deja claro la distinci&oacute;n
-entre b&uacute;ffers y ficheros, c&oacute;mo cambiar a un b&uacute;ffer, y como
-determinar una ubicaci&oacute;n dentro de ella.
-</p>
-<hr>
-<a name="Nombres-de-b_00faffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#C_00f3mo-evaluar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Obteniendo-b_00faffers" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Nombres-de-buffer"></a>
-<h2 class="section">2.1 Nombres de b&uacute;ffer</h2>
-<a name="index-buffer_002dname"></a>
-<a name="index-buffer_002dfile_002dname"></a>
-
-<p>Las dos funciones, <code>buffer-name</code> y <code>buffer-file-name</code>,
-muestran la diferencia entre un fichero y un b&uacute;ffer. Cuando
-se eval&uacute;a la siguiente expresi&oacute;n, <code>(buffer-name)</code>, el nombre
-del buffer aparece en el area eco. Al evaluar <code>(buffer-file-name)</code>, el
-nombre
-del fichero al que se relaciona el b&uacute;ffer aparece en el &aacute;rea
-echo. Normalmente, el nombre devuelto por <code>(buffer-name)</code> es el
-mismo que el nombre del fichero al que hace referencia, y el nombre
-devuelto por <code>(buffer-file-name)</code> es la ruta completa del fichero.
-</p>
-<p>Un fichero y un b&uacute;ffer son dos entidades diferentes. Un fichero es
-informaci&oacute;n grabada de manera permanente en el ordenador (a menos
-que se borre). Un b&uacute;ffer, por otro lado, es informaci&oacute;n dentro
-de Emacs que desaparecer&aacute; al final de la sesi&oacute;n de edici&oacute;n (o
-cuando se mate el b&uacute;ffer). Normalmente, un b&uacute;ffer contiene
-informaci&oacute;n que se ha copiado desde un fichero; decimos que
-el b&uacute;ffer est&aacute; <em>visitando</em> este fichero. Esta copia es la que se
-trabaja y modifica. Los cambios al b&uacute;ffer no cambian el fichero, hasta
-ser guardados. Al guardar el b&uacute;ffer, el b&uacute;ffer se copia en el
-fichero y por lo tanto se guarda de forma permanente.
-</p>
-<p>Si est&aacute; leyendo esto en Info dentro de GNU Emacs, puede evaluar
-cada una de las siguientes expresiones colocando el cursor
-despu&eacute;s de estas y pulsando <kbd>C-x C-e</kbd>.
-</p>
-<div class="example">
-<pre class="example">(buffer-name)
-
-(buffer-file-name)
-</pre></div>
-
-<p>Cuando hago esto en Info, el valor devuelto para la evaluaci&oacute;n de
-<code>(buffer-name)</code> es &lsquo;<tt>&quot;*info*&quot;</tt>&rsquo;, y el valor devuelto por
-evaluar <code>(buffer-file-name)</code> es &lsquo;<tt>nil</tt>&rsquo;.
-</p>
-<p>Por otro lado, mientras escribo este documento, el valor
-devuelto por la evaluaci&oacute;n de <code>(buffer-name)</code> es
-&lsquo;<tt>&quot;introduction.texinfo&quot;</tt>&rsquo;, y el valor devuelto por la evaluaci&oacute;n de
-<code>(buffer-file-name)</code> es &lsquo;<tt>&quot;/gnu/work/intro/introduction.texinfo&quot;</tt>&rsquo;.
-</p>
-<a name="index-nil_002c-historia-de-palabra"></a>
-<p>El primero es el nombre del b&uacute;ffer y el segundo es el nombre del
-fichero. En Info, el nombre del b&uacute;ffer es &lsquo;<tt>&quot;*info*&quot;</tt>&rsquo;. Info no
-apunta a ning&uacute;n fichero, por lo que el resultado de evaluar
-<code>(buffer-file-name)</code>] es &lsquo;<tt>nil</tt>&rsquo;. El s&iacute;mbolo
-<code>nil</code> proviene del Latin, significa &lsquo;nada&rsquo;; en este caso,
-significa que el b&uacute;ffer no est&aacute; asociado con ningun
-fichero. (En Lisp, <code>nil</code> tambi&eacute;n se usa con el significado de
-&lsquo;falso&rsquo; y es sin&oacute;mino para lista vac&iacute;a, <code>()</code>.)
-</p>
-<p>Cuando estoy escribiendo, el nombre de mi b&uacute;ffer es
-&lsquo;<tt>&quot;introduction.texinfo&quot;</tt>&rsquo;. El nombre del fichero al que
-se apunta es &lsquo;<tt>&quot;/gnu/work/intro/introduction.texinfo&quot;</tt>&rsquo;.
-</p>
-<p>(En las expresiones, los par&eacute;ntesis hacen que el int&eacute;rprete Lisp
-trate a <code><span class="nolinebreak">buffer-name</span></code> y <code><span class="nolinebreak">buffer-file-name</span></code> como
-funciones; sin los par&eacute;ntesis, el int&eacute;rprete
-intentar&iacute;a evaluar los s&iacute;mbolos como
-variables. Ver <a href="#Variables">Variables</a>.)
-</p>
-<p>A pesar de la distinci&oacute;n entre ficheros y b&uacute;ffers, con frecuencia
-encontrara que hay personas que se refieren a un fichero cuando quieren
-un b&uacute;ffer y vice-versa. En realidad, la mayor&iacute;a de la
-gente dice, &ldquo;Estoy editando un fichero,&rdquo; en lugar de decir,
-&ldquo;Estoy editando un b&uacute;ffer que pronto voy a guardar en un fichero.&rdquo;
-Esto casi siempre queda claro a partir del contexto de lo que las personas
-quieren
-decir. No obstante, al tratar con programas de ordenador, es
-importante tener la distinci&oacute;n en mente, ya que el ordenador no es
-tan inteligente como una persona.
-</p>
-<a name="index-Buffer_002c-historia-de-palabra"></a>
-<p>Por cierto, la palabra &lsquo;b&uacute;ffer&rsquo;, viene del significado de la
-palabra como un coj&iacute;n que amortigua la fuerza de una colisi&oacute;n. En los
-primeros ordenadores, un b&uacute;ffer amortiguaba la interacci&oacute;n entre
-los ficheros y la unidad central de procesamiento de la cumputadora. Los
-tambores o cintas
-que contenian un fichero y la unidad de procesamiento eran
-piezas de equipamiento muy diferentes entre si,
-trabajando a sus propias velocidades, por rachas. El b&uacute;ffer hizo posible
-que
-ambos trabajaran juntos de manera efectiva. Con el tiempo, el b&uacute;ffer
-pasó de ser un intermediario, a un lugar de almacenamiento temporal, donde
-se
-realiza el trabajo. Esta transformaci&oacute;n se parace bastante a la de
-un peque&ntilde;o puerto que se convierte en una gran ciudad:
-una vez fu&eacute; el lugar donde la carga era depositada temporalmente
-antes de ser cargada en los barcos; despues se convirtio en un centro
-comercial
-y cultural por derecho propio.
-</p>
-<p>No todos los b&uacute;ffers est&aacute;n asociados con ficheros. Por ejemplo, el
-b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; no visita ningun fichero. Del mismo modo, un
-b&uacute;ffer
-&lsquo;<tt>*Help*</tt>&rsquo; no est&aacute; asociado a ningun fichero.
-</p>
-<p>Anta&ntilde;o, cuando se carecia de un fichero &lsquo;<tt>~/.emacs</tt>&rsquo;
-y se iniciava una sesi&oacute;n Emacs escribiendo unicamente el comando
-<code>emacs</code>,
-sin nombrar ningun fichero, Emacs iniciaba con el b&uacute;ffer
-&lsquo;<tt>*scratch*</tt>&rsquo; visible. Hoy en d&iacute;a, vera una
-pantalla de vienvenida. Se puede seguir uno de los comandos sugeridos en
-dicha pantalla, visitar un fichero, o presionar la barra espaciadora
-para llegar al b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo;.
-</p>
-<p>Si cambia al b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo;, escriba
-<code>(buffer-name)</code>, coloque el cursor al final de la expresi&oacute;n, y
-presione
-<kbd>C-x C-e</kbd> para evaluar la expresi&oacute;n. El nombre
-<code>*scratch*</code> ser&aacute; devuelto y aparecer&aacute; en el &aacute;rea
-echo. <code>*scratch*</code> es el nombre del b&uacute;ffer. Al escribir y eval&uacute;ar
-<code>(buffer-file-name)</code> en el b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo;,
-<code>nil</code> aparecer&aacute; en el &aacute;rea echo, igual que cuando
-eval&uacute;a <code>(buffer-file-name)</code> en Info.
-</p>
-<p>Por cierto, si se encuentra en el b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; y
-quiere que el valor devuelto por una expresi&oacute;n aparesca en el
-b&uacute;ffer en s&iacute; y no en el &aacute;rea echo, presione <kbd>C-u C-x
-C-e</kbd> en lugar de <kbd>C-x C-e</kbd>. Esto causa que el valor devuelto
-aparezca despu&eacute;s de la expresi&oacute;n. El b&uacute;ffer se ver&aacute;
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(buffer-name)&quot;*scratch*&quot;
-</pre></div>
-
-<p>No se puede hacer esto en Info ya que Info es de solo lectura y no
-se permitir&aacute; cambiar el contenido del b&uacute;ffer. Pero puedes
-hacer esto en cualquier b&uacute;ffer que se puede editar; y cuando se escribe
-c&oacute;digo o documentaci&oacute;n (como este libro), esta funcionalidad
-es muy &uacute;til.
-</p>
-<hr>
-<a name="Obteniendo-b_00faffers"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Nombres-de-b_00faffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Cambiando-b_00faffers" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Obteniendo-buffers"></a>
-<h2 class="section">2.2 Obteniendo b&uacute;ffers</h2>
-<a name="index-current_002dbuffer"></a>
-<a name="index-other_002dbuffer"></a>
-<a name="index-Teniendo-un-buffer"></a>
-
-<p>La funci&oacute;n <code>buffer-name</code> devuelve el <em>nombre</em> del b&uacute;ffer;
-para obtener el b&uacute;ffer <em>en s&iacute;</em>, una funci&oacute;n
-diferente es necesaria: la funci&oacute;n <code>current-buffer</code>. Si usa
-esta funci&oacute;n en el c&oacute;digo, lo que se obtiene es el b&uacute;ffer en
-s&iacute;.
-</p>
-<p>Un nombre y el objeto o entidad a la que se refiere el nombre son
-cosas diferentes entre si. Tu no eres tu nombre, eres una persona a la que
-se
-refieren los demas por tu nombre. Si pides hablar con Jorge
-y alguien te entrega una tarjeta con las letras &lsquo;<samp>J</samp>&rsquo;, &lsquo;<samp>o</samp>&rsquo;,
-&lsquo;<samp>r</samp>&rsquo;, &lsquo;<samp>g</samp>&rsquo;, y &lsquo;<samp>e</samp>&rsquo; escritas, podr&iacute;as divertirte,
-pero no estar&iacute;as satisfecho. No quieres
-hablar con el nombre, sino con la persona a la que el
-nombre se refiere. Un b&uacute;ffer es similar: el nombre del b&uacute;ffer
-scratch es &lsquo;<tt>*scratch*</tt>&rsquo;, pero el nombre no es el b&uacute;ffer. Para
-obtener un b&uacute;ffer en s&iacute;, se necesita usar una
-funci&oacute;n como <code>current-buffer</code>.
-</p>
-<p>Sin embargo, hay una ligera complicaci&oacute;n: si eval&uacute;as
-<code>current-buffer</code> en una expresi&oacute;n por s&iacute; sola,
-como haremos aqu&iacute;, lo que ves es una representaci&oacute;n
-impresa del nombre del b&uacute;ffer sin los contenidos del b&uacute;ffer. Emacs
-funciona de esta forma por dos razones: el b&uacute;ffer puede contener
-miles de l&iacute;neas&mdash;demasiado largo para ser
-mostrado convenientemente; y, otro b&uacute;ffer puede tener los mismos
-contenidos pero un nombre diferente, y es importante distinguir entre ellos.
-</p>
-<p>Aqu&iacute; hay una expresi&oacute;n conteniendo la funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(current-buffer)
-</pre></div>
-
-<p>Si eval&uacute;a esta expresi&oacute;n en Info de la manera habitual,
-&lsquo;<tt>#&lt;buffer *info*&gt;</tt>&rsquo; aparecer&aacute; en el &aacute;rea echo. El formato
-especial indica que el b&uacute;ffer en s&iacute; est&aacute;
-siendo devuelto, en lugar de solo su nombre.
-</p>
-<p>Por cierto, si bien puedes escribir un n&uacute;mero o s&iacute;mbolo
-en un programa, no se puede hacer esto con la representaci&oacute;n impresa
-del b&uacute;ffer: la &uacute;nica manera de obtener un b&uacute;ffer
-en s&iacute; mismo es con una funci&oacute;n tal como
-<code>current-buffer</code>.
-</p>
-<p>Un funci&oacute;n relacionada es <code>other-buffer</code>. Esta devuelve el
-&uacute;ltimo buffer seleccionado distino al que te encuentras
-actualmente, no una representaci&oacute;n impresa de su
-nombre. Si recientemente has ido y vuelto del b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo;,
-<code>other-buffer</code> devolver&aacute; este b&uacute;ffer.
-</p>
-<p>Se puede ver esto evaluando la expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(other-buffer)
-</pre></div>
-
-<p>Ver&aacute;s que &lsquo;<tt>#&lt;buffer *scratch*&gt;</tt>&rsquo; aparece en el &aacute;rea echo, o el
-nombre de cualquier otro b&uacute;ffer cambiado anteriormente a partir del m&aacute;s
-reciente<a name="DOCF5" href="#FOOT5">(5)</a>
-</p>
-<hr>
-<a name="Cambiando-b_00faffers"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Obteniendo-b_00faffers" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Tama_00f1o-de-b_00faffer-y-localizaciones" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Cambiando-buffers"></a>
-<h2 class="section">2.3 Cambiando b&uacute;ffers</h2>
-<a name="index-switch_002dto_002dbuffer"></a>
-<a name="index-set_002dbuffer"></a>
-<a name="index-Cambiando-a-un-buffer"></a>
-
-<p>La funci&oacute;n <code>other-buffer</code> realmente proporciona un b&uacute;ffer
-cuando se utiliza como argumento de una funci&oacute;n que requiera
-uno. Podemos ver esto usando <code>other-buffer</code> y
-<code>switch-to-buffer</code> para cambiar a un b&uacute;ffer diferente.
-</p>
-<p>Pero primero, una breve introducci&oacute;n a la funci&oacute;n
-<code>switch-to-buffer</code>. Cuando cambia de ida y vuelta de
-Info al b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; para evaluar <code>(buffer-name)</code>,
-normalmente se
-presiona <kbd>C-x b</kbd> y se pasa &lsquo;<tt>*scratch*</tt>&rsquo;<a name="DOCF6" href="#FOOT6">(6)</a> en el minibuffer cuando se le solicita el nombre
-del b&uacute;ffer al que se quiere cambiar. El atajo, <kbd>C-x
-b</kbd>, hace que el int&eacute;rprete Lisp eval&uacute;e la funci&oacute;n interactiva
-<code>switch-to-buffer</code>. Como hemos dicho anteriormente,
-as&iacute; es como funciona Emacs: diferentes atajos de teclado
-llaman o ejecutan diferentes funciones. Por ejemplo, <kbd>C-f</kbd> llama a
-<code>forward-char</code>, <kbd>M-e</kbd> llama a <code>forward-sentence</code>,
-etc&rsquo;etera.
-</p>
-<p>Escribiendo <code>switch-to-buffer</code> en una expresi&oacute;n, y d&aacute;ndole un
-b&uacute;ffer para cambiar, se puede cambiar de b&uacute;ffers tal y como hace
-<kbd>C-x b</kbd>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(switch-to-buffer (other-buffer))
-</pre></div>
-
-<p>El s&iacute;mbolo <code>switch-to-buffer</code> es el primer elemento
-de la lista, por lo que el int&eacute;rprete Lisp lo tratar&aacute; como
-una funci&oacute;n y llevara a cavo las instrucciones adjuntas al mismo. Pero
-antes de
-hacer esto, el int&eacute;rprete observara que <code>other-buffer</code> est&aacute;
-dentro de par&eacute;ntesis y trabaja en este s&iacute;mbolo
-primero. <code>other-buffer</code> es el primer (y en este caso, el
-&uacute;nico) elemento de esta lista, por lo que el int&eacute;rprete
-Lisp llama o ejecuta la funci&oacute;n. Esto devuelve un buffer distinto al
-actual. A continuaci&oacute;n, el int&eacute;rprete ejecuta <code>switch-to-buffer</code>,
-pasando, como argumento, el b&uacute;ffer devuelto, que es al que Emacs
-cambia. Si est&aacute;s leyendo esto en Info, prueba esto ahora. Eval&uacute;a
-la expresi&oacute;n. (Para volver, presiona <kbd>C-x b
-&lt;RET&gt;</kbd>.)<a name="DOCF7" href="#FOOT7">(7)</a>.
-</p>
-<p>En los ejemplos de las secciones siguentes, veras con m&aacute;s frecuencia la
-funci&oacute;n <code>set-buffer</code> que <code>switch-to-buffer</code>. Esto es porque a
-diferencia
-de los programas de ordenador: los humanos tienen ojos y
-esperan ver el b&uacute;ffer en el que est&aacute;n trabajando en la
-terminal de su ordenador. Esto es tan obvio, que casi no hace falta
-decirlo. Sin embargo, los programas no tienen ojos. Cuando un
-programa de ordenador trabaja en un b&uacute;ffer, el b&uacute;ffer no
-necesita ser visible en la pantalla.
-</p>
-<p><code>switch-to-buffer</code> est&aacute; dise&ntilde;ado para los seres humanos y hace dos
-cosas diferentes: cambia el b&uacute;ffer a el que Emacs dirige la atenci&oacute;n;
-y cambia el b&uacute;ffer mostrada en la ventana al
-nuevo b&uacute;ffer. <code>set-buffer</code>, por otro lado, solo hace una cosa:
-cambia la atenci&oacute;n del programa del ordenador a un b&uacute;ffer diferente. El
-b&uacute;ffer en la pantalla permanece sin cambios (por supuesto, normalmente
-no ocurre nada hasta que el comando termina de ejecutarse).
-</p>
-<a name="index-llamada-definida"></a>
-<p>Tambi&eacute;n, acabamos introduciendo otro t&eacute;rmino tecnico, la
-palabra <em>llamada</em>. Cuando eval&uacute;as una lista en la que el
-primer s&iacute;mbolo es una funci&oacute;n, est&aacute;s llamando
-a esta funci&oacute;n. El uso del t&eacute;rmino viene de la noci&oacute;n de la
-funci&oacute;n como una entidad que puede hacer algo por ti cuando
-la &lsquo;llamas&rsquo; &mdash; al igual que un fontanero es una entidad que
-puede arreglar una fuga si le llamas.
-</p>
-<hr>
-<a name="Tama_00f1o-de-b_00faffer-y-localizaciones"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cambiando-b_00faffers" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-de-evaluaci_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Tamano-de-buffer-y-la-ubicacion-del-punto"></a>
-<h2 class="section">2.4 Tama&ntilde;o de b&uacute;ffer y la ubicaci&oacute;n del punto</h2>
-<a name="index-Tamano-del-buffer"></a>
-<a name="index-Tamano-del-Buffer"></a>
-<a name="index-Localizacion-del-Punto"></a>
-<a name="index-Localizacion-del-punto"></a>
-
-<p>Por último, vamos a ver varias funciones bastante simples,
-<code>buffer-size</code>, <code>point</code>, <code>point-min</code>, y
-<code>point-max</code>. Estas entregan informaci&oacute;n sobre el tama&ntilde;o de un
-b&uacute;ffer y la ubicaci&oacute;n del punto dentro de este.
-</p>
-<p>La funci&oacute;n <code>buffer-size</code> te dice el tama&ntilde;o del b&uacute;ffer
-actual; es decir, la funci&oacute;n devuelve un conteo del n&uacute;mero de caracteres
-en
-el buffer.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(buffer-size)
-</pre></div>
-
-<p>Puedes evaluar esto de la forma habitual, coloca el cursor
-despu&eacute;s de la expresi&oacute;n y presiona <kbd>C-x C-e</kbd>.
-</p>
-<a name="index-definicion-de-punto"></a>
-<p>En Emacs, la posici&oacute;n actual del cursor es llamada <em>punto</em>. La
-expresi&oacute;n <code>(point)</code> devuelve un n&uacute;mero que informa donde est&aacute;
-situado el cursor como un conteo del n&uacute;mero de caracteres desde el
-principio del b&uacute;ffer hasta el punto.
-</p>
-<p>Puedes ver el conteo de caracteres del punto para este b&uacute;ffer
-evaluando la siguiente expresi&oacute;n de la forma habitual:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(point)
-</pre></div>
-
-<p>Mientras escribo esto, el valor de <code>point</code> es 65724. La funci&oacute;n
-<code>point</code> se utiliza con frecuencia en algunos de los ejemplos
-mas adelante en este libro.
-</p>
-<p>El valor del punto depende, por supuesto, de su posici&oacute;n dentro del
-b&uacute;ffer. Si se eval&uacute;a el punto en este lugar, el n&uacute;mero ser&aacute;
-mayor:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(point)
-</pre></div>
-
-<p>Para m&iacute;, el valor del punto en esta posici&oacute;n es 66043,
-lo que significa que hay 319 caracteres (incluyendo espacios) entre
-las dos expresiones. (Sin duda, se ver&aacute;n diferentes n&uacute;meros, puesto
-que se ha editado esto desde que se evalu&oacute; (point).)
-</p>
-<a name="index-narrowing-definido"></a>
-<p>La funci&oacute;n <code>point-min</code> es similar a <code>point</code>, pero
-devuelve el valor m&iacute;nimo permisible del punto en el
-b&uacute;ffer actual. Este es el n&uacute;mero 1 a menos que <em>narrowing</em>
-est&eacute; en efecto. (Narrowing, <em>Encogiendo</em> es un mecanismo mediante el
-cual
-puedes restringirte a ti mismo, o un programa, a operar
-solo en un parte de un b&uacute;ffer. <a href="#Encogiendo-y-extendiendo">Encogiendo y extendiendo</a>.)
-Del mismo modo, la funci&oacute;n <code>point-max</code> devuelve el valor del
-valor m&aacute;ximo permisible del punto en el b&uacute;ffer actual.
-</p>
-<hr>
-<a name="Ejercicio-de-evaluaci_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Tama_00f1o-de-b_00faffer-y-localizaciones" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicio"></a>
-<h2 class="section">2.5 Ejercicio</h2>
-
-<p>Busca un fichero en el que trabajar y avanza hasta la
-mitad. Encuentra el nombre de b&uacute;ffer, el nombre del fichero,
-su tama&ntilde;o, y la posici&oacute;n en el fichero.
-</p>
-<hr>
-<a name="Escribiendo-funciones"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Practicando-evaluaci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-de-evaluaci_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Funciones-primitivas" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Como-escribir-definiciones-de-funciones"></a>
-<h1 class="chapter">3 C&oacute;mo escribir definiciones de funciones</h1>
-<a name="index-Escribiendo-la-Definicion"></a>
-<a name="index-Escribiendo-la-Definicion-de-Funcion"></a>
-<a name="index-Escribiendo-una-definicion-funcion"></a>
-
-<p>Cuando el int&eacute;rprete eval&uacute;a una lista, mira si el primer
-s&iacute;mbolo en la lista tiene una definici&oacute;n adjunta; o, dicho
-de otro
-modo, si el s&iacute;mbolo apunta a una definici&oacute;n de
-funci&oacute;n. Si lo hace, el ordenador lleva a cabo las instrucciones que
-aparecen en la
-definici&oacute;n. Un s&iacute;mbolo que tiene una definici&oacute;n de
-funci&oacute;n se llamada, simplemente, una funci&oacute;n (aunque hablando con
-propiedad, la definici&oacute;n es la funci&oacute;n y el s&iacute;mbolo
-se refiere a ella.)
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Funciones-primitivas">Una v&iacute;a acerca de funciones primitivas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Funciones primitivas
-</td></tr>
-<tr><td align="left" valign="top"><a href="#defun">3.1 La forma especial <code>defun</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Instalar">3.2 Instalar una definici&oacute;n de funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Interactive">3.3 Crear una funci&oacute;n interactive</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Creando una funci&oacute;n interactive.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Opciones-de-interactive_002e">3.4 Diferentes opciones para <code>interactive</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Instalaci_00f3n-Permanente">3.5 Instalar c&oacute;digo permanentemente</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Instalando c&oacute;digo permanentemente.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#let">3.6 <code>let</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Creando e inicializando variables locales.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#if">3.7 La forma especial <code>if</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iquest;Y qu&eacute; si?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#else">3.8 Expresiones if&ndash;then&ndash;else</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Expresiones If&ndash;then&ndash;else.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Verdad-y-falsedad">3.9 Verdad y falsedad en Emacs Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Que considera Lisp falso y cierto.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#save_002dexcursion">3.10 <code>save-excursion</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Guardando la traza del punto, la marca, y el
- buffer.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Revisar">3.11 Revisar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicios-defun">3.12 Ejercicios</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicios defun
-</td></tr>
-</table>
-
-<hr>
-<a name="Funciones-primitivas"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#defun" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Una-via-acerca-de-funciones-primitivas"></a>
-<h2 class="unnumberedsec">Una v&iacute;a acerca de funciones primitivas</h2>
-<a name="index-Funciones-primitivas"></a>
-<a name="index-Funciones_002c-primitiva"></a>
-
-<a name="index-Primitivas-en-lenguaje-C"></a>
-<a name="index-Primitivas-escritas-en-C"></a>
-<p>Todas las funciones se definen en t&eacute;rminos de otras
-funciones, a excepcion de algunas <em>primitivas</em> que estan
-escritas en el lenguaje de programaci&oacute;n C. Cuando escribas
-definiciones de funciones, deben escribirse en Emacs Lisp y utilizar otras
-funciones como bloques de construcci&oacute;n. Algunas de las funciones
-a utilizar estaran a su vez escritas en Emacs Lisp
-(quiz&aacute;s por t&iacute;) y algunas ser&aacute;n primitivas escritas
-en C. Las funciones primitivas se usan exactamente igual que las escritas en
-Emacs Lisp y se
-comportan de igual forma. Est&aacute;n escritas en C para que podamos ejecutar
-f&aacute;cilmente
-GNU Emacs en cualquier ordenador
-que tenga la potencia suficiente y pueda ejecutar C.
-</p>
-<p>Perm&iacute;teme volver a enfatizar esto: cuando se escribe c&oacute;digo
-en
-Emacs Lisp, no se distinge entre el uso de funciones escritas en C y el
-uso de funciones escritas en Emacs Lisp. La diferencia es
-irrevelante. Mencionon&eacute; la distinci&oacute;n solo porque es interesante
-conocerla. De hecho, a menos de que investigues, no sabras si una
-funci&oacute;n previamente escrita esta en Emacs Lisp o en C.
-</p>
-<hr>
-<a name="defun"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Funciones-primitivas" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Instalar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-forma-especial-defun"></a>
-<h2 class="section">3.1 La forma especial <code>defun</code></h2>
-<a name="index-defun"></a>
-<a name="index-Forma-Especial-de-defun"></a>
-
-<a name="index-definicion-funcion-definida"></a>
-<p>En Lisp, un s&iacute;mbolo como <code>mark-whole-buffer</code>
-tiene c&oacute;digo unido a el que le dice al ordenador que hacer cuando se
-invoca la
-funci&oacute;n. Este c&oacute;digo se denomina la <em>definici&oacute;n de
-funci&oacute;n</em> y se crea mediante la evaluaci&oacute;n de una expresi&oacute;n Lisp que
-comienza con
-el s&iacute;mbolo <code>defun</code> (que es una abreviatura para
-<em>define function</em> (definir funci&oacute;n)). Porque <code>defun</code> no eval&uacute;a
-sus
-argumentos en la forma habitual, eso se llama <em>forma especial</em>.
-</p>
-<p>En las siguientes secciones, miraremos en definiciones de funci&oacute;n
-partiendo del c&oacute;digo fuente de Emacs, por ejemplo
-<code>mark-whole-buffer</code>. En esta secci&oacute;n, describiremos una
-definici&oacute;n de funci&oacute;n sencilla, para que puedas ver su
-aspecto. Esta definici&oacute;n de funci&oacute;n usa aritm&eacute;tica porque es un
-ejemplo simple. A algunas personas les disgutan los ejemplos usando
-aritm&eacute;tica; sin embargo, si usted es tal persona, no se desespere. Casi
-ningun c&oacute;digo a estudiar en el resto de esta
-introducci&oacute;n implica aritm&eacute;tica o matem&aacute;ticas. Los
-ejemplos de manera mayoritaria involucran texto en una forma u otra.
-</p>
-<p>Una definici&oacute;n de funci&oacute;n tiene un m&aacute;ximo de cinco partes despues de
-la palabra <code>defun</code>:
-</p>
-<ol>
-<li>
-El nombre del s&iacute;mbolo al que la definici&oacute;n de
-funci&oacute;n debe vincularse.
-
-</li><li>
-Una lista de los argumentos que ser&aacute;n pasados a la funci&oacute;n. Si no
-hay argumentos que pasar, tendremos una lista vac&iacute;a,
-<code>()</code>.
-
-</li><li>
-Documentaci&oacute;n describiendo la funci&oacute;n. (T&eacute;cnicamente opcional,
-pero fuertemente recomendada.)
-
-</li><li>
-Opcionalmente, una expresi&oacute;n para hacer que la funci&oacute;n interactive
-pueda usarse presionando <kbd>M-x</kbd> seguido del
-nombre de la funci&oacute;n; o pulsando una tecla o atajo de teclado.
-
-<a name="index-cuerpo-definido"></a>
-</li><li>
-El c&oacute;digo que indica a el ordenador qu&eacute; hacer: el <em>cuerpo</em> de
-la definici&oacute;n de funci&oacute;n.
-</li></ol>
-
-<p>Es &uacute;til pensar en las cinco partes de una definici&oacute;n de funci&oacute;n
-siendo organizadas como una plantilla, con slots para cada parte:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun <var>nombre-de-funci&oacute;n</var> (<var>argumentos</var>&hellip;)
- &quot;<var>documentacion-opcional</var>&hellip;&quot;
- (interactive <var>argument-passing-info</var>) ; <span class="roman">opcional</span>
- <var>cuerpo</var>&hellip;)
-</pre></div>
-
-<p>A modo de ejemplo, aqu&iacute; est&aacute; el c&oacute;digo de una
-funci&oacute;n que multiplica su argumento por 7. (Este ejemplo no es
-interactivo. Ver <a href="#Interactive">Creando una Funci&oacute;n Interactive</a>,
-para esta informaci&oacute;n.)
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun multiplicar-por-siete (numero)
- &quot;Multiplica NUMERO por siete.&quot;
- (* 7 numero))
-</pre></div>
-
-<p>Esta definici&oacute;n comienza con un par&eacute;ntesis y el
-s&iacute;mbolo <code>defun</code> seguido por el nombre de la
-funci&oacute;n.
-</p>
-<a name="index-lista-de-argumentos-definida"></a>
-<p>El nombre de la funci&oacute;n es seguido por una lista que contiene
-los argumentos que ser&aacute;n pasados a la funci&oacute;n. Esta lista se
-llama <em>lista de argumentos</em>. En este ejemplo, la lista
-solo tiene un elemento, el s&iacute;mbolo <code>numero</code>. Cuando
-se utiliza la funci&oacute;n, el s&iacute;mbolo ser&aacute; asociado al
-valor que se utiliza como argumento de la funci&oacute;n
-</p>
-<p>En lugar de elegir la palabra <code>numero</code> para el nombre del
-argumento, podr&iacute;a haber escogido cualquier otro
-nombre. Por ejemplo, la palabra
-<code>multiplicando</code>. Escogi la palabra &lsquo;numero&rsquo; porque indica
-qu&eacute; tipo de valor se pretende para este espacio; pero
-podr&iacute;a haber elegido &lsquo;multiplicando&rsquo; para indicar el rol
-que jugara el valor en el funcionamiento de la
-funci&oacute;n. Podr&iacute;a haberlo llamado <code>foogle</code>, pero
-habr&iacute;a sido una mala elecci&oacute;n porque no
-comunicaria qu&eacute; significa. La elecci&oacute;n del nombre es
-responsabilidad del programador y debe elegirse para hacer que el
-significado de la funci&oacute;n sea claro.
-</p>
-<p>De hecho, se puede elegir cualquier nombre que se desee para un
-s&iacute;mbolo en una lista de argumentos, incluso el nombre
-del s&iacute;mbolo usado en alguna otra funci&oacute;n: el nombre a
-usar en una lista de argumentos es privado para esta definici&oacute;n
-particular. En esta definici&oacute;n, el nombre hace referencia a una entidad
-diferente a cualquiera que utilice el mismo nombre fuera de la
-definici&oacute;n de funci&oacute;n. Sup&oacute;n que tu familia te apoda &lsquo;Enano&rsquo;;
-cuando tus familiares digan &lsquo;Enano&rsquo;,
-queren hacer referencia a ti. Pero fuera de tu familia, en una
-pel&iacute;cula, por ejemplo, el nombre &lsquo;Enano&rsquo; se refiere a
-alguien m&aacute;s. Debido a que el nombre en una lista de argumentos es privado
-para la definici&oacute;n de la funci&oacute;n, se puede cambiar el valor de un
-s&iacute;mbolo dentro del cuerpo de una funci&oacute;n sin cambiar
-su valor fuera de la funci&oacute;n. El efecto es similar al producido
-por la expresi&oacute;n <code>let</code>. (Ver secci&oacute;n <a href="#let"><code>let</code></a>.)
-</p>
-
-<p>La lista de argumentos es seguida por la cadena de documentaci&oacute;n que
-describe la funci&oacute;n. Esto es lo que ves cuando presionas
-<kbd><span class="nolinebreak">C-h</span>&nbsp;f</kbd> y escribes el nombre de una funci&oacute;n. Por cierto, cuando
-escribas una cadena de documentaci&oacute;n como esta, debes confeccionar la
-primer l&iacute;nea como una sentencia completa ya que algunos
-comandos,
-como <code>apropos</code>, imprimen solo la primer l&iacute;nea
-de una cadena de documentaci&oacute;n de varias l&iacute;neas. Ademas, no
-debes indentar la segunda l&iacute;nea de la
-cadena de documentaci&oacute;n, si tienes una, porque se ve extraño al utilizar
-<kbd>C-h f</kbd>
-(<code>describe-function</code>). La cadena de documentaci&oacute;n es opcional, pero
-es
-tan &uacute;til, que deber&iacute;as incluirla en casi cualquier
-funci&oacute;n que escribas.
-</p>
-<a name="index-_002a-_0028multiplicacion_0029"></a>
-<p>La tercera l&iacute;nea del ejemplo consiste en el cuerpo de la
-definici&oacute;n de funci&oacute;n. (La mayor&iacute;a de las
-definiciones de funci&oacute;n, claro esta, son m&aacute;s extensas que esta.) En
-esta funci&oacute;n, el cuerpo es la lista, <code>(* 7 numero)</code>, que indica
-multiplicar el valor de <var>numero</var> por 7. (En Emacs Lisp, <code>*</code>
-es la funci&oacute;n para la multiplicaci&oacute;n, al igual que <code>+</code> es la
-funci&oacute;n de la adici&oacute;n.
-</p>
-<p>Cuando se utiliza la funci&oacute;n <code>multiplicar-por-siente</code>, el argumento
-<code>numero</code> se eval&uacute;a al numero que desees
-usar. He aqu&iacute; un ejemplo que muestra como
-utilizar <code>multiplicar-por-siente</code>; pero &iexcl;no intentes
-evaluar esto primero!.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(multiplicar-por-siente 3)
-</pre></div>
-
-<p>El s&iacute;mbolo <code>numero</code>, especificado en la
-definici&oacute;n de funci&oacute;n en la siguiente secci&oacute;n, se da o
-&ldquo;une a&rdquo; el valor 3 en el actual uso de la funci&oacute;n. Note que
-aunque <code>numero</code> estaba dentro de par&eacute;ntesis en la
-definici&oacute;n de funci&oacute;n, el argumento pasado a la funci&oacute;n
-<code>multiplicar-por-siente</code> no est&aacute; entre par&eacute;ntesis. Los
-par&eacute;ntesis se escriben en la definici&oacute;n de funci&oacute;n
-para que el ordenador pueda averiguar donde termina la lista de
-argumentos e inicia el resto de la definici&oacute;n de funci&oacute;n.
-</p>
-<p>Si eval&uacute;as este ejemplo, es probable que obtengas un mensaje de
-error. (&iexcl;adelante, intentalo!) Esto se debe a que hemos
-escrito la definici&oacute;n de funci&oacute;n pero a&uacute;n no se a comunicado
-al ordenador la definici&oacute;n &mdash; no hemos
-instalado (o &lsquo;cargado&rsquo;) la definici&oacute;n de funci&oacute;n en
-Emacs. Instalar una funci&oacute;n es el proceso comunicar al
-int&eacute;rprete Lisp la definici&oacute;n de la funci&oacute;n. La instalaci&oacute;n se
-describe en la siguiente secci&oacute;n.
-</p>
-<hr>
-<a name="Instalar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#defun" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Efecto-de-instalaci_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Instalar-una-definicion-de-funcion"></a>
-<h2 class="section">3.2 Instalar una definici&oacute;n de funci&oacute;n</h2>
-<a name="index-Instalar-una-definicion-de-funcion"></a>
-<a name="index-Definicion-de-la-instalacion"></a>
-<a name="index-Definicion-de-la-Instalacion-de-Funcion"></a>
-
-<p>Si est&aacute;s leyendo esto dentro de Info en Emacs, puedes probar la
-funci&oacute;n <code>multiply-by-seven</code> evaluando en primer ]ugar la definici&oacute;n
-de funci&oacute;n y luego evaluar <code>(multiplicar-por-siente 3)</code>. Hay una
-copia de la definici&oacute;n a continuaci&oacute;n. Coloca el cursor despu&eacute;s del
-&uacute;ltimo par&eacute;ntesis de la definici&oacute;n de funci&oacute;n y presiona
-<kbd>C-x C-e</kbd>. Al hacer esto, <code>multiplicar-por-siente</code>
-aparecer&aacute; en el &aacute;rea echo. (Lo que significa es que cuando una
-definici&oacute;n de funci&oacute;n se evalua, el valor devuelto es el nombre
-de la funci&oacute;n definida.) Al mismo tiempo, esta acci&oacute;n instala la
-definici&oacute;n de funci&oacute;n.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun multiplicar-por-siete (numero)
- &quot;Multiplica NUMERO por siete.&quot;
- (* 7 numero))
-</pre></div>
-
-<p>Al evaluar este <code>defun</code>, estas instanlado <code>multiply-by-seven</code>
-en Emacs. La funci&oacute;n es ahora solo una parte de Emacs como
-<code>forward-word</code> o cualquier otra funci&oacute;n de edici&oacute;n que
-utilices. (<code>multiplicar-por-siente</code> seguira instalado hasta que salgas
-de
-Emacs. Para volver a cargar el c&oacute;digo autom&aacute;ticamente cada vez que
-Emacs inicie, ver <a href="#Instalaci_00f3n-Permanente">Instalar C&oacute;digo Permanentemente</a>.)
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Efecto-de-instalaci_00f3n">El efecto de instalaci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Efecto de instalaci&oacute;n
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Cambiar-un-defun">3.2.1 Cambiar una definici&oacute;n de funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo cambiar una definici&oacute;n de funci&oacute;n
-</td></tr>
-</table>
-
-<hr>
-<a name="Efecto-de-instalaci_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Instalar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Instalar" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Cambiar-un-defun" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-efecto-de-instalacion"></a>
-<h3 class="unnumberedsubsec">El efecto de instalaci&oacute;n</h3>
-
-<p>Puedes ver el efecto de instalar <code>multiplicar-por-siente</code> evaluando
-el siguiente ejemplo. Coloca el cursor despu&eacute;s de la siguiente
-expresi&oacute;n y presiona <kbd>C-x C-e</kbd>. El n&uacute;mero 21 aparacer&aacute; en el
-&aacute;rea echo.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(multiplicar-por-siente 3)
-</pre></div>
-
-<p>Si lo deseas, puedes leer la documentaci&oacute;n de la funci&oacute;n
-presiona <kbd>C-h f</kbd> (<code>describe-function</code>) y luego escribe el
-nombre de la funci&oacute;n, <code>multiplicar-por-siente</code>. Al hacer esto,
-una ventana &lsquo;<tt>*Help*</tt>&rsquo; aparecer&aacute; en tu pantalla diciendo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">multiplicar-por-siente is a Lisp function.
-(multiplicar-por-siente NUMERO)
-
-Multiplica NUMERO por siete.
-</pre></div>
-
-<p>(Para volver a una sola ventana en la pantalla, presiona <kbd>C-x 1</kbd>.)
-</p>
-<hr>
-<a name="Cambiar-un-defun"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Efecto-de-instalaci_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Instalar" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Interactive" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Cambiar-una-definicion-de-funcion"></a>
-<h3 class="subsection">3.2.1 Cambiar una definici&oacute;n de funci&oacute;n</h3>
-<a name="index-Cambiando-una-definicion-de-funcion"></a>
-<a name="index-Definicion-de-Funcion_002c-como-cambiar"></a>
-<a name="index-Definicion_002c-como-cambiar"></a>
-
-<p>Si deseas modificar al c&oacute;digo de <code>multiplicar-por-siente</code>,
-simplemente
-reescr&iacute;belo. Para instalar la nueva versi&oacute;n en lugar
-de la vieja, eval&uacute;a la nueva definici&oacute;n de la funci&oacute;n.
-Esta, es la forma de modificar el c&oacute;digo en
-Emacs. Es muy simple,
-</p>
-<p>A modo de ejemplo, puedes cambiar la funci&oacute;n <code>multiplicar-por-siente</code>
-para sumar el n&uacute;mero a s&iacute; mismo siete veces en lugar de
-multiplicar el n&uacute;mero por siete. Esto produce el mismo resultado,
-pero por una ruta diferente. Al mismo tiempo, a&ntilde;adiremos un
-comentario al codigo; un comentario es texto que el int&eacute;rprete Lisp
-ignora,
-pero un lector humano puede encontrar &uacute;til o esclarecedor. El
-comentario es que esto es la &ldquo;segunda versi&oacute;n&rdquo;.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun multiplicar-por-siente (numero) ; <span class="roman">Segunda versi&oacute;n.</span>
- &quot;Multiplica NUMERO por siete.&quot;
- (+ numero numero numero numero numero numero numero))
-</pre></div>
-
-<a name="index-Comentarios-en-Codigo-Lisp"></a>
-<p>El comentario sigue a un punto y coma, &lsquo;<samp>;</samp>&rsquo;. En Lisp culquier cosa
-en una l&iacute;nea despues de un punto y coma es un
-comentario. El fin de la l&iacute;nea es el fin del
-comentario. Para extender un comentario por dos o m&aacute;s
-l&iacute;neas, inicia cada l&iacute;nea con un punto y
-coma.
-</p>
-<p>@xref{Beginning a .emacs File, , Empezando un Fichero
-@file{.emacs}}, y <a href="elisp.html#Comments">Comentarios</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>, para m&aacute;s informacion sobre los comentarios.
-</p>
-<p>Se puede instalar esta versi&oacute;n de la funci&oacute;n
-<code>multiply-by-seven</code> evaluando esta de la misma forma en que se
-evalu&oacute; la primer funci&oacute;n: coloca el cursor despu&eacute;s del
-&uacute;ltimo par&eacute;ntesis y presiona <kbd>C-x C-e</kbd>.
-</p>
-<p>En resumen, esta es la forma en que puedes escribir c&oacute;digo en Emacs Lisp:
-escribes una funci&oacute;n; la instalas; la pruebas; luego haces
-correciones y mejoras e inst&aacute;lalas de nuevo.
-</p>
-<hr>
-<a name="Interactive"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cambiar-un-defun" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#multiply_002dby_002dseven-interactivo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Crear-una-funcion-interactive"></a>
-<h2 class="section">3.3 Crear una funci&oacute;n interactive</h2>
-<a name="index-Funciones-Interactivas"></a>
-<a name="index-interactive"></a>
-
-<p>Haces a una funci&oacute;n interactiva colocando una lista que inicia con
-la clase especial <code>interactive</code> inmediatamente despu&eacute;s de la
-documentaci&oacute;n. Un usuario puede invocar una funci&oacute;n interactiva
-con <kbd>M-x</kbd> seguido del nombre de la funci&oacute;n; o
-con un atajo de teclado ligado a esta, por ejemplo,
-pulsa <kbd>C-n</kbd> para <code>next-line</code> o <kbd>C-x h</kbd> para
-<code>mark-whole-buffer</code>.
-</p>
-<p>Curiosamente, cuando se llama a una funci&oacute;n interactiva
-interactivamente, el valor devuelto no se muestra autom&aacute;ticamente
-en el &aacute;rea echo. Esto se bede a que a menudo se llama a
-una funci&oacute;n interactiva para sus efectos secundarios, tales como
-avanzar hacia adelante por palabra o l&iacute;nea, y no
-para el valor devuelto. Si el valor devuelto fuera mostrado en el
-&aacute;rea echo cada vez que presionas una tecla,
-distraer&iacute;a mucho
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#multiply_002dby_002dseven-interactivo">Un <code>multiply-by-seven</code> interactivo, Un resumen</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un resumen
-</td></tr>
-<tr><td align="left" valign="top"><a href="#multiply_002dby_002dseven-en-detalle">3.3.1 <code>multiplicar-por-siente</code> interactivo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La versi&oacute;n interactive.
-</td></tr>
-</table>
-
-<hr>
-<a name="multiply_002dby_002dseven-interactivo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Interactive" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Interactive" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#multiply_002dby_002dseven-en-detalle" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Un-multiply_002dby_002dseven-interactivo_002c-Un-resumen"></a>
-<h3 class="unnumberedsubsec">Un <code>multiply-by-seven</code> interactivo, Un resumen</h3>
-
-<p>Tanto el uso de la forma especial <code>interactive</code> y una forma de
-mostrar un valor en el &aacute;rea echo pueden ilustrarse creando una
-versi&oacute;n interactiva de <code>multiplicar-por-siente</code>.
-</p>
-<p>Aqu&iacute; est&aacute; el c&oacute;digo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun multiplicar-por-siente (numero) ; <span class="roman">Versi&oacute;n Interactiva.</span>
- &quot;Multiplica NUMERO por siete.&quot;
- (interactive &quot;p&quot;)
- (message &quot;El resultado es %d&quot; (* 7 numero)))
-</pre></div>
-
-<p>Para instalar este c&oacute;digo colaca el cursor despu&eacute;s del ultimo parentesis
-y
-presiona <kbd>C-x C-e</kbd>. El nombre de la funci&oacute;n aparecer&aacute; en el
-&aacute;rea echo. Despues, puedes utilizar este c&oacute;digo al presionar
-<kbd>C-u</kbd> seguido de un n&uacute;mero, lugo <kbd>M-x
-multiplicar-por-siente</kbd> y finalmente &lt;RET&gt;. La frase &lsquo;<samp>El
-resultado es &hellip;</samp>&rsquo; seguida por el producto aparecer&aacute; en el &aacute;rea
-echo
-</p>
-<p>Hablando en terminos mas generales, puedes invocar una funci&oacute;n como
-&eacute;sta de dos maneras:
-</p>
-<ol>
-<li>
-Al escribir un argumento prefijo que contiene el n&uacute;mero a pasar, y
-a continuaci&oacute;n presionar <kbd>M-x</kbd> y escribir el nombre de la funci&oacute;n,
-como ocurre con
-<kbd>C-u 3 M-x forward-sentence</kbd>; o,
-
-</li><li>
-Al escribir cualquier tecla o atajo de teclado ligado a la funcion a tratar,
-como ocurre con <kbd>C-u 3 M-e</kbd>.
-</li></ol>
-
-<p>Ambos ejemplos operan de forma identica moviendo el punto
-hacia adelantes tres frases. (Si <code>multiply-by-seven</code> no
-estuviese ligado a una tecla, no podr&iacute;a ser usado
-como ejemplo de enlace a tecla.
-</p>
-<p>(V&eacute;ase la secci&oacute;n <a href="#Atajos-de-teclado">Algunos Atajos de Teclas</a>, para aprender
-como vincular un comando a una tecla.)
-</p>
-<p>Un argumento prefijo se pasa a una funci&oacute;n interactiva
-pulsando la tecla &lt;META&gt; seguida por un n&uacute;mero, por ejemplo,
-<kbd>M-3 M-e</kbd>, o con <kbd>C-u</kbd> y luego un n&uacute;mero, por
-ejemplo, <kbd>C-u 3 M-e</kbd> (si presionas <kbd>C-u</kbd> sin ningun n&uacute;mero, el
-valor por
-defecto es 4).
-</p>
-<hr>
-<a name="multiply_002dby_002dseven-en-detalle"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#multiply_002dby_002dseven-interactivo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Interactive" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Opciones-de-interactive_002e" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="multiplicar_002dpor_002dsiente-interactivo"></a>
-<h3 class="subsection">3.3.1 <code>multiplicar-por-siente</code> interactivo</h3>
-
-<p>Veamos la clase especial <code>interactive</code> y
-despues la funci&oacute;n <code>message</code> en la versi&oacute;n interactiva de
-<code>multiplicar-por-siente</code>. Recordaras que la definici&oacute;n de
-funci&oacute;n tiene el siguente aspecto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun multiplicar-por-siente (numero) ; <span class="roman">Versi&oacute;n Interactiva.</span>
- &quot;Multiplica NUMERO por siete.&quot;
- (interactive &quot;p&quot;)
- (message &quot;El resultado es %d&quot; (* 7 numero)))
-</pre></div>
-
-<p>En esta funci&oacute;n, la expresi&oacute;n, <code>(interactive &quot;p&quot;)</code>, es una
-lista de dos elementos. La <code>&quot;p&quot;</code> le indica a Emacs que debe pasar el
-argumento prefijo a la funci&oacute;n y utilizar este valor para el argumento de
-la funci&oacute;n.
-</p>
-<p>El argumento debe ser un n&uacute;mero. Esto significa que el
-s&iacute;mbolo <code>numero</code> estara asociado a un
-n&uacute;mero en la l&iacute;nea:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(message &quot;El resultado es %d&quot; (* 7 numero))
-</pre></div>
-
-<p>Por ejemplo, si tu argumento prefijo es 5, el int&eacute;rprete Lisp
-evaluar&aacute; la l&iacute;nea como si fuera:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(message &quot;El resultado es %d&quot; (* 7 5))
-</pre></div>
-
-<p>(Si est&aacute;s leyendo esto en GNU Emacs, puedes evaluar esta
-expresi&oacute;n por ti mismo.) Primera, el int&eacute;rprete
-evaluar&aacute; la lista interna, que es <code>(* 7 5)</code>. Esto devuelve un
-valor de 35. A continuaci&oacute;n, se evaluar&aacute; la lista externa, pasando los
-valores del segundo y posteriores elementos de la lista a la
-funci&oacute;n <code>message</code>.
-</p>
-<p>Como hemos visto, <code>message</code> es una funci&oacute;n Emacs Lisp
-especialmente dise&ntilde;ada para enviar un
-mensaje de una l&iacute;nea al usuario. (V&eacute;ase la secci&oacute;n <a href="#message">La funci&oacute;n <code>message</code></a>)
-En resumen, la funci&oacute;n <code>message</code> imprime su primer argumento en
-el &aacute;rea echo tal cual, exceptuando las apariciones de &lsquo;<samp>%d</samp>&rsquo;, o
-&lsquo;<samp>%s</samp>&rsquo; (y varias otras secuencias de control que no hemos
-mencionado). Cuando aparece una secuencia de control, la funci&oacute;n observa
-al segundo o posteriores argumentos e imprime el valor del argumento
-en la ubicaci&oacute;n donde se encuentra la secuencia de control.
-</p>
-<p>En la funci&oacute;n interactiva <code>multiplicar-por-siente</code>, la cadena de
-control es &lsquo;<samp>%d</samp>&rsquo;, que requiere un n&uacute;mero, y el valor devuelto
-por la evaluaci&oacute;n de <code>(* 7 5)</code> es el n&uacute;mero 35. Por consiguiente,
-el
-n&uacute;mero 35 se imprime en lugar de &lsquo;<samp>%d</samp>&rsquo; y el mensaje es &lsquo;<samp>El
-resultado es 35</samp>&rsquo;.
-</p>
-<p>(N&oacute;tese que cuando llamas a la funci&oacute;n <code>multiplicar-por-siente</code>,
-el mensaje se imprime sin comillas, pero cuando llamas a
-<code>message</code>, el texto se impreme entre comillas. Esto se debe
-a que el valor devuelto por <code>message</code> aparece en el &aacute;rea echo
-cuando eval&uacute;as una expresi&oacute;n cuyo primer elemento es
-<code>message</code>; pero si se integra en una funci&oacute;n,
-<code>message</code> imprime el texto como un efecto secundario sin comillas.)
-</p>
-<hr>
-<a name="Opciones-de-interactive_002e"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#multiply_002dby_002dseven-en-detalle" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Instalaci_00f3n-Permanente" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Diferentes-opciones-para-interactive"></a>
-<h2 class="section">3.4 Diferentes opciones para <code>interactive</code></h2>
-<a name="index-Opciones-para-interactive"></a>
-<a name="index-Opciones-Interactive"></a>
-
-<p>En el ejemplo, <code>multiplicar-por-siente</code> usa <code>&quot;p&quot;</code> como el
-argumento para <code>interactive</code>. Este argumento indica a Emacs que
-interprete cualquier cosa que escriba despues de <kbd>C-u</kbd> o
-del comando &lt;META&gt; como un n&uacute;mero que sera el argumento a pasar
-a la funci&oacute;n. Emacs tiene m&aacute;s de veinte
-caracteres predefinidos para usar con <code>interactive</code>. En casi todos los
-casos, una de estas opciones te permitira pasar la
-informaci&oacute;n adecuada interactivamente a una
-funci&oacute;n. (See <a href="elisp.html#Interactive-Codes">Car&aacute;cteres C&oacute;digo para <code>interactive</code></a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>).
-</p>
-<p>Considera la funci&oacute;n <code>zap-to-char</code>. Su expresi&oacute;n interactiva es
-</p>
-<div class="smallexample">
-<pre class="smallexample">(interactive &quot;p\ncZap to char: &quot;)
-</pre></div>
-
-<p>La primer parte del argumento de <code>interactive</code> es &lsquo;<samp>p</samp>&rsquo;,
-con el que ya est&aacute;s familiarizado. Este argumento le indica a Emacs
-intepretar un &lsquo;prefijo&rsquo;, como un n&uacute;mero que se pasa a la
-funci&oacute;n. Puedes especificar un prefijo plesionando <kbd>C-u</kbd>
-seguido por un n&uacute;mero o igualmente con &lt;META&gt; seguido por un
-n&uacute;mero. El prefijo es un n&uacute;mero de caracteres especifico. De
-este modo, si el prefijo es tres y el caracter
-establecido es &lsquo;<samp>x</samp>&rsquo;, entonces se borrar&aacute; todo el
-texto incluido el tercer &lsquo;<samp>x</samp>&rsquo; siguiente. Si no se establece un
-prefijo, entonces borras todo el texto incluido el cuarto car&aacute;cter
-establecido, pero no m&aacute;s.
-</p>
-<p>La &lsquo;<samp>c</samp>&rsquo; indica a la funci&oacute;n el nombre del car&aacute;cter que va a
-eliminar.
-</p>
-<p>M&aacute;s formalmente, una funci&oacute;n con dos o m&aacute;s argumentos puede
-tener informaci&oacute;n que pasa a cada argumento a&ntilde;adiendo partes en la
-cadena viene despues de <code>interactive</code>. Cuando haces esto, la
-informaci&oacute;n se pasa a cada argumento en el mismo orden que se especifica
-en la lista <code>interactive</code>. En la cadena, cada
-parte est&aacute; separada de la siguiente parte por un &lsquo;<samp>\n</samp>&rsquo;, que
-significa nueva l&iacute;nea. Por ejemplo, a
-&lsquo;<samp>p</samp>&rsquo; puede continuar un &lsquo;<samp>\n</samp>&rsquo; y un &lsquo;<samp>cZap to char:</samp>&rsquo;. Esto hace
-que
-Emacs pase el valor del argumento prefijo (si lo hay) y el
-car&aacute;cter.
-</p>
-<p>En este caso, la definici&oacute;n de funci&oacute;n se parace a la siguiente,
-donde <code>arg</code> y <code>char</code> son los s&iacute;mbolos que
-<code>interactive</code> vincula el argumento prefijo y el caracter especificado:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun <var>nombre-de-funcion</var> (arg char)
- &quot;<var>documentacion</var>&hellip;&quot;
- (interactive &quot;p\ncZap to char: &quot;)
- <var>cuerpo-de-funcion</var>&hellip;)
-</pre></div>
-
-<p>(El espacio despu&eacute;s del punto y coma en pantalla hace que se vea
-mejor. V&eacute;ase la secci&oacute;n <a href="#copy_002dto_002dbuffer">La Definici&oacute;n de <code>copy-to-buffer</code></a>, para un ejemplo.)
-</p>
-<p>Cuando una funci&oacute;n no toma argumentos, <code>interactive</code> no
-requiere ninguno. Una funci&oacute;n asi contiene unicamente la expresi&oacute;n
-<code>(interactive)</code>. La funci&oacute;n <code>mark-whole-buffer</code> es asi.
-</p>
-<p>Alternativamente, si los c&oacute;digos de letras especiales no son adecuados
-para tu
-aplicaci&oacute;n, puedes pasar tus propios argumentos a
-<code>interactive</code> como una lista.
-</p>
-<p>V&eacute;ase la secci&oacute;n <a href="#append_002dto_002dbuffer">La Definici&oacute;n de <code>append-to-buffer</code></a>,
-para un ejemplo. See <a href="elisp.html#Using-Interactive">Usando <code>interactive</code></a> in <cite>El Manual de GNU Emacs Lisp</cite>, para una
-explicaci&oacute;n m&aacute;s completa acerca de esta t&eacute;cnica.
-</p>
-<hr>
-<a name="Instalaci_00f3n-Permanente"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Opciones-de-interactive_002e" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#let" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Instalar-codigo-permanentemente"></a>
-<h2 class="section">3.5 Instalar c&oacute;digo permanentemente</h2>
-<a name="index-Instalar-codigo-permanentemente"></a>
-<a name="index-Codigo-Permanente-de-Instalacion"></a>
-<a name="index-Codigo-de-instalacion"></a>
-
-<p>Cuando instalas una definici&oacute;n de funci&oacute;n evaluada por ti,
-permanecera instalada hasta que salgas de Emacs. La
-proxima vez que inicies una nueva sesi&oacute;n de Emacs, la
-funci&oacute;n no ser&aacute; instalada a menos que eval&uacute;es de nuevo la
-definici&oacute;n.
-</p>
-<p>En alg&uacute;n punto, podrias necesitar que el c&oacute;digo se instale
-autom&aacute;ticamente cada vez que inicies una nueva sesi&oacute;n de
-Emacs. Hay varias formas de hacer esto:
-</p>
-<ul>
-<li>
-Si tienes c&oacute;digo solo para tu uso, puedes poner el
-c&oacute;digo de la definici&oacute;n de funci&oacute;n en el fichero de
-inicializaci&oacute;n &lsquo;<tt>.emacs</tt>&rsquo;. Cuando se inicia Emacs, el fichero
-&lsquo;<tt>.emacs</tt>&rsquo; se eval&uacute;a autom&aacute;tica y se instalan todas sus definiciones
-de
-funci&oacute;n. V&eacute;ase la secci&oacute;n <a href="#Inicializaci_00f3n-de-Emacs">Tu Fichero &lsquo;<tt>.emacs</tt>&rsquo;</a>.
-
-</li><li>
-Como Alternativa, puedes poner las definiciones de funci&oacute;n
-en uno o m&aacute;s ficheros y usar la funci&oacute;n
-<code>load</code> para hacer que Emacs evalue y con ello instale cada una de las
-funciones en
-los ficheros. V&eacute;ase la secci&oacute;n <a href="#Cargando-ficheros">Cargando ficheros</a>.
-
-</li><li>
-En tercer lugar, si tienes c&oacute;digo que todo tu sitio va a utilizar, es
-normal
-ponerlo en un fichero llamado &lsquo;<tt>site-init.el</tt>&rsquo; que se carga
-cuando se construye Emacs. Esto hace que el c&oacute;digo este disponible a
-cualquiera que use tu m&aacute;quina. (Mira el fichero &lsquo;<tt>INSTALL</tt>&rsquo; que
-forma parte de la distribuci&oacute;n Emacs.)
-</li></ul>
-
-<p>Finalmente, si tienes c&oacute;digo que cualquier usuario de Emacs puede
-querer, puedes publicarlo en una red de ordenadores o enviar una copia a
-la Free Software Foundation. (Al hacer esto, por favor, licencia
-el c&oacute;digo y su documentaci&oacute;n bajo una licencia que permita a otras
-personas ejecutar, copiar, estudiar, modificar, y redistribuir el
-c&oacute;digo y te proteja de quien tome tu trabajo.) Si envias
-una copia de tu c&oacute;digo a la Free Software Foundation, y lo proteges
-apropiadamente de t&iacute; mismo y otros, puede ser
-incluido en la siguiente version de Emacs. En gran parte, esta
-es la forma como ha crecido Emacs a trav&eacute;s de los
-a&ntilde;os, por donaciones.
-</p>
-<hr>
-<a name="let"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Instalaci_00f3n-Permanente" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Prevenir-confusi_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="let-1"></a>
-<h2 class="section">3.6 <code>let</code></h2>
-<a name="index-let"></a>
-
-<p>La expresi&oacute;n <code>let</code> es una forma especial en Lisp que
-tendras que utilizar en la mayor&iacute;a de las
-definiciones de funci&oacute;n.
-</p>
-<p><code>let</code> se utiliza para unir o enlazar un s&iacute;mbolo
-a un valor de tal manera que el int&eacute;rprete no confunda la
-variable con otra variable del mismo nombre que no forma parte de la
-funci&oacute;n.
-</p>
-<p>Para comprender por qu&eacute; la forma especial <code>let</code> es necesaria,
-considera la situaci&oacute;n donde eres dueño de una casa que generalmente
-vinculas con
-&lsquo;la casa&rsquo;, como en la frase, &ldquo;La casa necesita
-pintura.&rdquo; Si visitas a un amigo y tu anfitri&oacute;n hace
-referencia a &lsquo;la casa&rsquo;, es probable que se refiera a
-<em>su</em> casa, no a la tuya, es decir, es una casa distinta.
-</p>
-<p>Si tu amigo se refiere a su casa y tu crees que &eacute;l se
-est&aacute; refiri&eacute;ndo a tu casa, puedes tener cierta
-confusi&oacute;n. Lo mismo podria ocurrir en Lisp si una
-variable que se utiliza dentro de una funci&oacute;n tiene el mismo que una
-variable usada dentro de otra funci&oacute;n, y las dos no tienen la
-intenci&oacute;n de referirse al mismo valor. La forma especial <code>let</code>
-previene este tipo de confusi&oacute;n.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Prevenir-confusi_00f3n"><code>let</code> evita confusiones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Prevenir confusi&oacute;n
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Partes-de-la-expresi_00f3n-let">3.6.1 Las partes de una expresi&oacute;n <code>let</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Partes de la expresi&oacute;n let
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejemplo-de-expresi_00f3n-let">3.6.2 Ejemplo de Expresi&oacute;n <code>let</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo de expresi&oacute;n let
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Variables-let-inicializadas">3.6.3 Variables sin inicializar en un sentencia <code>let</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Variables let inicializadas
-</td></tr>
-</table>
-
-<hr>
-<a name="Prevenir-confusi_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#let" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#let" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Partes-de-la-expresi_00f3n-let" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="let-evita-confusiones"></a>
-<h3 class="unnumberedsubsec"><code>let</code> evita confusiones</h3>
-
-<a name="index-variable-local-definida"></a>
-<a name="index-variable_002c-local_002c-definida"></a>
-<p>La forma especial <code>let</code> evita confusiones. <code>let</code> crea
-un nombre para una <em>variable local</em> que eclipsa cualquier uso
-del mismo nombre fuera de la expresi&oacute;n <code>let</code>. Esto es como
-entender que siempre que tu anfitri&oacute;n se refiera a &lsquo;la casa&rsquo;,
-significa su casa, no la tuya. (Los s&iacute;mbolos usados en
-las listas de argumentos funcionan de la misma manera. V&eacute;ase la secci&oacute;n <a href="#defun">La Forma Especial <code>defun</code></a>.)
-</p>
-<p>Las variable locales por una expresi&oacute;n <code>let</code> conservan
-su valor <em>solo</em> dentro de la expresi&oacute;n <code>let</code>
-misma (y dentro de expresiones llamadas dentro de la expresi&oacute;n
-<code>let</code>); las variables locales no tiene efecto fuera de la
-expresi&oacute;n <code>let</code>.
-</p>
-<p>Otra forma de pensar respecto a <code>let</code> es que es como un
-<code>setq</code> que es temporal y local. Los valores establecidos por
-<code>let</code> son autom&aacute;ticamente deshechos cuando termina el <code>let</code>.
-La configuraci&oacute;n solo afecta a las expresiones que se encuentran
-dentro de los limites de la expresi&oacute;n <code>let</code>. En jerga
-informatica, dir&iacute;amos &ldquo;la
-union de un simbolo es visible solo en las
-funciones llamadas en la forma <code>let</code>; en Emacs Lisp, el alcance
-es din&aacute;mico, no l&eacute;xico.&rdquo;
-</p>
-<p><code>let</code> puede crear m&aacute;s de una variable a la vez. Ademas,
-<code>let</code> da a cada variable que crea un valor inicial, ya sea un valor
-especificado por t&iacute;, o <code>nil</code>. (En la jerga, eso se
-llama &lsquo;unir la variable al valor&rsquo;.) Despu&eacute;s que <code>let</code> ha creado
-y unido las variables, ejecuta el c&oacute;digo en el cuerpo del
-<code>let</code> y devuelve el valor de la &uacute;ltima expresi&oacute;n en el
-cuerpo, como el valor de toda la expresi&oacute;n <code>let</code>.
-(&lsquo;Ejecutar&rsquo; es un t&eacute;rmino tecnico que significa evaluar
-una lista: proviene del significando de la palabra &lsquo;llevar a la
-pr&aacute;ctica&rsquo; (<cite>Diccionario de Ingl&eacute;s de Oxford</cite>). Dado que
-eval&uacute;as una expresi&oacute;n para realizar una acci&oacute;n, &lsquo;ejecutar&rsquo; ha
-evolucionado como un sin&oacute;nimo para &lsquo;evaluar&rsquo;.)
-</p>
-<hr>
-<a name="Partes-de-la-expresi_00f3n-let"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Prevenir-confusi_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#let" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-de-expresi_00f3n-let" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Las-partes-de-una-expresion-let"></a>
-<h3 class="subsection">3.6.1 Las partes de una expresi&oacute;n <code>let</code></h3>
-<a name="index-expresion-let_002c-partes-de"></a>
-<a name="index-Partes-de-la-expresion-let"></a>
-
-<a name="index-varlist-definida"></a>
-<p>Una expresi&oacute;n <code>let</code> es una lista de tres partes. La primer
-parte es el s&iacute;mbolo <code>let</code>. La segunda parte es una
-lista, denominada <em>varlist</em> (lista de variables), cada uno de cuyos
-elementos es un
-s&iacute;mbolo por s&iacute; mismo o una lista de dos
-elementos, el primer elemento es un s&iacute;mbolo. La
-tercera parte de la expresi&oacute;n <code>let</code> es el cuerpo del
-<code>let</code>. El cuerpo normalmente consiste de una o m&aacute;s listas.
-</p>
-<p>Una plantilla para una expresi&oacute;n <code>let</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let <var>varlist</var> <var>body</var>&hellip;)
-</pre></div>
-
-<p>Los s&iacute;mbolos en la varlist son las variables que dan
-los valores iniciales para la forma especial <code>let</code>. Los
-s&iacute;mbolos por s&iacute; solos reciven el
-valor inicial de <code>nil</code>; y cada s&iacute;mbolo que es el
-primer elemento de una lista de dos elementos es unido al valor
-que el devuelto cuando el int&eacute;rprete Lisp eval&uacute;a el segundo elemento.
-</p>
-<p>De este modo, una varlist como:
-<code>(thread (needles 3))</code>. En este caso, dentro una expresi&oacute;n
-<code>let</code>, Emacs une el s&iacute;mbolo <code>thread</code> a un
-valor inicial de <code>nil</code>, y une el s&iacute;mbolo
-<code>needles</code> a un valor inicial de 3.
-</p>
-<p>Cuando escribes una expresi&oacute;n <code>let</code>, lo que haces es poner las
-expresiones apropiadas en los huecos de la plantilla de expresi&oacute;n
-<code>let</code>.
-</p>
-<p>Si la varlist est&aacute; compuesta de listas de 2 elementos,
-como suele ser el caso, la plantilla de la expresi&oacute;n
-<code>let</code> es la siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let ((<var>variable</var> <var>valor</var>)
- (<var>variable</var> <var>valor</var>)
- &hellip;)
- <var>cuerpo</var>&hellip;)
-</pre></div>
-
-<hr>
-<a name="Ejemplo-de-expresi_00f3n-let"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Partes-de-la-expresi_00f3n-let" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#let" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Variables-let-inicializadas" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejemplo-de-Expresion-let"></a>
-<h3 class="subsection">3.6.2 Ejemplo de Expresi&oacute;n <code>let</code></h3>
-<a name="index-Ejemplo-de-Expresion-let"></a>
-<a name="index-expresion-simple-let"></a>
-
-<p>La siguiente expresi&oacute;n crea y da valores iniciales a las
-dos variables <code>cebra</code> y <code>tigre</code>. El cuerpo de la expresi&oacute;n
-<code>let</code> es una lista que llama a la funci&oacute;n <code>message</code>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let ((cebra 'rayas)
- (tigre 'fiero))
- (message &quot;Un tipo de animal tiene %s y otro es %s.&quot;
- cebra tigre))
-</pre></div>
-
-<p>Aqu&iacute;, la varlist es <code>((cebra 'rayas) (tigre
-'fiero))</code>.
-</p>
-<p>Las dos variables son <code>cebra</code> y <code>tigre</code>. Cada variable es el
-primer elemento de una lista de dos elementos y cada valor es el
-segundo elemento de su lista de dos elementos. En la varlist, Emacs
-une la variable <code>cebra</code> al valor <code>rayas</code><a name="DOCF8" href="#FOOT8">(8)</a>, y
-une la variable <code>tigre</code> al valor <code>fiero</code>. En este
-ejemplo, ambos valores son s&iacute;mbolos precedidos por una
-cita. Los valores podr&iacute;an muy bien haber sido otra
-lista o una cadena. El cuerpo de <code>let</code> sigue despu&eacute;s de la lista
-que contiene las variables. En este ejemplo, el cuerpo es una lista que
-usa la funci&oacute;n <code>message</code> para imprimir una cadena en el &aacute;rea
-echo.
-</p>
-<p>Puedes evaluar el ejemplo de la forma habitual, coloca el cursor
-despu&eacute;s del &uacute;ltimo par&eacute;ntesis y presiona <kbd>C-x
-C-e</kbd>. Al hacer esto, aparecer&aacute; lo siguiente en el &aacute;rea echo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">&quot;Un tipo de animal tiene rayas y otro es fiero.&quot;
-</pre></div>
-
-<p>Como hemos visto antes, la funci&oacute;n <code>message</code> imprime su primer
-argumento, excepto por &lsquo;<samp>%s</samp>&rsquo;. En este ejemplo, el valor de la
-variable <code>cebra</code> se imprime en la posici&oacute;n del primer &lsquo;<samp>%s</samp>&rsquo;
-y el valor de la variable <code>tigre</code> se imprime en la posici&oacute;n del
-segundo &lsquo;<samp>%s</samp>&rsquo;.
-</p>
-<hr>
-<a name="Variables-let-inicializadas"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-de-expresi_00f3n-let" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#let" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#if" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Variables-sin-inicializar-en-un-sentencia-let"></a>
-<h3 class="subsection">3.6.3 Variables sin inicializar en un sentencia <code>let</code></h3>
-<a name="index-Variables-let-no-inicializadas"></a>
-<a name="index-Variables-let-no-inicializadas-1"></a>
-
-<p>Si no se une a las variables en una sentencia <code>let</code> con valores
-iniciales espec&iacute;ficos, autom&aacute;ticamente seran unidos
-a un valor inicial de <code>nil</code>, como en la siguiente expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let ((abedul 3)
- pino
- abeto
- (roble 'algunos))
- (message
- &quot;Aqu&iacute; est&aacute;n %d variables con %s, %s, y el valor %s.&quot;
- abedul pino abeto roble))
-</pre></div>
-
-<p>Aqu&iacute;, la varlist es <code>((abedul 3) pino abeto (roble
-'algunos))</code>.
-</p>
-<p>Si eval&uacute;as esta expresi&oacute;n de la forma habitual, aparecer&aacute; lo
-siguiente en el &aacute;rea echo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">&quot;Aqu&iacute; est&aacute;n 3 variables con nil, nil, y el valor algunos.&quot;
-</pre></div>
-
-<p>En este ejemplo, Emacs une el s&iacute;mbolo <code>abedul</code>
-al n&uacute;mero 3, une los s&iacute;mbolos
-<code>pino</code> y <code>abeto</code> a <code>nil</code>, y une el
-s&iacute;mbolo <code>roble</code> al valor <code>algunos</code>.
-</p>
-<p>Observe que en la primera parte de <code>let</code>, las variables <code>pino</code>
-y <code>abeto</code> son unicamente &aacute;tomos que no est&aacute;n rodeados por
-par&eacute;ntesis; esto se debe a que est&aacute;n siendo unidos a <code>nil</code>,
-la lista vac&iacute;a. Pero <code>roble</code> se une a
-<code>algunos</code> por ello es parte de la lista <code>(roble
-'algunos)</code>. De manera similar, <code>abedul</code> se une al n&uacute;mero 3 en
-una lista con este n&uacute;mero. (Ya que un
-n&uacute;mero se eval&uacute;a a s&iacute; mismo, el n&uacute;mero no
-necesita ser citado. Ademas, el n&uacute;mero se imprime en el mensaje
-usando un &lsquo;<samp>%d</samp>&rsquo; en lugar de un &lsquo;<samp>%s</samp>&rsquo;.) Las cuatro variables como un
-grupo son puestas dentro de una lista para delimitarla de el
-cuerpo de <code>let</code>.
-</p>
-<hr>
-<a name="if"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Variables-let-inicializadas" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#if-en-m_00e1s-detalle" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-forma-especial-if"></a>
-<h2 class="section">3.7 La forma especial <code>if</code></h2>
-<a name="index-if"></a>
-<a name="index-Condicional-con-if"></a>
-
-<p>Adem&aacute;s de <code>let</code> y <code>defun</code>, esta la forma especial
-condicional <code>if</code>. Esta forma se utiliza para indicar al
-computador que tome decisiones. Puedes escribir definiciones de
-funci&oacute;n sin necesidad de utilizar <code>if</code>, pero se usa con bastante
-frecuencia, y es lo suficientemente importante como para incluirse
-aqu&iacute;. Se utiliza, por ejemplo, en el c&oacute;digo para la
-funci&oacute;n <code>beginning-of-buffer</code>.
-</p>
-<p>La idea b&aacute;sica detras de <code>if</code>, es que &ldquo;<em>if</em> (si) una prueba es
-verdad
-<em>then</em> (entonces) se evalua la expresi&oacute;n.&rdquo; Si la prueba no es
-verdad, la
-expresi&oacute;n no se evalua. Por ejemplo, podr&iacute;a
-tomar una decisi&oacute;n como, &ldquo;&iexcl;si es c&aacute;lido y
-soleado, entonces ir a la playa!&rdquo;
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#if-en-m_00e1s-detalle"><code>if</code> en m&aacute;s detalle</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> if en m&aacute;s detalle
-</td></tr>
-<tr><td align="left" valign="top"><a href="#tipo_002dde_002danimal-en-detalle">3.7.1 La funci&oacute;n <code>tipo-de-animal</code> en detalle</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un ejemplo de una expresi&oacute;n <code>if</code>.
-</td></tr>
-</table>
-
-<hr>
-<a name="if-en-m_00e1s-detalle"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#if" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#if" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#tipo_002dde_002danimal-en-detalle" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="if-en-mas-detalle"></a>
-<h3 class="unnumberedsubsec"><code>if</code> en m&aacute;s detalle</h3>
-
-<a name="index-parte_002dsi-definida"></a>
-<a name="index-parte_002dentonces-definida"></a>
-<p>Al escribir una expresi&oacute;n <code>if</code> en Lisp no se utiliza la
-palabra &lsquo;then&rsquo;; la prueba y la acci&oacute;n son el segundo y tercer
-elementos de la lista cuyo primer elemento es <code>if</code>.
-No obstante, la parte de la prueba en una expresi&oacute;n
-<code>if</code> a menudo se llamada <em>if-part</em>
-(<em>parte-si</em>) y el segundo argumento a menudo se llamada
-<em>then-part</em> (<em>parte-entonces</em>).
-</p>
-<p>Adembas, cuando se escribe una expresi&oacute;n <code>if</code>, la
-prueba-verdadero-o-falso normalmente se escribe en la misma
-l&iacute;nea que el s&iacute;mbolo <code>if</code>, pero la
-acci&oacute;n a llevar a cabo si la prueba es verdadera, &ldquo;then-part&rdquo;
-(<em>parte-entonces</em>), se escribe en la segunda y siguientes
-l&iacute;neas. Esto hace que la expresi&oacute;n <code>if</code>
-sea mas f&aacute;cil de leer.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if <var>prueba-verdadero-o-falso</var>
- <var>accion-a-realizar-si-el-test-es-cierto</var>)
-</pre></div>
-
-<p>La prueba-verdadero-o-falso es una expresi&oacute;n que evalua el
-int&eacute;rprete Lisp.
-</p>
-<p>Aqu&iacute; hay un ejemplo que puedes evaluar.
-La prueba consiste en si el n&uacute;mero 5 es mayor que el n&uacute;mero 4. Ya que es
-as&iacute;,
-se imprime el mensaje &lsquo;<samp>&iexcl;5 es mayor que 4!</samp>&rsquo;.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (&gt; 5 4) ; <span class="roman">parte-si</span>
- (message &quot;&iexcl;5 es mayor que 4!&quot;)) ; <span class="roman">parte-entonces</span>
-</pre></div>
-
-<p>(La funci&oacute;n <code>&gt;</code> comprueba si su primer argumento es mayor que su
-segundo argumento y devuelve verdadero si lo es.)
-<a name="index-_003e-_0028mayor-que_0029"></a>
-</p>
-<p>Por supuesto, en un caso real, la prueba en una expresi&oacute;n <code>if</code> no
-ser&aacute; siempre la misma, como en la expresi&oacute;n
-<code>(&gt; 5 4)</code>. En su lugar, al menos una de las variables utilizadas en la
-prueba estara unida a un valor de antemano desconocido.
-(Si el valor se conoce de antemano, &iexcl;no
-necesitamos realizar la prueba!)
-</p>
-<p>Por ejemplo, el valor puede estar unido a un argumento de una
-definici&oacute;n de funci&oacute;n. En la siguiente definici&oacute;n de funci&oacute;n,
-el tipo de animal es un valor que se pasa a la funci&oacute;n. Si
-el valor unido a <code>caracteristica</code> es
-<code>fiero</code>, entonces se imprime el mensaje, &lsquo;<samp>&iexcl;Es un
-tigre!</samp>&rsquo;;
-de otro modo, se devolvera <code>nil</code>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun tipo-de-animal (caracteristica)
- &quot;Imprime el mensaje en el &aacute;rea echo dependiendo de CARACTERISTICA.
-Si la CARACTERISTICA es el s&iacute;mbolo `fiero',
-entonces advierte que es un tigre.&quot;
- (if (equal caracteristica 'fiera)
- (message &quot;&iexcl;Es un tigre!&quot;)))
-</pre></div>
-
-<p>Si est&aacute;s leyendo esto dentro de GNU Emacs, puedes evaluar la
-definici&oacute;n de funci&oacute;n de la forma habitual para instalarlo en Emacs, y
-luego puedes evaluar las dos expresiones siguientes para ver los resultados:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(tipo-de-animal 'fiero)
-(tipo-de-animal 'cebra)
-
-</pre></div>
-
-<p>Al evaluar <code>(tipo-de-animal 'fiero)</code>, veras el siguiente
-mensaje impreso en el &aacute;rea echo: <code>&quot;&iexcl;Es un tigre!&quot;</code>;
-y cuando se eval&uacute;a <code>(tipo-de-animal 'cebra)</code> ver&aacute;s <code>nil</code>
-impreso en el &aacute;rea echo.
-</p>
-<hr>
-<a name="tipo_002dde_002danimal-en-detalle"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#if-en-m_00e1s-detalle" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#if" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#else" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-tipo_002dde_002danimal-en-detalle"></a>
-<h3 class="subsection">3.7.1 La funci&oacute;n <code>tipo-de-animal</code> en detalle</h3>
-
-<p>Veamos la funci&oacute;n <code>tipo-de-animal</code> en detalle.
-</p>
-<p>La definici&oacute;n de funci&oacute;n <code>tipo-de-animal</code> se escribio
-llenando los espacios de dos plantillas, la primera para la definici&oacute;n
-de funci&oacute;n como un todo, y la seguanda para una expresi&oacute;n <code>if</code>.
-</p>
-<p>La plantilla para cada funci&oacute;n no interactiva es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun <var>nombre-de-funcion</var> (<var>lista-de-argumentos</var>)
- &quot;<var>documentacion</var>&hellip;&quot;
- <var>cuerpo</var>&hellip;)
-</pre></div>
-
-<p>Las partes de la funci&oacute;n que encajan con esta plantilla se ven asi:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun tipo-de-animal (caracteristica)
- &quot;Imprime el mensaje en el &aacute;rea echo dependiendo de CARACTERISTICA.
-Si la CARACTERISTICA es el s&iacute;mbolo `fiero',
-entonces advierte que es un tigre.&quot;
- <var>cuerpo: la expresi&oacute;n</var> <code>if</code>)
-</pre></div>
-
-<p>El nombre de funci&oacute;n es <code>tipo-de-animal</code>; se pasa al valor de
-un argumento. A la lista de argumentos se sigue una cadena de
-documentaci&oacute;n multi-l&iacute;nea. La cadena de
-documentaci&oacute;n se incluye en el ejemplo porque es un buen h&aacute;bito
-escribir la cadena de documentaci&oacute;n para cada definici&oacute;n de
-funci&oacute;n. El
-cuerpo de la definici&oacute;n de funci&oacute;n consiste en la expresi&oacute;n
-<code>if</code>.
-</p>
-<p>La plantilla para una expresi&oacute;n <code>if</code> se ve as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if <var>prueba-verdadero-o-falso</var>
- <var>accion-a-realizar-si-la-prueba-devuelve-verdadero</var>)
-</pre></div>
-
-<p>En la funci&oacute;n <code>tipo-de-animal</code>, el c&oacute;digo para <code>if</code>
-se ve as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (equal caracteristica 'fiero)
- (message &quot;&iexcl;Es un tigre!&quot;)))
-</pre></div>
-
-<p>Aqu&iacute;, est&aacute; la expresi&oacute;n prueba-verdadero-o-falso
-</p>
-<div class="smallexample">
-<pre class="smallexample">(equal caracteristica 'fiero)
-</pre></div>
-
-<p>En Lisp, <code>equal</code> es una funci&oacute;n que determina si su primer
-argumento es igual a su segundo argumento. El segundo argumento es
-el s&iacute;mbolo citado <code>'fiero</code> y el primer argumento es
-el valor del s&iacute;mbolo <code>caracteristico</code>
-&mdash; en otras palabras, el argumento pasado a esta funci&oacute;n.
-</p>
-<p>En la primer prueba de <code>tipo-de-animal</code>, el argumento
-<code>fiero</code> se pasa a <code>tipo-de-animal</code>. Ya que <code>fiero</code>
-es igual a <code>fiero</code>, la expresi&oacute;n, <code>(equal caracteristica
-'fiero)</code>, devuelve el valor verdadero. Cuando esto sucede,
-<code>if</code> eval&uacute;a el segundo argumento o la parte-entonces
-del <code>if</code>: <code>(message &quot;&iexcl;Es un tigre!&quot;)</code>.
-</p>
-<p>Por otro lado, en la segunda prueba de <code>tipo-de-animal</code>, se
-pasa el argumento <code>cebra</code> a <code>tipo-de-animal</code>. <code>cebra</code>
-no es igual a <code>fiero</code>, por lo que la parte-entonces no
-se evalua y se devuelve <code>nil</code> por la expresi&oacute;n
-<code>if</code> (<em>si</em>).
-</p>
-<hr>
-<a name="else"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#tipo_002dde_002danimal-en-detalle" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Verdad-y-falsedad" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Expresiones-if_002d_002dthen_002d_002delse"></a>
-<h2 class="section">3.8 Expresiones if&ndash;then&ndash;else</h2>
-<a name="index-Else"></a>
-
-<p>Una expresi&oacute;n <code>if</code> puede tener un tercer argumento
-opcional, llamado la <em>parte-de_otro_modo</em>, en caso de que
-la prueba-verdadero-o-falso devuelva falso. Cuando esto sucede, el segundo
-argumento o then-part de la expresi&oacute;n <code>if</code>
-global, <em>no</em> se eval&uacute;a, pero el tercer argumento o la
-parte-de_otro_modo
-<em>se</em> eval&uacute;a. Podr&iacute;a pensar en esto como la
-alternativa del d&iacute;a nublado para la decisi&oacute;n &ldquo;si es
-c&aacute;lido y soleado, entonces ir a la playa, de otro modo &iexcl;leer
-un
-libro!&rdquo;
-</p>
-<p>La palabra &ldquo;else&rdquo; (&ldquo;de otro modo&rdquo;) no se escribe en el c&oacute;digo
-Lisp; la parte-de_otro_modo de una expresi&oacute;n <code>if</code>
-viene despu&eacute;s de la parte-entonces. En Lisp,
-la parte-de_otro_modo suele escribirse al inicio
-de una nueva l&iacute;nea y se indenta menos
-que la parte-entonces:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if <var>prueba-verdadero-o-falso</var>
- <var>accion-a-realizar-si-la-prueva-devuelve-verdadero</var>
- <var>accion-a-realizar-si-la-prueba-devuelve-falso</var>)
-</pre></div>
-
-<p>Por ejemplo, la siguiente expresi&oacute;n <code>if</code> imprime el mensaje
-&lsquo;<samp>&iexcl;4 no es mayor que 5!</samp>&rsquo; al evaluarse en la forma
-habitual:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (&gt; 4 5) ; <span class="roman">parte-si</span>
- (message &quot;&iexcl;4 falsamente es mayor que 5!&quot;) ; <span class="roman">parte-entonces</span>
- (message &quot;&iexcl;4 no es mayor que 5!&quot;)) ; <span class="roman">parte-resto</span>
-</pre></div>
-
-<p>N&oacute;tese que los diferentes niveles de indentaci&oacute;n hacen f&aacute;cil
-distinguir la parte then desde la parte resto. (GNU Emacs tiene varios
-comandos que autom&aacute;ticamente indenta expresiones correctamente
-<code>if</code> <em>si</em>. V&eacute;ase la secci&oacute;n <a href="#Escribiendo-listas">GNU Emacs te ayuda a escribir listas</a>.)
-</p>
-<p>Podemos extender la funci&oacute;n <code>tipo-de-animal</code> para incluir una
-parte else para simplemente incorporar una parte adicional para la
-expresi&oacute;n <code>if</code> <em>si</em>.
-</p>
-<p>Se puede ver las consecuencias de hacer esto si se eval&uacute;a la
-siguiente versi&oacute;n de la definici&oacute;n de funci&oacute;n
-<code>type-of-animal</code> (<em>tipo-de-animal</em>) para instalarlo y
-entonces evaluar las dos expresiones subsiguientes para pasar
-diferentes argumentos para la funci&oacute;n.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun tipo-de-animal (caracteristica) ; <span class="roman">Segunda versi&oacute;n.</span>
- &quot;Imprime el mensaje en el &aacute;rea echo dependiendo de CARACTERISTICA.
-Si la CARACTERISTICA es el s&iacute;mbolo `fiera',
-entonces avisa de un tigre; sino di que no es una fiera.&quot;
- (if (equal caracteristica 'fiera)
- (message &quot;&iexcl;Es un tigre!&quot;)
- (message &quot;&iexcl;No es una fiera!&quot;)))
-</pre></div>
-<br>
-
-<div class="smallexample">
-<pre class="smallexample">(tipo-de-animal 'fiero)
-(tipo-de-animal 'cebra)
-
-</pre></div>
-
-<p>Cuando se eval&uacute;a <code>(tipo-de-animal 'fiera)</code>, se ver&aacute; el
-siguiente mensaje impreso en el &aacute;rea echo: <code>&quot;&iexcl;Eso
-es un tigre!&quot;</code>; pero cuando se eval&uacute;a <code>(tipo-de-animal
-'cebra)</code>, se ver&aacute; <code>&quot;&iexcl;No es una fiera!&quot;</code>.
-</p>
-<p>(De acuerdo, si la <var>caracter&iacute;stica</var> fuera
-<code>feroz</code>, el mensaje <code>&quot;&iexcl;No es una fiera!&quot;</code>
-ser&iacute;a impreso; &iexcl;y ser&iacute;a
-err&oacute;neo! Cuando se escribe c&oacute;digo, se necesita tener en cuenta la
-posibilidad que algunos argumentos ser&aacute; probado por <code>if</code>
-<em>si</em> y escribir tu programa de acuerdo.
-</p>
-<hr>
-<a name="Verdad-y-falsedad"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#else" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#nil-explicado" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Verdad-y-falsedad-en-Emacs-Lisp"></a>
-<h2 class="section">3.9 Verdad y falsedad en Emacs Lisp</h2>
-<a name="index-Verdad-y-mentira-en-Emacs-Lisp"></a>
-<a name="index-Falsedad-y-verdad-en-Emacs-Lisp"></a>
-<a name="index-nil"></a>
-
-<p>Hay un aspecto importante para el test de verdad en una expresi&oacute;n
-<code>if</code> (<em>si</em>). As&iacute;, hemos hablado de &lsquo;verdad&rsquo; y
-&lsquo;mentira&rsquo; como valores de predicados como si fueran nuevos tipos de
-objetos Emacs Lisp. En efecto, &lsquo;falso&rsquo; es solo nuestro viejo amigo
-<code>nil</code>. Cualquier otra es &lsquo;verdadero&rsquo;.
-</p>
-<p>La expresi&oacute;n chequea si verdad se interpreta como (<em>true</em>)
-<em>verdadero</em> si el resultado de evaluarlo es un valor que no es
-<code>nil</code>. En otras palabras, el resultado del test se considera
-cierto si el valor devuelto es un n&uacute;mero como 47, una cadena tal
-como <code>&quot;hola&quot;</code>, o un s&iacute;mbolo (otro como <code>nil</code>)
-tal como <code>flores</code>, o una lista (tan larga como eso no est&aacute;
-vac&iacute;a) &iexcl;o incluso un b&uacute;ffer!
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#nil-explicado">Una explicaci&oacute;n de <code>nil</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> <code>nil</code> tiene dos significados.
-</td></tr>
-</table>
-
-<hr>
-<a name="nil-explicado"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Verdad-y-falsedad" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Verdad-y-falsedad" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#save_002dexcursion" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Una-explicacion-de-nil"></a>
-<h3 class="unnumberedsubsec">Una explicaci&oacute;n de <code>nil</code></h3>
-
-<p>Antes de ilustrar un test para verdad, se necesita una explicaci&oacute;n
-de <code>nil</code>.
-</p>
-<p>En Emacs Lisp, el s&iacute;mbolo <code>nil</code> tiene dos
-significados. Primero, est&aacute; el significado de la lista
-vac&iacute;a. Segundo, est&aacute; el valor de falso y es el valor
-devuelto cuando el test test-verdadero-o-falso salga
-falso. <code>nil</code>. Tan lejos como el int&eacute;rprete Lisp es concebido,
-<code>()</code> y <code>nil</code> son el mismo. Los humanos, sin embargo, tienden
-a usar <code>nil</code> para falso y <code>()</code> para la lista
-vac&iacute;a.
-</p>
-<p>En Emacs Lisp, cualquier valor que no es <code>nil</code> &mdash; no es una
-lista vac&iacute;a &mdash; es considerado verdad. Esto significa
-que si una evaluaci&oacute;n devuelve alguna cosa que no es una lista
-vac&iacute;a, una expresi&oacute;n <code>if</code> devuelve verdad. Por
-ejemplo, si un n&uacute;mero es puesto en el slot para el test, ser&aacute;
-evaluado y devolver&aacute; por s&iacute; mismo, desde lo que hacen
-los n&uacute;meros cuando se eval&uacute;an. En este condicional, la expresi&oacute;n
-<code>if</code> devuelve verdad. La expresi&oacute;n se chequea como falso solo
-cuando <code>nil</code>, una lista vac&iacute;a, es devuelta
-evaluando la expresi&oacute;n.
-</p>
-<p>Se puede ver esto evaluando las dos expresiones en los siguientes ejemplos.
-</p>
-<p>En el primer ejemplo, n&uacute;mero 4 es evaluado como el test en la
-expresi&oacute;n <code>if</code> y se devuelve por s&iacute; mismo; por
-consiguiente, la then-part de la expresi&oacute;n es evaluada y devuelta:
-&lsquo;<samp>true</samp>&rsquo; aparece en el &aacute;rea echo. En el segundo ejemplo,
-<code>nil</code> indica falso; por consiguiente, el else-part de la
-expresi&oacute;n es evaluada y devuelta: &lsquo;<samp>false</samp>&rsquo; aparece en el &aacute;rea echo.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if 4
- 'true
- 'false)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(if nil
- 'true
- 'false)
-</pre></div>
-
-<p>Incidentalmente, si alg&uacute;n otro valor &uacute;til no est&aacute; disponible
-para un test que devuelve cierto, entonces el int&eacute;rprete Lisp
-retornar&aacute; el s&iacute;mbolo <code>t</code> para cierto. Por
-ejemplo, la expresi&oacute;n <code>(&gt; 5 4)</code> devuelve <code>t</code> cuando se
-eval&uacute;a, como puedes ver evalu&aacute;ndolo en el camino usual:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&gt; 5 4)
-</pre></div>
-
-<p>Por otro lado, esta funci&oacute;n devuelve <code>nil</code> si el test es falso.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&gt; 4 5)
-</pre></div>
-
-<hr>
-<a name="save_002dexcursion"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#nil-explicado" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Punto-y-marca" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="save_002dexcursion-1"></a>
-<h2 class="section">3.10 <code>save-excursion</code></h2>
-<a name="index-save_002dexcursion"></a>
-<a name="index-Region_002c-que-es"></a>
-<a name="index-Preservando-punto_002c-marca_002c-y-buffer"></a>
-<a name="index-Punto_002c-marca_002c-preservacion-de-buffer"></a>
-<a name="index-punto"></a>
-<a name="index-marca"></a>
-
-<p>La funci&oacute;n <code>save-excursion</code> es la cuarta y &uacute;ltima forma especial
-que se discutir&aacute; en este cap&iacute;tulo.
-</p>
-<p>En Emacs Lisp hay programas usados para edici&oacute;n, la funci&oacute;n
-<code>save-excursion</code> es muy com&uacute;n. Eso guarda la posici&oacute;n de
-punto y marca, ejecuta el cuerpo de la funci&oacute;n, y entonces restaura
-el punto y marca a sus posiciones previas si sus posiciones fueran
-cambiadas. Su prop&oacute;sito primario es guardar que el usuario sea
-sorprendido y molesto por movimientos inesperados de punto y marca.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Punto-y-marca">Punto y Marca</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una revisi&oacute;n de varias localizaciones.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Plantilla-para-save_002dexcursion">3.10.1 Plantilla para una expresi&oacute;n <code>save-excursion</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Plantilla para save-excursion
-</td></tr>
-</table>
-
-<hr>
-<a name="Punto-y-marca"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#save_002dexcursion" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#save_002dexcursion" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Plantilla-para-save_002dexcursion" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Punto-y-Marca"></a>
-<h3 class="unnumberedsubsec">Punto y Marca</h3>
-
-<p>Antes de discutir <code>save-excursion</code>, sin embargo, puede ser &uacute;til
-primero revisar que punto y marca est&aacute;n en GNU Emacs. <em>Punto</em> es
-la posici&oacute;n actual del cursor. En cualquier lugar que el cursor se
-posicione hay un punto. De manera m&aacute;s precisa, en terminales donde
-el cursor parece estar en lo alto de un car&aacute;cter, el punto est&aacute;
-inmediatamente antes del car&aacute;cter. En Emacs Lisp, punto es un
-entero. El primer car&aacute;cter en un b&uacute;ffer es el n&uacute;mero uno, el segundo
-es el n&uacute;mero dos, y as&iacute;. La funci&oacute;n <code>punto</code>
-devuelve la posici&oacute;n actual del cursor como un n&uacute;mero. Cada
-b&uacute;ffer tiene su propio valor para el punto.
-</p>
-<p>La <em>marca</em> es otra posici&oacute;n en el b&uacute;ffer; su valor puede ser
-asignado con un comando tal como <kbd>C-&lt;SPC&gt;</kbd>
-(<code>set-mark-command</code>). Si una marca ha sido asignada, se puede
-usar el comando <kbd>C-x C-x</kbd> (<code>exchange-point-and-mark</code>) para
-hacer que el cursor salte a la marca y asignar la marca para la
-posici&oacute;n previa del punto. Adem&aacute;s, si tu asignas otra marca, la
-posici&oacute;n puede ser guardada por este camino. Se puede saltar al
-cursor para una marca guardada escribiendo <kbd>C-u C-&lt;SPC&gt;</kbd> una o
-m&aacute;s veces.
-</p>
-<p>La parte del b&uacute;ffer entre el punto y la marca es llamada <em>la
-regi&oacute;n</em>. Numerosos comandos trabajan en la regi&oacute;n, incluyendo
-<code>center-region</code>, <code>count-lines-region</code>, <code>kill-region</code> y
-<code>print-region</code>.
-</p>
-<p>La forma especial <code>save-excursion</code> salva las posiciones del punto
-y la marca y restaura estas posiciones despu&eacute;s del c&oacute;digo con el
-cuerpo de la forma especial es evaluada por el int&eacute;rprete Lisp. De
-este modo, si el punto fuera en el principio de una pieza de texto y
-alg&uacute;n c&oacute;digo movido apunta al fin del b&uacute;ffer, el
-<code>save-excursion</code> no apuntar&iacute;a a donde fu&eacute; antes,
-despu&eacute;s las expresiones en el cuerpo de las que fueron evaluadas.
-</p>
-<p>En Emacs, una funci&oacute;n frecuentemente mueve el punto como parte de
-sus trabajos internos incluso aunque un usuario no espere esto. Por
-ejemplo, <code>count-lines-region</code> se mueve al punto. Para prevenir al
-usuario que se preocupe por el salto que es inesperado y (desde el punto
-de vista del usuario) innecesario, <code>save-excursion</code> es con
-frecuencia usado para punto y marca en la posici&oacute;n esperada por el
-usuario. El uso de <code>save-excursion</code> es un buen guarda casas.
-</p>
-<p>Para estar seguro que la casa est&aacute; limpia, <code>save-excursion</code>
-restaura los valores de punto y marca incluso si alguna cosa va mal en
-el c&oacute;digo dentro de eso (o, para ser m&aacute;s preciso y usar la jerga
-apropiada, &ldquo;en caso de salida anormal&rdquo;). Esta funcionalidad es muy
-&uacute;til.
-</p>
-<p>Adem&aacute;s grabando los valores de punto y marca, <code>save-excursion</code>
-guarda la traza del actual buffer, y lo restaura, tambi&eacute;n. Esto
-significa que puedes escribir c&oacute;digo que cambiar&aacute; el buffer y
-tener que <code>save-excursion</code> vuelva al buffer original. Esto es como
-<code>save-excursion</code> es usado en
-<code>append-to-buffer</code>. (V&eacute;ase la secci&oacute;n <a href="#append_002dto_002dbuffer">La Definici&oacute;n de <code>append-to-buffer</code></a>.)
-</p>
-<hr>
-<a name="Plantilla-para-save_002dexcursion"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Punto-y-marca" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#save_002dexcursion" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Revisar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Plantilla-para-una-expresion-save_002dexcursion"></a>
-<h3 class="subsection">3.10.1 Plantilla para una expresi&oacute;n <code>save-excursion</code></h3>
-
-<p>La plantilla para c&oacute;digo usando <code>save-excursion</code> es simple:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(save-excursion
- <var>body</var>&hellip;)
-</pre></div>
-
-<p>El cuerpo de la funci&oacute;n es una o m&aacute;s expresiones que ser&aacute;n
-evaluadas en secuencia por el int&eacute;rprete Lisp. Si hay m&aacute;s de una
-expresi&oacute;n en el cuerpo, el valor de la &uacute;ltima ser&aacute; devuelto como
-el valor de la funci&oacute;n <code>save-excursion</code>. Las otras expresiones
-en el cuerpo son evaluadas solo por sus efectos laterales; y
-<code>save-excursion</code> en s&iacute; es usado solo por su efecto
-lateral (que est&aacute; restaurando las posiciones de punto y marca).
-</p>
-<p>Para m&aacute;s detalles, la siguiente plantilla explica <code>save-excursion</code>
-</p>
-<div class="smallexample">
-<pre class="smallexample">(save-excursion
- <var>primera-expresion-en-el-cuerpo</var>
- <var>segunda-expresion-en-el-cuerpo</var>
- <var>tercera-expresion-en-el-cuerpo</var>
- &hellip;
- <var>ultima-expresion-en-el-cuerpo</var>)
-</pre></div>
-
-<p>Una expresi&oacute;n, de acuerdo, puede ser un s&iacute;mbolo por
-s&iacute; mismo o una lista.
-</p>
-<p>En c&oacute;digo Emacs Lisp, una expresi&oacute;n <code>save-excursion</code> con
-frecuencia ocurre el cuerpo de una expresi&oacute;n <code>let</code>. Eso se ve
-como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let <var>varlist</var>
- (save-excursion
- <var>body</var>&hellip;))
-</pre></div>
-
-<hr>
-<a name="Revisar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Plantilla-para-save_002dexcursion" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicios-defun" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Revisar-2"></a>
-<h2 class="section">3.11 Revisar</h2>
-
-<p>En los &uacute;ltimos pocos cap&iacute;tulos se han introducido un
-n&uacute;mero limpio de funciones y formas especiales. Aqu&iacute;
-se han descrito brevemente, con unas pocas funciones similares que no
-han sido mencionadas todav&iacute;a.
-</p>
-<dl compact="compact">
-<dt><code>eval-last-sexp</code></dt>
-<dd><p>Eval&uacute;a la &uacute;ltima expresi&oacute;n simb&oacute;lica antes de la posici&oacute;n
-actual del punto. El valor es impreso en el &aacute;rea echo a menos
-que la funci&oacute;n sea invocada con un argumento; en este caso, la salida
-es impresa en el actual b&uacute;ffer. Este comando est&aacute; normalmente
-asociado a <kbd>C-x C-e</kbd>.
-</p>
-</dd>
-<dt><code>defun</code></dt>
-<dd><p>Definir funci&oacute;n. Esta forma especial ha subido a cinco partes: el
-nombre una plantilla para los argumentos que ser&aacute;n pasados a la
-documentaci&oacute;n de la funci&oacute;n, una declaraci&oacute;n interactiva
-opcional, y el cuerpo de la definici&oacute;n.
-</p>
-<p>Por ejemplo, en las primeras versiones de Emacs, la definici&oacute;n de
-funci&oacute;n era como sigue. (Eso es ligeramente m&aacute;s complejo ahora que
-si busca el primer caracter de espacio no en blanco en vez del primer
-caracter visible.)
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun volver-a-indentacion ()
- &quot;Mover el punto al primer caracter visible en linea.&quot;
- (interactive)
- (beginning-of-line 1)
- (skip-chars-forward &quot; \t&quot;))
-</pre></div>
-
-
-</dd>
-<dt><code>interactive</code></dt>
-<dd><p>Declara al int&eacute;rprete que la funci&oacute;n puede ser usada
-interactivamente. Esta forma especial puede ser seguida por una cadena
-con una o m&aacute;s partes que pasan la informaci&oacute;n a los argumentos de
-la funci&oacute;n, en secuencia. Estas partes pueden tambi&eacute;n contar al
-int&eacute;rprete para mostrar la informaci&oacute;n. Parte de las cadenas son
-separadas por nuevas l&iacute;neas, &lsquo;<samp>\n</samp>&rsquo;.
-</p>
-<p>Caracteres de c&oacute;digo com&uacute;n son:
-</p>
-<dl compact="compact">
-<dt><code>b</code></dt>
-<dd><p>El nombre de un b&uacute;ffer existente.
-</p>
-</dd>
-<dt><code>f</code></dt>
-<dd><p>El nombre de un fichero existente
-</p>
-</dd>
-<dt><code>p</code></dt>
-<dd><p>El argumento prefijo num&eacute;rico. (N&oacute;tese que esta &lsquo;p&rsquo; es min&uacute;scula.)
-</p>
-</dd>
-<dt><code>r</code></dt>
-<dd><p>El Punto y la marca, como dos argumentos num&eacute;ricos, el m&aacute;s
-peque&ntilde;o primero. Esta es la &uacute;nica letra que especifica dos
-argumentos sucesivos en vez de uno.
-</p></dd>
-</dl>
-
-<p>See <a href="elisp.html#C_00f3digos-Interactivos">Caracteres de C&oacute;digo para &lsquo;<samp>interactive</samp>&rsquo;</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>,
-para una lista de caracteres de c&oacute;digo.
-</p>
-</dd>
-<dt><code>let</code></dt>
-<dd><p>Declara que una lista de variables es para usarla con el cuerpo del
-<code>let</code> y darles un valor inicial, bien <code>nil</code> o un valor
-espec&iacute;fico; entonces se evaluar&aacute;n el resto de las
-expresiones en el cuerpo del <code>let</code> y devolver el valor de la
-&uacute;ltima. Dentro del cuerpo del <code>let</code>, el int&eacute;rprete Lisp no ve
-los valores de las variables de los mismos nombres que son asociados
-fuera del <code>let</code>.
-</p>
-<p>Por ejemplo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let ((foo (nombre-de-buffer))
- (bar (tamagno-de-buffer)))
- (message
- &quot;Este buffer es %s y tiene %d caracteres.&quot;
- foo bar))
-</pre></div>
-
-</dd>
-<dt><code>save-excursion</code></dt>
-<dd><p>Graba los valores de punto y marca y el actual b&uacute;ffer antes de evaluar
-el cuerpo de esta forma especial. Restaura los valores de punto y
-marca y el b&uacute;ffer despu&eacute;s de esto.
-</p>
-<p>Por ejemplo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(message &quot;Hay %d caracteres dentro de este buffer.&quot;
- (- (point)
- (save-excursion
- (goto-char (point-min)) (point))))
-</pre></div>
-
-</dd>
-<dt><code>if</code></dt>
-<dd><p>Eval&uacute;a el primer argumento a la funci&oacute;n; si es verdad, eval&uacute;a el
-segundo argumento; lo dem&aacute;s eval&uacute;a el tercer argumento, si hay uno.
-</p>
-<p>La forma especial <code>if</code> es llamada <em>condicional</em>. Hay otros
-condicionales en Emacs Lisp, pero <code>if</code> es quiz&aacute;s lo m&aacute;s
-com&uacute;nmente usado.
-</p>
-<p>Por ejemplo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (= 22 version-de-emacs-mayor)
- (message &quot;Esta es la versi&oacute;n 22 de Emacs&quot;)
- (message &quot;Esta no es la versi&oacute;n 22 Emacs&quot;))
-</pre></div>
-
-</dd>
-<dt><code>&lt;</code></dt>
-<dt><code>&gt;</code></dt>
-<dt><code>&lt;=</code></dt>
-<dt><code>&gt;=</code></dt>
-<dd><p>La funci&oacute;n <code>&lt;</code> chequea si su primer argumento es m&aacute;s peque&ntilde;o
-que su segundo argumento. Una funci&oacute;n correspondiente, <code>&gt;</code>,
-chequea si el primer argumento es mayor que el segundo. De otro modo,
-<code>&lt;=</code> chequea si el primer argumento es menor o igual al segundo y
-<code>&gt;=</code> chequea si el primer argumento es mayor o igual al
-segundo. En todos los casos, ambos argumentos deben ser n&uacute;meros o
-marcas (las marcas indican posiciones en b&uacute;ffers).
-</p>
-</dd>
-<dt><code>=</code></dt>
-<dd><p>La funci&oacute;n <code>=</code> chequea si dos argumentos, ambos n&uacute;meros o
-marcadores, son iguales.
-</p>
-</dd>
-<dt><code>equal</code></dt>
-<dt><code>eq</code></dt>
-<dd><p>Chequea si dos objetos son el mismo. <code>equal</code> usa un signicado de
-la palabra &lsquo;mismo&rsquo; y <code>eq</code> usa otro: <code>equal</code> devuelve cierto
-si los dos objetos tienen una estructura y contenidos similares, tal
-como dos copias del mismo libro. En una mano, <code>eq</code>, devuelve
-cierto si ambos argumentos son actualmente el mismo objeto.
-<a name="index-equal"></a>
-<a name="index-eq"></a>
-</p>
-</dd>
-<dt><code>string&lt;</code></dt>
-<dt><code>string-lessp</code></dt>
-<dt><code>string=</code></dt>
-<dt><code>string-equal</code></dt>
-<dd><p>La funci&oacute;n <code>string-lessp</code> chequea si su primer argumento es
-m&aacute;s peque&ntilde;o que el segundo. En resumen, el nombre alternativo para
-la misma funci&oacute;n (un <code>defalias</code>) es <code>string</code>.
-</p>
-<p>Los argumentos para <code>string-lessp</code> deben ser cadenas o
-s&iacute;mbolos; la ordenaci&oacute;n es lexicogr&aacute;fica,
-as&iacute; el caso es significativo. Los nombres impresos de
-s&iacute;mbolos son usado en vez de s&iacute;mbolos por
-s&iacute; mismos.
-</p>
-<a name="index-cadena-vacia-definida"></a>
-<p>Una cadena vac&iacute;a, &lsquo;<samp>&quot;\&quot;</samp>&rsquo;, es una cadena sin caracteres
-dentro, es m&aacute;s peque&ntilde;a que cualquier cadena de caracteres.
-</p>
-<p><code>string-equal</code> provee el test correpondiente para igualdad. Su
-corto nombre alternativo es <code>string=</code>. No hay funciones test que
-correponden a <var>&gt;</var>, <code>&gt;=</code>.
-</p>
-</dd>
-<dt><code>message</code></dt>
-<dd><p>Imprime un mensaje en el &aacute;rea echo. El primer argumento es una
-cadena que puede contener, &lsquo;<samp>%s</samp>&rsquo;, &lsquo;<samp>%d</samp>&rsquo;, o &lsquo;<samp>%c</samp>&rsquo; para
-imprimir el valor de argumentos que siguen la cadena. El argumento
-usado por &lsquo;<samp>%d</samp>&rsquo; debe ser un n&uacute;mero. El argumento usado por
-&lsquo;<samp>%c</samp>&rsquo; debe ser un n&uacute;mero de c&oacute;digo <small>ASCII</small>; eso ser&aacute;
-impreso como el caracter con este c&oacute;digo <small>ASCII</small>. (Otras varias
-%-secuencias no han sido mencionadas.)
-</p>
-</dd>
-<dt><code>setq</code></dt>
-<dt><code>set</code></dt>
-<dd><p>La funci&oacute;n <code>setq</code> asigna el valor de su primer argumento al
-valor del segundo argumento. El primer argumento est&aacute;
-autom&aacute;ticamente citado por <code>setq</code>. Eso hace lo mismo para los
-pares de argumentos. Otra funci&oacute;n, <code>set</code>, toma solo dos
-argumentos y eval&uacute;a ambos de ellos antes de configurar el valor
-devuelto por su primer argumento al valor devuelto por su segundo argumento.
-</p>
-</dd>
-<dt><code>buffer-name</code></dt>
-<dd><p>Sin un argumento, devuelve el nombre del b&uacute;ffer, como una cadena.
-</p>
-</dd>
-<dt><code>buffer-file-name</code></dt>
-<dd><p>Sin un argumento, devuelve el nombre del fichero si el b&uacute;ffer lo est&aacute;
-visitando.
-</p>
-</dd>
-<dt><code>current-buffer</code></dt>
-<dd><p>Devuelve el b&uacute;ffer en el que Emacs es activo; eso puede no ser el
-b&uacute;ffer que es visible en la pantalla.
-</p>
-</dd>
-<dt><code>other-buffer</code></dt>
-<dd><p>Devuelve el b&uacute;ffer seleccionado m&aacute;s recientemente (otro que el
-b&uacute;ffer pasado a <code>other-buffer</code> como un argumento y otro en vez
-de el b&uacute;ffer actual).
-</p>
-</dd>
-<dt><code>switch-to-buffer</code></dt>
-<dd><p>Selecciona un b&uacute;ffer para que Emacs est&eacute; activo y lo muestre
-en la ventana actual y as&iacute; los usuarios puedan
-mirarlo. Normalmente se empareja a <kbd>C-x b</kbd>.
-</p>
-</dd>
-<dt><code>set-buffer</code></dt>
-<dd><p>Cambia la atenci&oacute;n de Emacs a un b&uacute;ffer en el que los programas se
-ejecutar&aacute;n. No altera lo que la ventana est&aacute; mostrando.
-</p>
-</dd>
-<dt><code>buffer-size</code></dt>
-<dd><p>Devuelve el n&uacute;mero de caracteres en el b&uacute;ffer actual.
-</p>
-</dd>
-<dt><code>punto</code></dt>
-<dd><p>Devuelve el valor de la actual posici&oacute;n del cursor, como un entero
-contando el n&uacute;mero de caracteres desde el principio del b&uacute;ffer.
-</p>
-</dd>
-<dt><code>point-min</code></dt>
-<dd><p>Devuelve el valor m&iacute;nimo permisible del punto en el
-b&uacute;ffer actual. Esto es 1, a menos que la contracci&oacute;n est&eacute; en efecto
-</p>
-</dd>
-<dt><code>point-max</code></dt>
-<dd><p>Devuelve el valor del m&aacute;ximo valor permisible del punto en el
-b&uacute;ffer actual. Esto es el fin del b&uacute;ffer, a menos que la
-contracci&oacute;n est&eacute; en efecto
-</p></dd>
-</dl>
-
-<hr>
-<a name="Ejercicios-defun"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Revisar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicios"></a>
-<h2 class="section">3.12 Ejercicios</h2>
-
-<ul>
-<li>
-Escribe una funci&oacute;n no interactiva que doble el valor de su
-argumento, un n&uacute;mero. Luego haz la funci&oacute;n interactiva.
-
-</li><li>
-Escribe una funci&oacute;n que chequee si el valor actual de
-<code>fill-column</code> es m&aacute;s grande que el argumento pasado a la
-funci&oacute;n, y si es as&iacute;, imprime un mensaje apropiado.
-</li></ul>
-
-<hr>
-<a name="Un-paseo-a-trav_00e9s-de-los-b_00faffers"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Escribiendo-funciones" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicios-defun" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Encontrando-m_00e1s" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Unas-pocas-funciones-de-buffer-relacionadas"></a>
-<h1 class="chapter">4 Unas pocas funciones de buffer relacionadas</h1>
-
-<p>En este cap&iacute;tulo estudiamos en detalle varias de las
-funciones usadas en GNU Emacs. Esto se llama un &ldquo;paseo a
-trav&eacute;s&rdquo;. Estas funciones son usadas como ejemplos de c&oacute;digo Lisp,
-pero no son ejemplos imaginarios; con la excepci&oacute;n del primero, la
-definici&oacute;n de funci&oacute;n simplificada, esta funciones muestran el
-actual c&oacute;digo usado en GNU Emacs. Se puede aprender mucho desde
-estas definiciones. Las funciones descritas aqu&iacute; est&aacute;n
-todas relacionadas a b&uacute;ffers. Despu&eacute;s, estudiaremos otras
-funciones.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Encontrando-m_00e1s">4.1 Encontrando m&aacute;s informaci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo encontrar m&aacute;s informaci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#simplified_002dbeginning_002dof_002dbuffer">4.2 Una definici&oacute;n simplificada de <code>beginning-of-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Muestra <code>goto-char</code>,
- <code>point-min</code>, y <code>push-mark</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#mark_002dwhole_002dbuffer">4.3 La definici&oacute;n de <code>mark-whole-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Casi lo mismo que <code>beginning-of-buffer</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#append_002dto_002dbuffer">4.4 La definici&oacute;n de <code>append-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usa <code>save-excursion</code> y
- <code>insert-buffer-substring</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Revisa-lo-relacionado-con-el-b_00faffer">4.5 Revisar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Revisa
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicios-de-b_00faffer">4.6 Ejercicios</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicios de b&uacute;ffer
-</td></tr>
-</table>
-
-<hr>
-<a name="Encontrando-m_00e1s"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#simplified_002dbeginning_002dof_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Encontrando-mas-informacion"></a>
-<h2 class="section">4.1 Encontrando m&aacute;s informaci&oacute;n</h2>
-
-<a name="index-describe_002dfunction_002c-introducido"></a>
-<a name="index-Encontrar-documentacion-de-la-funcion"></a>
-<p>En este paseo, se describe cada nueva funci&oacute;n como viene, algunas
-veces en detalle y algunas veces brevemente. Si est&aacute; interesado, se
-puede obtener la documentaci&oacute;n completa de cualquier funci&oacute;n Emacs
-Lisp en cualquier momento escribiendo <kbd>C-h f</kbd> y entonces el
-nombre de la funci&oacute;n (y entonces &lt;RET&gt;. De manera similar, se
-puede obtener la documentaci&oacute;n completa para una variable
-escribiendo <kbd>C-h v</kbd>, despu&eacute;s el nombre de la variable (y
-entonces &lt;RET&gt;).
-</p>
-<a name="index-Encontrar-la-fuente-de-la-funcion"></a>
-<p>Tambi&eacute;n, en <code>describe-function</code>, se encontrar&aacute; la localizaci&oacute;n
-de la definici&oacute;n de la funci&oacute;n.
-</p>
-<p>Poner el punto dentro del nombre del fichero que contiene la funci&oacute;n
-y presiona la tecla &lt;RET&gt;. En este caso, &lt;RET&gt; significa
-<code>push-button</code> en vez de &lsquo;return&rsquo; o &lsquo;enter&rsquo;. Emacs tomar&aacute;
-directamente a la definici&oacute;n de la funci&oacute;n.
-</p>
-
-<p>De manera m&aacute;s general, si quieres ver una funci&oacute;n en su fichero
-fuente original, se puede usar la funci&oacute;n <code>find-tag</code> para
-saltar dentro. <code>find-tag</code> funciona con una amplia variedad de
-lenguajes, no solo Lisp, y C, y funciona con texto de no
-programaci&oacute;n tambi&eacute;n. Por ejemplo, <code>find-tag</code> saltar&aacute; a los
-varios nodos en el fichero fuente Texinfo de este documento. La
-funci&oacute;n <code>find-tag</code> depende de &lsquo;tablas de etiquetas&rsquo; que graba
-las localizaciones de las funciones, variables, y otros
-&iacute;tems para los que <code>find-tag</code> salta.
-</p>
-<p>Para usar el comando <code>find-tag</code>, escribe <kbd>M-.</kbd> (por ej.,
-presionando la tecla &lt;META&gt;, o al menos escribe la tecla &lt;ESC&gt;
-y entonces escribe la tecla punto), entonces, en la pantalla, se
-escribe el nombre de la funci&oacute;n cuyo c&oacute;digo fuente se quiere ver,
-tal como <code>mark-whole-buffer</code>, y luego escribe &lt;RET&gt;. Emacs
-cambiar&aacute; el b&uacute;ffer y mostrar&aacute; el c&oacute;digo fuente para la
-funci&oacute;n en la pantalla. Para volver al b&uacute;ffer actual, escribe
-<kbd>C-x b &lt;RET&gt;</kbd>. (En algunos teclados, la tecla &lt;META&gt; es
-etiquetada con &lt;ALT&gt;.)
-</p>
-<a name="index-tabla-TAGS_002c-especificando"></a>
-<a name="index-find_002dtag"></a>
-<p>Dependiendo de c&oacute;mo los valores iniciales por defecto de tu copia de
-Emacs son asignados se puede tambi&eacute;n necesitar especificar la
-posici&oacute;n de tu &lsquo;tabla de tags&rsquo;, que es un fichero llamado
-&lsquo;<tt>TAGS</tt>&rsquo;. Por ejemplo, si se est&aacute; interesado en fuentes de Emacs,
-la tabla de tags que se desea, si ya ha sido creada para
-t&iacute;, estar&aacute; en un subdirectorio del directorio
-&lsquo;<tt>/usr/local/share/emacs</tt>&rsquo;; de este modo se usar&iacute;a el
-comando <code>M-x visit-tags-table</code> y especifica una ruta tal como
-&lsquo;<tt>/usr/local/share/emacs/22.1.1/lisp/TAGS</tt>&rsquo;. Si la tabla tags no ha
-sido creada, tendr&aacute;s que crearla por t&iacute; mismo. Ser&aacute;
-un fichero tal como &lsquo;<tt>/usr/local/src/emacs/src/TAGS</tt>&rsquo;.
-</p>
-<p>Para crear un fichero &lsquo;<tt>TAGS</tt>&rsquo; en un directorio
-espec&iacute;fico, cambia a este directorio en Emacs usando
-un comando <kbd>M-x cd</kbd>, o lista el directorio como <code>etags&nbsp;*.el</code> como el comando para ejecutar:
-</p>
-<div class="smallexample">
-<pre class="smallexample">M-x compile RET etags *.el RET
-</pre></div>
-
-<p>Para m&aacute;s informaci&oacute;n, ver <a href="#etags">Crea tu propio fichero &lsquo;<tt>TAGS</tt>&rsquo;</a>.
-</p>
-<p>Despu&eacute;s de llegar a estar m&aacute;s familiarizado con Emacs Lisp,
-se encontrar&aacute; frecuentemente usar <code>find-tag</code> para navegar tu
-camino alrededor del c&oacute;digo fuente; y se crear&aacute;n tus propias tablas
-&lsquo;<tt>TAGS</tt>&rsquo;.
-</p>
-<a name="index-Libreria_002c-como-termino-para-_0060fichero_0027"></a>
-<p>Incidentalmente, los ficheros que contienen c&oacute;digo Lisp son
-convencionalmente llamadas <em>librer&iacute;as</em>. La
-met&aacute;fora se deriva que una librer&iacute;a, tal como
-la librer&iacute;a de leyes o una librer&iacute;a de
-ingenier&iacute;a, en vez de una librer&iacute;a
-general. Cada librer&iacute;a, o fichero, contiene funciones
-que se relacionan a un asunto particular o actividad, tal como
-&lsquo;<tt>abbrev.el</tt>&rsquo; para manejar abreviaciones y otros atajos, y
-&lsquo;<tt>help.el</tt>&rsquo; para la ayuda on-line. (Algunas veces varias
-librer&iacute;as proporcionan c&oacute;digo para una actividad
-simple, como varios &lsquo;<tt>rmail&hellip;</tt>&rsquo; ficheros proveen c&oacute;digo para
-leer correos electr&oacute;nicos.) En <cite>El Manual de GNU Emacs</cite>, tu
-ver&aacute;s varias frases tales como &ldquo;El comando <kbd>C-h p</kbd> te permite
-buscar el est&aacute;ndar de las librer&iacute;as Emacs Lisp por las
-palabras claves.
-</p>
-<hr>
-<a name="simplified_002dbeginning_002dof_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encontrando-m_00e1s" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#mark_002dwhole_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Una-definicion-simplificada-de-beginning_002dof_002dbuffer"></a>
-<h2 class="section">4.2 Una definici&oacute;n simplificada de <code>beginning-of-buffer</code></h2>
-<a name="index-simplified_002dbeginning_002dof_002dbuffer"></a>
-
-<p>El comando <code>beginning-of-buffer</code> es una buena funci&oacute;n para
-empezar ya puedes tener cierta familiaridad con eso y es f&aacute;cil de
-comprender. Usado como un comando interactivo,
-<code>beginning-of-buffer</code> mueve el cursor al principio del b&uacute;ffer,
-dejando la marca en la posici&oacute;n previa. Eso es generalmente
-asignados a <kbd>M-&lt;</kbd>.
-</p>
-<p>En esta secci&oacute;n, se discutir&aacute; una versi&oacute;n ordenada de la
-funci&oacute;n que muestra como eso es lo usado m&aacute;s frecuentemente. Esta
-funci&oacute;n ordenada trabaja como se escribe, pero no contiene el
-c&oacute;digo para una funci&oacute;n compleja. En otra secci&oacute;n, describiremos
-la funci&oacute;n entera. (V&eacute;ase la secci&oacute;n <a href="#beginning_002dof_002dbuffer">Definici&oacute;n Completa de <code>beginnning-of-buffer</code></a>.)
-</p>
-<p>Antes de mirar en el c&oacute;digo, perm&iacute;tenos considerar que
-la definici&oacute;n de funci&oacute;n tiene que contener: eso debe incluir una
-expresi&oacute;n que crea la funci&oacute;n interactiva as&iacute; puede
-ser llamado escribiendo <kbd>M-x beginning-of-buffer</kbd> o escribiendo
-unos atajos tales como <kbd>M-&lt;</kbd>; debe incluir c&oacute;digo para dejar una
-marca en la posici&oacute;n original en el b&uacute;ffer; y debe incluir
-c&oacute;digo el cursor al principio del b&uacute;ffer.
-</p>
-<p>Aqu&iacute; est&aacute; el texto completo la versi&oacute;n ordenada de
-la funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun simplified-beginning-of-buffer ()
- &quot;Mover punto al principio del bufer; dejar marca en la posici&oacute;n previa.&quot;
- (interactive)
- (push-mark)
- (goto-char (point-min)))
-</pre></div>
-
-<p>Como todas las definiciones de funci&oacute;n, esta definici&oacute;n tiene
-cinco partes siguiendo la forma especial <code>defun</code>:
-</p>
-<ol>
-<li>
-El nombre: en este ejemplo, <code>simplified-beginning-of-buffer</code>.
-
-</li><li>
-Una lista de los argumentos: en este ejemplo, una lista
-vac&iacute;a, <code>()</code>,
-
-</li><li>
-La cadena de documentaci&oacute;n.
-
-</li><li>
-La expresi&oacute;n interactive.
-
-</li><li>
-El cuerpo.
-</li></ol>
-
-<p>En esta definici&oacute;n de funci&oacute;n, la lista de argumentos est&aacute;
-vac&iacute;a; esto significa que esta funci&oacute;n no requiere
-argumentos. (Cuando se busca la definici&oacute;n para la funci&oacute;n
-completa, se ver&aacute; que puede pasarse un argumento opcional.)
-</p>
-<p>La expresi&oacute;n interactiva cuenta a Emacs que la funci&oacute;n se pretende
-ser usada interactivamente. En este ejemplo, <code>interactive</code> no
-tiene un argumento porque <code>simplified-beginning-of-buffer</code> no se
-requiere.
-</p>
-<p>El cuerpo de la funci&oacute;n consiste de dos l&iacute;neas:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(push-mark)
-(goto-char (point-min))
-</pre></div>
-
-<p>La primera de estas l&iacute;neas es la expresi&oacute;n,
-<code>(push-mark)</code>. Cuando esta expresi&oacute;n es evaluado por el
-int&eacute;rprete Lisp, eso asigna una marca en la posici&oacute;n actual del
-cursor, siempre y cuando esto pueda ser. La posici&oacute;n de esta marca
-est&aacute; guardada en el anillo de marcas.
-</p>
-<p>La siguiente l&iacute;nea es <code>(goto-char
-(point-min))</code>. Esta expresi&oacute;n salta el cursor al punto
-m&iacute;nimo en el b&uacute;ffer, esto es, para el comienzo del
-b&uacute;ffer (o al principio de la porci&oacute;n accesible del b&uacute;ffer si eso
-est&aacute; encogido. V&eacute;ase la secci&oacute;n <a href="#Encogiendo-y-extendiendo">Encogiendo y extendiendo</a>.)
-</p>
-<p>El comando <code>push-mark</code> estable una marca en el lugar donde el
-cursor fu&eacute; localizado antes que fuera movido al principio del
-b&uacute;ffer por la expresi&oacute;n <code>(goto-char
-(point-min))</code>. Consiguientemente, puedes, si lo deseas, volver donde
-estabas originalmente escribiendo <kbd>C-x C-x</kbd>.
-</p>
-<p>&iexcl;Esto es todo lo que hay para la definici&oacute;n de funci&oacute;n!
-</p>
-<a name="index-describe_002dfunction"></a>
-<p>Cuando se lee c&oacute;digo como este y vuelve a una funci&oacute;n no familiar,
-tal como <code>goto-char</code>, se puede encontrar que se hace usando el
-comando <code>describe-function</code>. Para usar este comando, escribe
-<kbd>C-h f</kbd> y entonces escribe en el nombre de la funci&oacute;n y presiona
-&lt;RET&gt;. El comando <code>describe-function</code> imprimir&aacute; la
-documentaci&#324; de la cadena de la funci&oacute;n en una ventana
-&lsquo;<tt>*Help*</tt>&rsquo;. Por ejemplo, la documentaci&oacute;n para <code>goto-char</code> es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">Asignar punto a POSITION, un n&uacute;mero o marca
-Empezando el buffer es la posici&oacute;n (point-min), y el final es
-(point-max).
-</pre></div>
-
-<p>La funci&oacute;n es un argumento es la posici&oacute;n deseada.
-</p>
-<p>(La consola para <code>describe-function</code> te ofrecer&aacute; el
-s&iacute;mbolo abajo o precediendo al cursor, as&iacute;
-se puede guardar escribiendo al posicionar el cursor a la derecha o
-despu&eacute;s de la funci&oacute;n y entonces escribir <kbd>C-h f &lt;RET&gt;</kbd>.)
-</p>
-<p>La definici&oacute;n de funci&oacute;n <code>end-of-buffer</code> est&aacute; escrito en el
-mismo modo que la definici&oacute;n <code>beginnig-of-buffer</code> excepto que
-el cuerpo de la funci&oacute;n contenga la expresi&oacute;n <code>(goto-char
-(point-max))</code> en lugar de <code>(goto-char (point-min))</code>
-</p>
-<hr>
-<a name="mark_002dwhole_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#simplified_002dbeginning_002dof_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#resumen-de-mark_002dwhole_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-definicion-de-mark_002dwhole_002dbuffer"></a>
-<h2 class="section">4.3 La definici&oacute;n de <code>mark-whole-buffer</code></h2>
-<a name="index-mark_002dwhole_002dbuffer"></a>
-
-<p>La funci&oacute;n <code>mark-whole-buffer</code> no es tan dif&iacute;cil de
-comprender que la funci&oacute;n <code>simplified-beginning-of-buffer</code>. En
-este caso, sin embargo, se ver&aacute; la funci&oacute;n completa, no una
-versi&oacute;n ordenada.
-</p>
-<p>La funci&oacute;n <code>mark-whole-buffer</code> no est&aacute; com&uacute;nmente usada
-como la funci&oacute;n <code>beginning-of-buffer</code>, pero eso no es &uacute;til:
-eso marca un b&uacute;ffer completo como una regi&oacute;n poniendo el punto al
-principio y una marca al fin del b&uacute;ffer. Eso est&aacute; generalmente
-asociado a <kbd>C-x h</kbd>.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#resumen-de-mark_002dwhole_002dbuffer">Un resumen de <code>mark-whole-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> resumen de mark-whole-buffer
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Cuerpo-de-mark_002dwhole_002dbuffer">4.3.1 Cuerpo de <code>mark-whole-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Solo tres l&iacute;neas de c&oacute;digo.
-</td></tr>
-</table>
-
-<hr>
-<a name="resumen-de-mark_002dwhole_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#mark_002dwhole_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#mark_002dwhole_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Cuerpo-de-mark_002dwhole_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Un-resumen-de-mark_002dwhole_002dbuffer"></a>
-<h3 class="unnumberedsubsec">Un resumen de <code>mark-whole-buffer</code></h3>
-
-<p>En GNU Emacs 22, el c&oacute;digo para la funci&oacute;n completa se parece a:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun mark-whole-buffer ()
- &quot;Pon el punto al principio y marca el fin del b&uacute;ffer.
-Probablemante no deber&iacute;as usar esta funci&oacute;n en
- programas Lisp; normalmente un error para una funci&oacute;n Lisp usa
- cualquier subrrutina que usa o asigna la marca.&quot;
- (interactive)
- (push-mark (point))
- (push-mark (point-max) nil t)
- (goto-char (point-min)))
-</pre></div>
-
-<p>Como todas las otras funciones, la funci&oacute;n <code>mark-whole-buffer</code>
-se ajusta dentro de la plantilla para una definici&oacute;n. La plantilla
-se parece a esta:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun <var>name-of-function</var> (<var>argument-list</var>)
- &quot;<var>documentation</var>&hellip;&quot;
- (<var>interactive-expression</var>&hellip;)
- <var>body</var>&hellip;)
-</pre></div>
-
-<p>Aqu&iacute; est&aacute; c&oacute;mo la funci&oacute;n trabaja: el nombre de la
-funci&oacute;n es <code>mark-whole-buffer</code>; eso es seguida por un argumento
-de lista vac&iacute;a, &lsquo;<samp>()</samp>&rsquo;, que significa que la
-funci&oacute;n no requiere argumentos. La documentaci&oacute;n viene la siguiente.
-</p>
-<p>La siguiente l&iacute;nea es una expresi&oacute;n
-<code>(interactive)</code> que cuenta a Emacs que la funci&oacute;n ser&aacute; usada
-interactivamente. Estos detalles son similares a la funci&oacute;n
-<code>simplified-beginning-of-buffer</code> descrita en la secci&oacute;n previa
-</p>
-<hr>
-<a name="Cuerpo-de-mark_002dwhole_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#resumen-de-mark_002dwhole_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#mark_002dwhole_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#append_002dto_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Cuerpo-de-mark_002dwhole_002dbuffer-1"></a>
-<h3 class="subsection">4.3.1 Cuerpo de <code>mark-whole-buffer</code></h3>
-
-<p>El cuerpo de la funci&oacute;n <code>mark-whole-buffer</code> consiste en tres
-l&iacute;neas de c&oacute;digo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(push-mark (point))
-(push-mark (point-max) nil t)
-(goto-char (point-min))
-</pre></div>
-
-<p>El primero de estas l&iacute;neas es la expresi&oacute;n,
-<code>(push-mark (point))</code>.
-</p>
-<p>Esta l&iacute;nea hace exactamente el mismo trabajo que la
-primera l&iacute;nea del cuerpo de la funci&oacute;n
-<code>simplified-beginning-of-buffer</code>, que est&aacute; escrita
-<code>(push-mark)</code>. En ambos casos, el int&eacute;rprete Lisp asigna una
-marca en la posici&oacute;n actual del cursor.
-</p>
-<p>No s&eacute; por qu&eacute; en la expresi&oacute;n <code>mark-whole-buffer</code> est&aacute;
-escrito <code>(push-mark (point))</code> y en la expresi&oacute;n
-<code>beginning-of-buffer</code> est&aacute; escrito <code>(push-mark)</code>. Quiz&aacute;s
-quien escribi&oacute; el c&oacute;digo no sab&iacute;a que los argumentos
-para <code>push-mark</code> son opcionales y que si <code>push-mark</code> no se
-pasa como argumento, la funci&oacute;n autom&aacute;ticamente asigna la marca en
-la localizaci&oacute;n del punto por defecto. O quiz&aacute;s la expresi&oacute;n
-fu&eacute; escrita as&iacute; como para parelizar la estructura de
-la siguiente l&iacute;nea. En cualquier caso, la
-l&iacute;nea causa que Emacs determine la posici&oacute;n del
-punto y asigne una marca all&iacute;.
-</p>
-<p>En las primeras versiones de GNU Emacs, la siguiente
-l&iacute;nea de <code>mark-whole-buffer</code> fu&eacute; <code>(push-mark
-(point-max))</code>. Esta expresi&oacute;n asigna una marca en el punto en el
-b&uacute;ffer que tiene el n&uacute;mero m&aacute;s alto. Esto ser&aacute; el fin del
-b&uacute;ffer (o, si el b&uacute;ffer es encogida, el fin de la porci&oacute;n
-accesible del b&uacute;ffer. V&eacute;ase la secci&oacute;n <a href="#Encogiendo-y-extendiendo">Encogiendo y extendiendo</a>, para m&aacute;s acerca de encoger). Despu&eacute;s esta marca ha sido
-asignada, la marca previa, uno asigna un punto, pero no se asigna largo,
-pero Emacs recuerda su posici&oacute;n, solo como todas las otras marcas
-recientes son siempre recordadas. Esto significa que se puede, si lo
-deseas, vuelve a esta posici&oacute;n escribiendo <kbd>C-u C-&lt;SPC&gt;</kbd> dos
-veces.
-</p>
-<p>En GNU Emacs 22, el <code>(point-max)</code> es ligeramente m&aacute;s
-complicado. La l&iacute;nea lee
-</p>
-<div class="smallexample">
-<pre class="smallexample">(push-mark (point-max) nil t)
-</pre></div>
-
-<p>La expresi&oacute;n funciona cerca de lo mismo que antes. Eso asigna una marca
-en el lugar numerado m&aacute;s alto que se puede en el b&uacute;ffer. Sin
-embargo, en esta versi&oacute;n, <code>push-mark</code> tiene dos argumentos
-adicionales. El segundo argumento para <code>push-mark</code> es
-<code>nil</code>. Esto cuenta la funci&oacute;n que
-<em>mostrar&iacute;a</em> un mensaje que dice &lsquo;Marca asignada&rsquo;
-cuando eso empuja la marca. El tercer argumento es <code>t</code>. Esto
-cuenta <code>push-mark</code> para activar la marca cuando el modo Transient
-Mark est&aacute; activado. Transient Mark mode ilumina la regi&oacute;n de marca
-activa. Con frecuencia desactivada
-</p>
-<p>Finalmente, la &uacute;ltima l&iacute;nea de la funci&oacute;n es
-<code>(goto-char (point-min))</code>. Esto es escrito exactamente el mismo
-camino camino como est&aacute; escrito <code>beginning-of-buffer</code>. La
-expresi&oacute;n mueve el cursor al m&iacute;nimo punto en el
-b&uacute;ffer, que es, al principio del b&uacute;fferr (o para el principio de
-la porci&oacute;n accesible del b&uacute;ffer). Como un resultado de esto, punto
-est&aacute; emplazado al principio del b&uacute;ffer y la marca est&aacute; asignada al
-fin del b&uacute;ffer. El b&uacute;ffer completo es, m&aacute;s all&aacute;, la regi&oacute;n.
-</p>
-<hr>
-<a name="append_002dto_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cuerpo-de-mark_002dwhole_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#resumen-de-append_002dto_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-definicion-de-append_002dto_002dbuffer"></a>
-<h2 class="section">4.4 La definici&oacute;n de <code>append-to-buffer</code></h2>
-<a name="index-append_002dto_002dbuffer"></a>
-
-<p>El comando <code>append-to-buffer</code> es m&aacute;s complejo que el comando
-<code>mark-whole-buffer</code>. Lo que hace es copiar la regi&oacute;n (que es,
-la parte del b&uacute;ffer entre punto y marca) desde el buffer actual a un
-b&uacute;ffer espec&iacute;fico.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#resumen-de-append_002dto_002dbuffer">Un resumen de <code>append-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> resumen de append-to-buffer
-</td></tr>
-<tr><td align="left" valign="top"><a href="#append-interactivo">4.4.1 La expresi&oacute;n interactiva <code>append-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una expresi&oacute;n interactiva de dos partes.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#cuerpo-append_002dto_002dbuffer">4.4.2 El cuerpo de <code>append-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Incorpora una expresi&oacute;n <code>let</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#append-save_002dexcursion">4.4.3 <code>save-excursion</code> en <code>append-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo <code>save-excursion</code> trabaja.
-</td></tr>
-</table>
-
-<hr>
-<a name="resumen-de-append_002dto_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#append_002dto_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#append_002dto_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#append-interactivo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Un-resumen-de-append_002dto_002dbuffer"></a>
-<h3 class="unnumberedsubsec">Un resumen de <code>append-to-buffer</code></h3>
-
-<a name="index-insert_002dbuffer_002dsubstring"></a>
-<p>El comando <code>append-to-buffer</code> usa la funci&oacute;n
-<code>insert-buffer-substring</code> para copiar la
-regi&oacute;n. <code>insert-buffer-substring</code> es descrita por su nombre:
-eso toma una cadena de caracteres desde parte de un b&uacute;ffer, una
-&ldquo;subcadena&rdquo;, y las inserta dentro de otro b&uacute;ffer.
-</p>
-<p>La mayor&iacute;a de <code>append-to-buffer</code> se refiere con la
-configuraci&oacute;n de las condiciones para <code>insert-buffer-substring</code>
-para trabajar: el c&oacute;digo debe especificar ambos el b&uacute;ffer para el
-que el texto ir&aacute;, la ventana viene y va, y la regi&oacute;n que ser&aacute; copiada.
-</p>
-<p>Aqu&iacute; est&aacute; el texto completo de la funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun append-to-buffer (buffer start end)
- &quot;Introduce al b&uacute;ffer espec&iacute;fico el texto de la
- regi&oacute;n. Esto es insertado de este b&uacute;ffer antes de su punto.
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">Cuando se llama desde un programa, se dan tres argumentos:
-BUFFER (o nombre del b&uacute;ffer), START y END.
-START y END especifica la porci&oacute;n del b&uacute;ffer actual para ser copiado.&quot;
- (interactive
- (list (read-buffer &quot;Append to buffer: &quot; (other-buffer
- (current-buffer) t))
- (region-beginning) (region-end)))
-</pre><pre class="smallexample"> (let ((oldbuf (current-buffer)))
- (save-excursion
- (let* ((append-to (get-buffer-create buffer))
- (windows (get-buffer-window-list append-to t t))
- point)
- (set-buffer append-to)
- (setq point (point))
- (barf-if-buffer-read-only)
- (insert-buffer-substring oldbuf start end)
- (dolist (window windows)
- (when (= (window-point window) point)
- (set-window-point window (point))))))))
-</pre></div>
-
-<p>La funci&oacute;n puede ser comprendida buscando como series de plantillas
-rellenas
-</p>
-<p>La plantilla de fuera es para la definici&oacute;n de la funci&oacute;n. En esta
-funci&oacute;n, se ve como esto (con varios slots rellenos):
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun append-to-buffer (buffer start end)
- &quot;<var>documentacion</var>&hellip;&quot;
- (interactive &hellip;)
- <var>cuerpo</var>&hellip;)
-</pre></div>
-
-<p>La primera l&iacute;nea de la funci&oacute;n incluye su nombre y los
-tres argumentos. Los argumentos son el <code>b&uacute;ffer</code> que el texto
-ser&aacute; copiado, y el <code>start</code> y <code>end</code> de la regi&oacute;n en el
-buffer actual que ser&aacute; copiado.
-</p>
-<p>La siguiente parte de la funci&oacute;n es la documentaci&oacute;n, que es claro
-y completo. Como es convencional, los tres argumentos son escritos en
-may&uacute;sculas as&iacute; se notificar&aacute;n f&aacute;cilmente. Incluso
-mejor, son descritas en el mismo orden como en la lista de argumentos.
-</p>
-<p>N&oacute;tese que la documentaci&oacute;n distingue entre un b&uacute;ffer y su
-nombre. (La funci&oacute;n puede manejar otro.)
-</p>
-<hr>
-<a name="append-interactivo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#resumen-de-append_002dto_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#append_002dto_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#cuerpo-append_002dto_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-expresion-interactiva-append_002dto_002dbuffer"></a>
-<h3 class="subsection">4.4.1 La expresi&oacute;n interactiva <code>append-to-buffer</code></h3>
-
-<p>Desde que la funci&oacute;n <code>append-to-buffer</code> ser&aacute; usada
-interactivamente, la funci&oacute;n debe tener una expresi&oacute;n
-<code>interactive</code>. (Para una revisi&oacute;n de <code>interactive</code>, ver
-<a href="#Interactive">Creando una Funci&oacute;n Interactive</a>.) La
-expresi&oacute;n se lee de la siguiente manera:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(interactive
- (list (read-buffer
- &quot;Agrega al buffer: &quot;
- (other-buffer (current-buffer) t))
- (region-beginning)
- (region-end)))
-</pre></div>
-
-<p>Esta expresi&oacute;n no es una con letras separadas por partes, como se
-describe antes. En vez de eso, empieza una lista con estas partes:
-</p>
-<p>La primera parte de la lista es una expresi&oacute;n para leer el nombre de
-un b&uacute;ffer y lo devuelve como una cadena. Esto es
-<code>read-buffer</code>. La funci&oacute;n requiere una consola como su primer
-argumento, &lsquo;<samp>&quot;Asocia al buffer: &quot;</samp>&rsquo;. Su segundo argumento cuenta el
-comando que valora para proporciona si no especifica cualquier cosa.
-</p>
-<p>En este caso este segundo argumento es una expresi&oacute;n conteniendo la
-funci&oacute;n <code>other-buffer</code>, una excepci&oacute;n, y una &lsquo;<samp>t</samp>&rsquo;, para verdad.
-</p>
-<p>El primer argumento para <code>other-buffer</code>, la excepci&oacute;n, es
-todav&iacute;a otra funci&oacute;n, <code>other-buffer</code>. Esto es no
-yendo a ser devuelto. El segundo argumento es el s&iacute;mbolo
-para verdad, <code>t</code>. Esto cuenta <code>other-buffer</code> que puede
-mostrar b&uacute;ffers visibles (excepto en este caso, eso no mostrar&aacute; el
-b&uacute;ffer actual, que tiene sentido).
-</p>
-<p>La expresi&oacute;n se ve como:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(other-buffer (current-buffer) t)
-</pre></div>
-
-<p>El segundo y tercer argumento de la expresi&oacute;n <code>list</code> son
-<code>(region-beginning)</code> y <code>(region-end)</code>. Estas dos funciones
-especifican el principio el y el final del texto que se adjunta.
-</p>
-<p>Originalmente, el comando usaba las letras &lsquo;<samp>B</samp>&rsquo; y &lsquo;<samp>r</samp>&rsquo;. La
-expresi&oacute;n completa <code>interactive</code> es as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(interactive &quot;BAsociar al buffer: \nr&quot;)
-</pre></div>
-
-<p>Pero cuando esto fu&eacute; hecho, el valor por defecto del b&uacute;ffer cambi&oacute;
-a ser invisible. Esto no se quer&iacute;a.
-</p>
-<p>(La consola estaba separada del segundo argumento con una nueva
-l&iacute;nea, &lsquo;<samp>\n</samp>&rsquo;. Estaba seguido por un &lsquo;<samp>r</samp>&rsquo; que
-contaba a Emacs emparejar los dos argumentos que siguen el
-s&iacute;mbolo <code>buffer</code> en la lista de argumentos de la
-funci&oacute;n (que es, <code>start</code> y <code>end</code>) para los valores de
-punto y marca. Este argumento trabaj&oacute; bien.)
-</p>
-<hr>
-<a name="cuerpo-append_002dto_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#append-interactivo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#append_002dto_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#append-save_002dexcursion" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-cuerpo-de-append_002dto_002dbuffer"></a>
-<h3 class="subsection">4.4.2 El cuerpo de <code>append-to-buffer</code></h3>
-
-
-<p>El cuerpo de la funci&oacute;n <code>append-to-buffer</code> empieza con <code>let</code>.
-</p>
-<p>Como se ha visto antes (v&eacute;ase la secci&oacute;n <a href="#let"><code>let</code></a>), el prop&oacute;sito de
-una expresi&oacute;n <code>let</code> es crear y dar valores iniciales a una o
-m&aacute;s variable que solo ser&aacute;n usada con el cuerpo del
-<code>let</code>. Esto significa que tal variable no ser&aacute; confuso con
-cualquier variable del mismo nombre fuera de la expresi&oacute;n <code>let</code>.
-</p>
-<p>Podemos ver como la expresi&oacute;n <code>let</code> se ajusta dentro de la
-funci&oacute;n como un todo mostrando una plantilla para
-<code>append-to-buffer</code> con la expresi&oacute;n <code>let</code> en
-l&iacute;nea:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun append-to-buffer (buffer start end)
- &quot;<var>documentacion</var>&hellip;&quot;
- (interactive &hellip;)
- (let ((<var>variable</var> <var>valor</var>))
- <var>cuerpo</var>&hellip;)
-</pre></div>
-
-<p>La expresi&oacute;n <code>let</code> tiene tres elementos:
-</p>
-<ol>
-<li>
-El s&iacute;mbolo <code>let</code>;
-
-</li><li>
-Una varlist conteniendo, en este caso, una lista simple de dos
-elementos, <code>(<var>variable</var> <var>value</var>)</code>;
-
-</li><li>
-El cuerpo de la expresi&oacute;n <code>let</code>.
-</li></ol>
-
-<p>En la funci&oacute;n <code>append-to-buffer</code>, la varlist se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(oldbuf (current-buffer))
-</pre></div>
-
-<p>En esta parte de la expresi&oacute;n <code>let</code>, una variable,
-<code>oldbuf</code> es emparejada al valor devuelto por la expresi&oacute;n
-<code>(current-buffer)</code>. La variable, <code>oldbuf</code>, es usada para
-guardar la traza del b&uacute;ffer en el que tu est&aacute;s trabajando y desde
-el que se copiar&aacute;.
-</p>
-<p>El elemento o elementos de una varlist son rodeados por un conjunto de
-par&eacute;ntesis as&iacute; el int&eacute;rprete Lisp puede distinguir
-la varlist desde el cuerpo del <code>let</code>. Como consecuencia, la lista
-de dos elementos con la varlist est&aacute; rodeados por un circunscrito
-conjunto de par&eacute;ntesis. Las l&iacute;neas se ven
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let ((oldbuf (current-buffer)))
- &hellip; )
-</pre></div>
-
-<p>Los dos par&eacute;ntesis antes de <code>oldbuf</code> podr&iacute;an
-sorprenderte si no fuera porque los primeros par&eacute;ntesis antes de
-<code>oldbuf</code> marcan el l&iacute;mite de la varlist y el segundo
-par&eacute;ntesis marca el principio de la lista de dos elementos,
-<code>(oldbuf (current-buffer))</code>.
-</p>
-<hr>
-<a name="append-save_002dexcursion"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#cuerpo-append_002dto_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#append_002dto_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Revisa-lo-relacionado-con-el-b_00faffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="save_002dexcursion-en-append_002dto_002dbuffer"></a>
-<h3 class="subsection">4.4.3 <code>save-excursion</code> en <code>append-to-buffer</code></h3>
-
-<p>El cuerpo de la expresi&oacute;n <code>let</code> en <code>append-to-buffer</code>
-consiste de una expresi&oacute;n <code>save-excursion</code>.
-</p>
-<p>La funci&oacute;n <code>save-excursion</code> guarda las localizaciones de punto y
-la marca, y las restaura a estas posiciones despu&eacute;s de las expresiones
-en el cuerpo de la ejecuci&oacute;n completa
-<code>save-excursion</code>. Adem&aacute;s, <code>save-excursion</code> completa
-la ejecuci&oacute;n. Adem&aacute;s, <code>save-excursion</code> guarda la traza del
-b&uacute;ffer original, y lo restaura. Esto es c&oacute;mo <code>save-excursion</code>
-que se usa en <code>append-to-buffer</code>.
-</p>
-<a name="index-Indentacin-para-formatear"></a>
-<a name="index-Convencion-formateando"></a>
-<p>Incidentalmente, no se valora nada aqu&iacute; que una
-funci&oacute;n Lisp es normalmente formateada as&iacute; que cada
-cosa que es encerrada en conjunto multil&iacute;nea que es
-indentada m&aacute;s a la derecha que el primer s&iacute;mbolo. En
-esta definici&oacute;n de funci&oacute;n, el <code>let</code> es indentado m&aacute;s que
-<code>defun</code>, y el <code>save-excursion</code> es indentado m&aacute;s que el
-<code>let</code>, como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun &hellip;
- &hellip;
- &hellip;
- (let&hellip;
- (save-excursion
- &hellip;
-</pre></div>
-
-<p>Esta convenci&oacute;n formatea que sea f&aacute;cil de ver que las
-l&iacute;neas en el cuerpo de <code>save-excursion</code>, solo
-como <code>save-excurion</code> por s&iacute; mismo est&aacute;n
-encerradas por los par&eacute;ntesis asociados con el <code>let</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let ((oldbuf (current-buffer)))
- (save-excursion
- &hellip;
- (set-buffer &hellip;)
- (insert-buffer-substring oldbuf start end)
- &hellip;))
-</pre></div>
-
-<p>El uso de la funci&oacute;n <code>save-excursion</code> puede ser vista como un
-proceso de rellenar slots de una plantilla:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(save-excursion
- <var>primera-expresion-en-cuerpo</var>
- <var>segunda-expresion-en-cuerpo</var>
- &hellip;
- <var>ultima-expresion-en-cuerpo</var>)
-</pre></div>
-
-<p>En esta funci&oacute;n, el cuerpo de <code>save-excursion</code> contiene solo
-una expresi&oacute;n, la expresi&oacute;n <code>let*</code>. Se conoce una funci&oacute;n
-<code>let</code>. La funci&oacute;n <code>let*</code> es diferente. Eso tiene un
-&lsquo;<samp>*</samp>&rsquo; en su nombre. Eso permite a Emacs asignar cada variable de su
-varlist en secuencia, una despu&eacute;s de otra.
-</p>
-<p>Su funcionalidad cr&iacute;tica es que las variable despu&eacute;s
-en la varlist puedan hacer uso de los valores para los que Emacs asigna
-variables pronto en la varlist. V&eacute;ase la secci&oacute;n <a href="#fwd_002dpara-let">La expresi&oacute;n <code>let*</code></a>.
-</p>
-<p>Se obviar&aacute;n funciones como <code>let*</code> y se focalizar&aacute; en dos: la
-funci&oacute;n <code>set-buffer</code> y la funci&oacute;n
-<code>insert-buffer-substring</code>.
-</p>
-<p>En anta&ntilde;o, la expresi&oacute;n <code>set-buffer</code> era simple:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(set-buffer (get-buffer-create buffer))
-</pre></div>
-
-<p>pero ahora eso es
-</p>
-<div class="smallexample">
-<pre class="smallexample">(set-buffer append-to)
-</pre></div>
-
-<p><code>append-to</code> se asigna a <code>(get-buffer-create-buffer)</code> pronto
-en la expresi&oacute;n <code>let*</code>. Esta asociaci&oacute;n extra no
-ser&iacute;a necesaria excepto para este <code>append-to</code> es
-usado despu&eacute;s en la varlist como un argumento para
-<code>get-buffer-window-list</code>.
-</p>
-
-<p>La definici&oacute;n de la funci&oacute;n <code>append-to-buffer</code> inserta texto
-desde el b&uacute;ffer en el que est&aacute;s actualmente a un buffer
-nombrado. Eso sucede que <code>insert-buffer-substring</code> copia texto
-desde otro b&uacute;ffer al b&uacute;ffer actual, solo el inverso &mdash; que es
-porque la definici&oacute;n <code>append-to-buffer</code> empieza con un
-<code>let</code> que asocia el s&iacute;mbolo local <code>oldbuf</code> al
-valor devuelto por <code>current-buffer</code>.
-</p>
-<p>La expresi&oacute;n <code>insert-buffer-substring</code> se ve como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(insert-buffer-substring oldbuf start end)
-</pre></div>
-
-<p>La funci&oacute;n <code>insert-buffer-substring</code> copia una cadena
-<em>from</em> al b&uacute;ffer especificado como su primer argumento e
-inserta la cadena dentro del b&uacute;ffer presente. En este caso, el
-argumento para <code>insert-buffer-substring</code> es el valor de la
-variable creada y asociada por el <code>let</code>, llama al valor de
-<code>oldbuf</code>, que fu&eacute; el b&uacute;ffer actual cuando tu diste el comando
-<code>append-to-buffer</code>.
-</p>
-<p>Despu&eacute;s de que <code>insert-buffer-substring</code> ha hecho su trabajo,
-<code>save-excursion</code> restaurar&aacute; la acci&oacute;n al b&uacute;ffer original y
-<code>append-to-buffer</code> habr&aacute; hecho su trabajo.
-</p>
-<p>Escrito en forma esquel&eacute;tica, los trabajos del cuerpo se ven como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let (<var>bind-</var><code>oldbuf</code><var>-to-value-of-</var><code>current-buffer</code>)
- (save-excursion ; <span class="roman">Guarda la traza del b&uacute;ffer.</span>
- <var>change-buffer</var>
- <var>insert-substring-from-</var><code>oldbuf</code><var>-into-buffer</var>)
-
- <var>change-back-to-original-buffer-when-finished</var>
-<var>let-the-local-meaning-of-</var><code>oldbuf</code><var>-disappear-when-finished</var>
-</pre></div>
-
-<p>En resumen, <code>append-to-buffer</code> funciona como sigue: se guarda el
-valor del b&uacute;ffer actual en la variable llamada <code>oldbuf</code>. Se obtiene
-el nuevo b&uacute;ffer (creando uno si necesita ser) y cambia la atenci&oacute;n
-de Emacs a eso. Usando el valor de <code>oldbuf</code>, inserta la regi&oacute;n
-del texto desde el viejo b&uacute;ffer dentro del nuevo b&uacute;ffer; y entonces
-usando <code>save-excursion</code>, trae atr&aacute;s a tu b&uacute;ffer original.
-</p>
-<p>Buscando <code>append-to-buffer</code>, se ha explorado una funci&oacute;n limpia
-compleja. Eso muestra como usar <code>let</code> y <code>save-excursion</code>, y
-como cambiar y volver desde otro buffer. Muchas definiciones de
-funci&oacute;n usan <code>let</code>, <code>save-excursion</code>, y <code>set-buffer</code>
-de este modo.
-</p>
-<hr>
-<a name="Revisa-lo-relacionado-con-el-b_00faffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#append-save_002dexcursion" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicios-de-b_00faffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Revisar-3"></a>
-<h2 class="section">4.5 Revisar</h2>
-
-<p>Aqu&iacute; est&aacute; un breve resumen de varias funciones
-discutidas en este cap&iacute;tulo.
-</p>
-<dl compact="compact">
-<dt><code>describe-function</code></dt>
-<dt><code>describe-variable</code></dt>
-<dd><p>Imprime la documentaci&oacute;n para una funci&oacute;n o
-variable. Convencionalmente asociada a <kbd>C-h f</kbd> y <kbd>C-h v</kbd>.
-</p>
-</dd>
-<dt><code>find-tag</code></dt>
-<dd><p>Encuentra el fichero que contiene la fuente para una funci&oacute;n o
-variable y cambia buffer a &eacute;l, posicionando el punto al principio
-del &iacute;tem. Convencionalmente emparejado a <kbd>M-.</kbd> (esto
-es un per&iacute;odo seguiendo la tecla &lt;META&gt;).
-</p>
-</dd>
-<dt><code>save-excursion</code></dt>
-<dd><p>Guarda la localizaci&oacute;n de punto y marca y restaura sus valores
-despu&eacute;s de los argumentos para <code>save-excursion</code> y han sido
-evaluados. Tambi&eacute;n, recuerda el buffer actual y devu&eacute;lvelo.
-</p>
-</dd>
-<dt><code>push-mark</code></dt>
-<dd><p>Asigna la marca en una localizaci&oacute;n y graba el valor de la marca
-previa en el anillo de la marca. La marca es una localizaci&oacute;n en el
-b&uacute;ffer que guarda su posici&oacute;n relativa incluso si el texto es
-a&ntilde;adido o borrado desde el b&uacute;ffer.
-</p>
-</dd>
-<dt><code>goto-char</code></dt>
-<dd><p>Asigna punto a la localizaci&oacute;n especificada por el valor del
-argumento, que puede ser un n&uacute;mero, una marca, o una expresi&oacute;n que
-devuelve el n&uacute;mero de una posici&oacute;n, tal como <code>(point-min)</code>.
-</p>
-</dd>
-<dt><code>insert-buffer-substring</code></dt>
-<dd><p>Copia una regi&oacute;n de texto desde un b&uacute;ffer que es pasado a la
-funci&oacute;n como un argumento e inserta la regi&oacute;n dentro del b&uacute;ffer
-actual.
-</p>
-</dd>
-<dt><code>mark-whole-buffer</code></dt>
-<dd><p>Marca el b&uacute;ffer completo como una regi&oacute;n. Normalmente asignado a
-<kbd>C-x h</kbd>.
-</p>
-</dd>
-<dt><code>set-buffer</code></dt>
-<dd><p>Cambia la atenci&oacute;n de Emacs a otro b&uacute;ffer, pero no cambies la
-ventana siendo mostrada. Usado cuando el programa en vez de un humano
-trabaja en un b&uacute;ffer diferente.
-</p>
-</dd>
-<dt><code>get-buffer-create</code></dt>
-<dt><code>get-buffer</code></dt>
-<dd><p>Encuentra un b&uacute;ffer nombrado o crea uno si un b&uacute;ffer de este
-nombre no existe. La funci&oacute;n <code>get-buffer</code> devuelve <code>nil</code>
-si el nombre del b&uacute;ffer no existe.
-</p></dd>
-</dl>
-
-<hr>
-<a name="Ejercicios-de-b_00faffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Revisa-lo-relacionado-con-el-b_00faffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicios-2"></a>
-<h2 class="section">4.6 Ejercicios</h2>
-
-<ul>
-<li>
-Escribe tu propia definici&oacute;n de funci&oacute;n
-<code>simplified-end-of-buffer</code>; entonces testea para ver si funciona.
-
-</li><li>
-Usa <code>if</code> y <code>get-buffer</code> para escribir una funci&oacute;n que
-imprime un mensaje contando si un buffer existe.
-
-</li><li>
-Usando <code>find-tag</code>, encuentra la fuente para la funci&oacute;n
-<code>copy-to-buffer</code>
-</li></ul>
-
-<hr>
-<a name="M_00e1s-complejidad"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicios-de-b_00faffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#copy_002dto_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Unas-pocas-funciones-mas-complejas"></a>
-<h1 class="chapter">5 Unas pocas funciones m&aacute;s complejas</h1>
-
-<p>En este cap&iacute;tulo, se construye lo que se aprendi&oacute; en
-los cap&iacute;tulos previos mirando en funciones m&aacute;s
-complejas. La funci&oacute;n <code>copy-to-buffer</code> ilustra el uso de
-expresiones <code>save-excursion</code> en una definici&oacute;n, mientras la
-funci&oacute;n <code>insert-buffer</code> ilustra el uso de un asterisco en una
-expresi&oacute;n <code>interactive</code>, uso de <code>o</code>, y la importante
-distinci&oacute;n entre un nombre y el objeto para el que el nombre se
-refiere.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#copy_002dto_002dbuffer">5.1 La definici&oacute;n de <code>copy-to-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Con <code>set-buffer</code>,
- <code>get-buffer-create</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#insert_002dbuffer">5.2 La definici&oacute;n de <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Solo lectura, y con <code>or</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#beginning_002dof_002dbuffer">5.3 Definici&oacute;n completa de <code>beginning-of-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Muestra <code>goto-char</code>, <code>point-min</code>, y
- <code>push-mark</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Revisar-el-segundo-b_00faffer-relacionado">5.4 Revisar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Revisar el segundo b&uacute;ffer
- relacionado
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-opcional">5.5 Ejercicio de argumento <code>opcional</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio opcional
-</td></tr>
-</table>
-
-<hr>
-<a name="copy_002dto_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-definicion-de-copy_002dto_002dbuffer"></a>
-<h2 class="section">5.1 La definici&oacute;n de <code>copy-to-buffer</code></h2>
-<a name="index-copy_002dto_002dbuffer"></a>
-
-<p>Despu&eacute;s de comprender c&oacute;mo se trabaja <code>append-to-buffer</code>, es
-f&aacute;cil para comprender <code>copy-to-buffer</code>. Esta funci&oacute;n copia
-texto dentro de un b&uacute;ffer, pero en vez de a&ntilde;adir al segundo
-b&uacute;ffer, se reemplaza a todo el texto previo en el segundo b&uacute;ffer.
-</p>
-<p>El cuerpo de <code>copy-to-buffer</code> se ve como esto,
-</p>
-<div class="smallexample">
-<pre class="smallexample">&hellip;
-(interactive &quot;BCopy to buffer: \nr&quot;)
-(let ((oldbuf (current-buffer)))
- (with-current-buffer (get-buffer-create buffer)
- (barf-if-buffer-read-only)
- (erase-buffer)
- (save-excursion
- (insert-buffer-substring oldbuf start end)))))
-</pre></div>
-
-<p>La funci&oacute;n <code>copy-to-buffer</code> tiene una expresi&oacute;n simple
-<code>interactive</code> en vez de <code>append-to-buffer</code>.
-</p>
-<p>La definici&oacute;n entonces dice:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(with-current-buffer (get-buffer-create buffer) &hellip;
-</pre></div>
-
-<p>Primero, mira en la expresi&oacute;n interna m&aacute;s temprana; que es
-evaluada primero. Esta expresi&oacute;n empieza con <code>get-buffer-create
-buffer</code>. La funci&oacute;n cuenta al ordenador para usar el b&uacute;ffer con el
-nombre espec&iacute;ficado como uno para el que est&aacute;s
-copiando, o si tal b&uacute;ffer no existe, cr&eacute;alo. Entonces, la funci&oacute;n
-<code>with-current-buffer</code> eval&uacute;a su cuerpo con este b&uacute;ffer
-temporalmente al actual.
-</p>
-<p>(Esto demuestra otro camino para cambiar la atenci&oacute;n del ordenador
-pero no los usuarios. La funci&oacute;n <code>append-to-buffer</code> muestra
-como hacer lo mismo con <code>save-excursion</code> y
-<code>set-buffer</code>. <code>with-current-buffer</code> es uno nuevo, y
-argumentablemente f&aacute;cil, mecanismo.)
-</p>
-<p>La funci&oacute;n <code>barf-if-buffer-read-only</code> env&iacute;a un
-mensaje de error diciendo al b&uacute;ffer es de solo lectura si no se
-puede modificar.
-</p>
-<p>La siguiente l&iacute;nea tiene la funci&oacute;n
-<code>erase-buffer</code> como sus &uacute;nicos contenidos. Este funci&oacute;n borra
-el b&uacute;ffer.
-</p>
-<p>Finalmente, las &uacute;ltimas dos l&iacute;neas contienen la
-expresi&oacute;n <code>save-excursion</code> con <code>insert-buffer-substring</code>
-como su cuerpo. La expresi&oacute;n <code>insert-buffer-substring</code> copia el
-texto desde el b&uacute;ffer en el que se est&aacute; (y no se ha visto el
-ordenador puesta su atenci&oacute;n, as&iacute; no se sabe que este
-b&uacute;ffer es ahora llamado <code>oldbuf</code>).
-</p>
-<p>De manera incidental, esto es lo que significa por &lsquo;reemplazo&rsquo;. Para
-reemplazar texto Emacs se borra el texto previo y entonces se inserta el
-nuevo texto.
-</p>
-<p>El c&oacute;digo fuente, del cuerpo de <code>copy-to-buffer</code> se parece a
-esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let (<var>bind-</var><code>oldbuf</code><var>-to-value-of-</var><code>current-buffer</code>)
- (<var>with-the-buffer-you-are-copying-to</var>
- (<var>but-do-not-erase-or-copy-to-a-read-only-buffer</var>)
- (erase-buffer)
- (save-excursion
- <var>insert-substring-from-</var><code>oldbuf</code><var>-into-buffer</var>)))
-</pre></div>
-
-<hr>
-<a name="insert_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#copy_002dto_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#c_00f3digo-insert_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-definicion-de-insert_002dbuffer"></a>
-<h2 class="section">5.2 La definici&oacute;n de <code>insert-buffer</code></h2>
-<a name="index-insert_002dbuffer"></a>
-
-<p><code>insert-buffer</code> es todav&iacute;a una funci&oacute;n
-relacionada con el b&uacute;ffer. Este comando copia otro b&uacute;ffer
-<em>dentro</em> del b&uacute;ffer actual. Es lo inverso de
-<code>append-to-buffer</code> o <code>copy-to-buffer</code>, desde que se copia
-una regi&oacute;n de texto <em>desde</em> el b&uacute;ffer actual a otro
-b&uacute;ffer.
-</p>
-<p>Aqu&iacute; hay una discusi&oacute;n basada en el c&oacute;digo
-original. El c&oacute;digo era simplificado en 2003 y es duro de comprender.
-</p>
-<p>(V&eacute;ase la secci&oacute;n <a href="#Nuevo-insert_002dbuffer">Nuevo Cuerpo para <code>insert-buffer</code></a>,
-para ver una discusi&oacute;n del nuevo cuerpo.)
-</p>
-<p>Adem&aacute;s, este c&oacute;digo ilustra el uso de <code>interactive</code> con un
-b&uacute;ffer que podr&iacute;a ser <em>read-only</em> y la
-distinci&oacute;n entre el nombre de un objeto y el objeto actualmente referido.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#c_00f3digo-insert_002dbuffer">El c&oacute;digo para <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> c&oacute;digo insert-buffer
-</td></tr>
-<tr><td align="left" valign="top"><a href="#insert_002dbuffer-interactivo">5.2.1 La expresi&oacute;n interactiva en <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cuando tu puedes leer, pero no escribir.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#cuerpo-insert_002dbuffer">5.2.2 El cuerpo de la funci&oacute;n <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El cuerpo tiene un <code>or</code> y un <code>let</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#si-y-o">5.2.3 <code>insert-buffer</code> con un <code>if</code> en vez de un <code>or</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usando un <code>if</code> en vez de un <code>or</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Insertar-o">5.2.4 El <code>or</code> en el cuerpo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo la expresi&oacute;n <code>or</code> funciona.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Insertar-let">5.2.5 La expresi&oacute;n <code>let</code> en <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Dos expresiones <code>save-excursion</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Nuevo-insert_002dbuffer">5.2.6 Nuevo cuerpo para <code>insert-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Nuevo insert-buffer
-</td></tr>
-</table>
-
-<hr>
-<a name="c_00f3digo-insert_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer-interactivo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-codigo-para-insert_002dbuffer"></a>
-<h3 class="unnumberedsubsec">El c&oacute;digo para <code>insert-buffer</code></h3>
-
-<p>Aqu&iacute; est&aacute; el primer c&oacute;digo
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun insert-buffer (buffer)
- &quot;Inserta despu&eacute;s del punto los contenidos del BUFFER.
-Pon la marca despu&eacute;s del texto insertado.
-El BUFFER puede ser un buffer un nombre de buffer.&quot;
- (interactive &quot;*bInsert buffer: &quot;)
-</pre><pre class="smallexample"> (or (bufferp buffer)
- (setq buffer (get-buffer buffer)))
- (let (start end newmark)
- (save-excursion
- (save-excursion
- (set-buffer buffer)
- (setq start (point-min) end (point-max)))
-</pre><pre class="smallexample"> (insert-buffer-substring buffer start end)
- (setq newmark (point)))
- (push-mark newmark)))
-</pre></div>
-
-<p>Como con otras definiciones de funci&oacute;n, se puede usar una plantilla
-para visi&oacute;n de la funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun insert-buffer (buffer)
- &quot;<var>documentation</var>&hellip;&quot;
- (interactive &quot;*bInsert buffer: &quot;)
- <var>body</var>&hellip;)
-</pre></div>
-
-<hr>
-<a name="insert_002dbuffer-interactivo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#c_00f3digo-insert_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#B_00faffer-solo-lectura" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-expresion-interactiva-en-insert_002dbuffer"></a>
-<h3 class="subsection">5.2.1 La expresi&oacute;n interactiva en <code>insert-buffer</code></h3>
-<a name="index-interactive_002c-ejemplo-de-uso"></a>
-
-<p>En <code>insert-buffer</code>, el argumetno para la declaraci&oacute;n
-<code>interactive</code> tiene dos partes, un asterisco, &lsquo;<samp>*</samp>&rsquo;, y
-&lsquo;<samp>bInserta un buffer: </samp>&rsquo;.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#B_00faffer-solo-lectura">Un b&uacute;ffer de solo lectura</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cuando un buffer no puede ser modificado.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#b-para-interactivo">&lsquo;<samp>b</samp>&rsquo; en una expresi&oacute;n interactiva</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un buffer existe o adem&aacute;s su nombre.
-</td></tr>
-</table>
-
-<hr>
-<a name="B_00faffer-solo-lectura"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer-interactivo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer-interactivo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#b-para-interactivo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Un-buffer-de-solo-lectura"></a>
-<h4 class="unnumberedsubsubsec">Un b&uacute;ffer de solo lectura</h4>
-<a name="index-Buffer-solo-lectura"></a>
-<a name="index-Asterisco-para-buffer-de-solo-lectura"></a>
-<a name="index-_002a-para-buffer-solo-lectura"></a>
-
-<p>El asterisco se utliza en la situaci&oacute;n cuando el b&uacute;ffer actual es un
-b&uacute;ffer de solo lectura &mdash; un b&uacute;ffer que no puede ser modificado. Si
-<code>insert-buffer</code> es llamado cuando el b&uacute;ffer actual es de solo
-lectura, un mensaje a este efecto est&aacute; impreso en el &aacute;rea echo y
-el terminal puede avisar; no se permite insertar cualquier cosa dentro
-del b&uacute;ffer. El asterisco no necesita ser seguido por una nueva
-l&iacute;nea para separarse desde el siguiente argumento.
-</p>
-<hr>
-<a name="b-para-interactivo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#B_00faffer-solo-lectura" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer-interactivo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#cuerpo-insert_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="b-en-una-expresion-interactiva"></a>
-<h4 class="unnumberedsubsubsec">&lsquo;<samp>b</samp>&rsquo; en una expresi&oacute;n interactiva</h4>
-
-<p>El siguiente argumento en la expresi&oacute;n interactiva empieza con una
-tecla min&uacute;scula &lsquo;<samp>b</samp>&rsquo;. (Esto es diferente desde el c&oacute;digo para
-<code>append-to-buffer</code>, que usa una may&uacute;scula
-&lsquo;<samp>B</samp>&rsquo;. V&eacute;ase la secci&oacute;n <a href="#append_002dto_002dbuffer">La Definici&oacute;n de <code>append-to-buffer</code></a>.) La tecla min&uacute;scula cuenta al int&eacute;rprete
-Lisp que el argumento para <code>insert-buffer</code> ser&iacute;a un
-buffer existente o sino su nombre. (La may&uacute;scula &lsquo;<samp>B</samp>&rsquo; provee
-para la posibilidad que el b&uacute;ffer no existe.) Emacs te mostrar&aacute; en
-pantalla el nombre del b&uacute;ffer, ofreciendo un b&uacute;ffer por defecto,
-con la compleci&oacute;n de nombre habilitado. Si el b&uacute;ffer no existe, se
-recibe un mensaje que dice &ldquo;No concuerda&rdquo;; tu terminal te avisa tambi&eacute;n.
-</p>
-<p>El nuevo y simplificado c&oacute;digo genera una lista
-<code>interactive</code>. Eso usa las funciones
-<code>barf-if-buffer-read-only</code> y <code>read-buffer</code> con las que
-estamos ya familiarizados y la forma especial <code>progn</code> con los que
-no. (Eso ser&aacute; descrito despu&eacute;s).
-</p>
-<hr>
-<a name="cuerpo-insert_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#b-para-interactivo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#si-y-o" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-cuerpo-de-la-funcion-insert_002dbuffer"></a>
-<h3 class="subsection">5.2.2 El cuerpo de la funci&oacute;n <code>insert-buffer</code></h3>
-
-<p>El cuerpo de la funci&oacute;n <code>insert-buffer</code> tiene dos partes
-principales: una expresi&oacute;n <code>or</code> y una expresi&oacute;n
-<code>let</code>. El prop&oacute;sito de la expresi&oacute;n <code>or</code> es asegurar que
-el argumento <code>buffer</code> es emparejado a un b&uacute;ffer y no solo el
-nombre de un b&uacute;ffer. El cuerpo de la expresi&oacute;n <code>let</code> contiene
-el c&oacute;digo que copia los otros b&uacute;ffers dentro del b&uacute;ffer.
-</p>
-<p>En el &quot;outline&quot; (esquema), las dos expresiones se ajustan dentro de la
-funci&oacute;n <code>insert-buffer</code> como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun insert-buffer (buffer)
- &quot;<var>documentation</var>&hellip;&quot;
- (interactive &quot;*bInsertar buffer: &quot;)
- (or &hellip;
- &hellip;
-</pre><pre class="smallexample"> (let (<var>varlist</var>)
- <var>body-of-</var><code>let</code>&hellip; )
-</pre></div>
-
-<p>Para comprender como la expresi&oacute;n <code>or</code> asegura que el argumento
-<code>buffer</code> es emparejado a un buffer y no al nombre de un b&uacute;ffer,
-es primero necesario comprender la funci&oacute;n <code>or</code>.
-</p>
-<p>Antes de hacer esto, perm&iacute;teme reescribir esta parte de
-la funci&oacute;n usando <code>if</code> as&iacute; puedes ver que es
-hecho en una manera que ser&aacute; familiar.
-</p>
-<hr>
-<a name="si-y-o"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#cuerpo-insert_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Insertar-o" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="insert_002dbuffer-con-un-if-en-vez-de-un-or"></a>
-<h3 class="subsection">5.2.3 <code>insert-buffer</code> con un <code>if</code> en vez de un <code>or</code></h3>
-
-<p>El trabajo que debe ser hecho y asegura el valor de <code>buffer</code> es
-un b&uacute;ffer en s&iacute; mismo y no el nombre de un b&uacute;ffer. Si
-el valor es el nombre, entonces el b&uacute;ffer en s&iacute; debe ser
-obtenido.
-</p>
-<p>Te puedes imaginar a t&iacute; mismo en una conferencia donde
-un acomodador est&aacute; observando una lista con tu nombre dentro y
-mir&aacute;ndote: el acomodador sabe &ldquo;asociar&rdquo; tu nombre, pero no a
-t&iacute;; pero cuando el acomodador te encuentra y te toma el
-brazo, el acomodador llega a &ldquo;asociarte&rdquo; a t&iacute;.
-</p>
-<p>En Lisp, se podr&iacute;a describir esta situaci&oacute;n
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (not (holding-on-to-guest))
- (find-and-take-arm-of-guest))
-</pre></div>
-
-<p>Se quiere hacer la misma cosa con un b&uacute;ffer &mdash; si no tenemos el
-b&uacute;ffer en s&iacute;, queremos tenerlo.
-</p>
-<p>Usando un predicado llamado <code>bufferp</code> que nos cuenta si tenemos
-un b&uacute;ffer (en vez de su nombre), se puede escribir el c&oacute;digo como
-este:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (not (bufferp buffer)) ; <span class="roman">if-part</span>
- (setq buffer (get-buffer buffer))) ; <span class="roman">then-part</span>
-</pre></div>
-
-<p>Aqu&iacute;, el true-or-false-test de la expresi&oacute;n <code>if</code>
-es <code>(not&nbsp;(bufferp&nbsp;buffer))</code>; y la then-part es la expresi&oacute;n
-<code>(setq&nbsp;buffer&nbsp;<span class="nolinebreak">(get-buffer</span>&nbsp;buffer))</code>.
-</p>
-<p>En el test, la funci&oacute;n <code>bufferp</code> devuelve cierto si su
-argumento es un b&uacute;ffer &mdash; pero falso si su argumento es el nombre del
-b&uacute;ffer. (El &uacute;ltimo car&aacute;cter del nombre de la funci&oacute;n
-<code>bufferp</code> es el car&aacute;cter &lsquo;<samp>p</samp>&rsquo;; como se vi&oacute; antes, tal uso de
-&lsquo;<samp>p</samp>&rsquo; es una convenci&oacute;n que indica que la funci&oacute;n es un
-predicado, que es un t&eacute;rmino que significa que la funci&oacute;n
-determinar&aacute; si alguna propiedad es verdadera o falsa. V&eacute;ase la secci&oacute;n <a href="#Tipo-incorrecto-de-argumento">Usando el objeto de tipo incorrecto como un argumento</a>.)
-</p>
-<p>La funci&oacute;n <code>not</code> precede la expresi&oacute;n <code>(bufferp
-buffer)</code>, as&iacute; el true-or-false-test se ve como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(not (bufferp buffer))
-</pre></div>
-
-<p><code>no</code> es una funci&oacute;n que devuelve cierto si su argumento es falso
-y falso si su argumento es verdadero. As&iacute; si
-<code>(bufferp buffer)</code> devuelve cierto, la expresi&oacute;n <code>no</code>
-devuelve falso y vice-versa: que es &ldquo;no cierto&rdquo; es falso que es &ldquo;no
-falso&rdquo; es verdadero.
-</p>
-<p>Usando este test, la expresi&oacute;n <code>if</code> trabaja como sigue: cuando
-el valor de la variable <code>buffer</code> est&aacute; actualmente en un
-b&uacute;ffer en vez de su nombre, el test true-or-false-test devuelve
-false y la expresi&oacute;n <code>if</code> no eval&uacute;a la parte then-part. Esto
-est&aacute; bien, desde que no necesita para hacer cualquier cosa para la
-variable <code>buffer</code> si es realmente un b&uacute;ffer.
-</p>
-<p>Por otro lado, cuando el valor de <code>buffer</code> no es un buffer en
-s&iacute;, pero el nombre de un buffer, el true-or-false-test
-devuelve cierto y la then-part de la expresi&oacute;n es evaluada. En este
-caso, la then-part es <code>(setq buffer (get-buffer buffer))</code>. Esta
-expresi&oacute;n usa la funci&oacute;n <code>get-buffer</code> para devolver un buffer
-actual en s&iacute;, dado su nombre. El <code>setq</code> entonces
-asigna la variable <code>buffer</code> al valor del buffer en
-s&iacute;, reemplazando su valor previo (que era el nombre del
-buffer).
-</p>
-<hr>
-<a name="Insertar-o"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#si-y-o" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Insertar-let" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-or-en-el-cuerpo"></a>
-<h3 class="subsection">5.2.4 El <code>or</code> en el cuerpo</h3>
-
-<p>El prop&oacute;sito de la expresi&oacute;n <code>or</code> en la funci&oacute;n
-<code>insert-buffer</code> es asegurar que el argumento <code>buffer</code> est&aacute;
-asociado a un b&uacute;ffer y no solo al nombre de un b&uacute;ffer. La secci&oacute;n
-previa muestra como el trabajo podr&iacute;a haber sido hecho
-usando una expresi&oacute;n <code>if</code>. Sin embargo, la funci&oacute;n
-<code>insert-buffer</code> actualmente usa <code>or</code>. Para comprender esto,
-es necesario comprender como <code>or</code> trabaja.
-</p>
-<a name="index-or"></a>
-<p>Una funci&oacute;n <code>or</code> puede tener cualquier n&uacute;mero de
-argumentos. Eso eval&uacute;a cada argumento en turno y devuelve el valor
-del primero de sus argumentos que no es <code>nil</code>. Tambi&eacute;n, y esto
-es una funcionalidad crucial de <code>or</code>, eso no eval&uacute;a cualquier
-argumentos subsiguientes despu&eacute;s devolviendo el primer valor
-no-<code>nil</code>.
-</p>
-<p>La expresi&oacute;n <code>or</code> se ve como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(or (bufferp buffer)
- (setq buffer (get-buffer buffer)))
-</pre></div>
-
-<p>El primer argumento a <code>or</code> es la expresi&oacute;n <code>(bufferp
-buffer)</code>. Esta expresi&oacute;n devuelve cierto (un valor no-<code>nil</code>) si
-el b&uacute;ffer es actualmente un b&uacute;ffer, y no solo el nombre de un
-b&uacute;ffer. En la expresi&oacute;n <code>or</code>, si este es el caso, la
-expresi&oacute;n <code>or</code> devuelve esto el valor cierto y no eval&uacute;a la
-siguiente expresi&oacute;n &mdash; y esto es bueno para nosotros, desde que
-nosotros no queremos hacer cualquier cosa al valor de <code>buffer</code> si
-eso es realmente un b&uacute;ffer.
-</p>
-<p>Por otro lado, si el valor de <code>(bufferp buffer)</code> es <code>nil</code>,
-que ser&aacute; si el valor de <code>buffer</code> es el nombre de un buffer, el
-int&eacute;rprete Lisp eval&uacute;a el siguiente elemento de la
-expresi&oacute;n. Esta es la expresi&oacute;n <code>(setq buffer (get-buffer
-buffer))</code>. Esta expresi&oacute;n devuelve un valor no-<code>nil</code>, que es el
-valor para el que asigna la variable <code>buffer</code> &mdash; y este valor es
-un b&uacute;ffer en s&iacute;, no el nombre de un b&uacute;ffer.
-</p>
-<p>El resultado de todo esto es que el s&iacute;mbolo
-<code>buffer</code> es siempre asociado a un b&uacute;ffer en s&iacute; en
-vez del nombre de un b&uacute;ffer. Toda es necesario porque la funci&oacute;n
-<code>set-buffer</code> en una l&iacute;nea siguiente trabaja con un
-buffer en s&iacute;, no con el nombre de un b&uacute;ffer.
-</p>
-<p>Incidentalmente, usando <code>or</code>, la situaci&oacute;n con el acomodador se
-ver&iacute;a as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(or (holding-on-to-guest) (find-and-take-arm-of-guest))
-</pre></div>
-
-<hr>
-<a name="Insertar-let"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Insertar-o" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Nuevo-insert_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-expresion-let-en-insert_002dbuffer"></a>
-<h3 class="subsection">5.2.5 La expresi&oacute;n <code>let</code> en <code>insert-buffer</code></h3>
-
-<p>Despu&eacute;s asegurando que la variable <code>buffer</code> se refiere a un
-buffer en s&iacute; y no solo al nombre de un buffer, la
-funci&oacute;n <code>insert-buffer</code> contin&uacute;a con una expresi&oacute;n
-<code>let</code>. Esto especifica tres variables locales, <code>start</code>,
-<code>end</code> y <code>newmark</code> y los asocia al valor inicial
-<code>nil</code>. Estas variables son usadas dentro del resto de <code>let</code>
-y temporalmente se oculta con cualquier otra ocurrencia de variables
-del mismo nombre en Emacs hasta el fin del <code>let</code>.
-</p>
-<p>El cuerpo del <code>let</code> contiene dos expresiones
-<code>save-excursion</code>. Primero, miraremos la expresi&oacute;n
-<code>save-excursion</code> en detalle. La expresi&oacute;n se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(save-excursion
- (set-buffer buffer)
- (setq start (point-min) end (point-max)))
-</pre></div>
-
-<p>La expresi&oacute;n <code>(set-buffer buffer)</code> cambia la atenci&oacute;n de
-Emacs desde el b&uacute;ffer actual a uno desde el que el texto ser&aacute;
-copiado. En este b&uacute;ffer las variables <code>start</code> y <code>end</code> se
-asignadan al principio y al fin del b&uacute;ffer, usando los comandos
-<code>point-min</code> y <code>point-max</code>. Note que tenemos
-aqu&iacute; una ilustraci&oacute;n de c&oacute;mo <code>setq</code> es capaz de
-asignar dos variables en la misma expresi&oacute;n. El primer argumento de
-<code>setq</code> es asignar al valor del segundo, y su tercer argumento
-est&aacute; asignado al valor del cuarto.
-</p>
-<p>Despu&eacute;s el cuerpo del <code>save-excursion</code> propio es evaluado, el
-<code>save-excursion</code> restaura el b&uacute;ffer original, pero <code>start</code>
-y <code>end</code> permanece asignado a los valores del principio y fin del
-b&uacute;ffer en el que el texto ser&aacute; copiado.
-</p>
-<p>La expresi&oacute;n por fuera <code>save-excursion</code> se ve como:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(save-excursion
- (<var>inner-</var><code>save-excursion</code><var>-expression</var>
- (<var>go-to-new-buffer-and-set-</var><code>start</code><var>-and-</var><code>end</code>)
- (insert-buffer-substring buffer start end)
- (setq newmark (point)))
-</pre></div>
-
-<p>La funci&oacute;n <code>insert-buffer-substring</code> copia el texto
-<em>dento</em> del b&uacute;ffer <em>desde</em> la regi&oacute;n indicada por
-<code>start</code> y <code>end</code> en el <code>b&uacute;ffer</code>. Desde el total del
-segundo b&uacute;ffer cae entre <code>start</code> y <code>end</code>, el todo del
-segundo b&uacute;ffer es copiado dentro del b&uacute;ffer que est&aacute;s
-editando. Lo siguiente, el valor del punto, que ser&aacute; al fin del
-texto insertado, es grabado en la variable <code>newmark</code>.
-</p>
-<p>Despu&eacute;s el cuerpo de <code>save-excursion</code> es evaluado, punto y
-marca son recolocados a sus lugares originales.
-</p>
-<p>Sin embargo, es conveniente localizar una marca al fin del texto
-nuevamente insertado y localizar el punto al principio. La variable
-<code>newmark</code> graba el fin del texto insertado. En la &uacute;ltima
-l&iacute;nea de la expresi&oacute;n <code>let</code>, la expresi&oacute;n de la
-funci&oacute;n <code>(push-mark newmark)</code> asigna una marca a esta
-posici&oacute;n. (La posici&oacute;n previa de la marca est&aacute;
-todav&iacute;a accesible; est&aacute; grabado en la marca del anillo
-y se puede regresar a eso con <kbd>C-u C-&lt;SPC&gt;</kbd>.) Mientras tanto,
-el punto est&aacute; localizado al principio del texto insertado, que
-est&aacute; donde estaba antes de ser llamado la funci&oacute;n que inserta, la
-posici&oacute;n de lo que estaba guardado por la primera <code>save-excursion</code>.
-</p>
-<p>La expresi&oacute;n <code>let</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let (start end newmark)
- (save-excursion
- (save-excursion
- (set-buffer buffer)
- (setq start (point-min) end (point-max)))
- (insert-buffer-substring buffer start end)
- (setq newmark (point)))
- (push-mark newmark))
-</pre></div>
-
-<p>Como la funci&oacute;n <code>append-to-buffer</code>, la funci&oacute;n
-<code>insert-buffer</code> usa <code>let</code>, <code>save-excursion</code> y
-<code>set-buffer</code>. Adem&aacute;s, la funci&oacute;n ilustra un camino para usar
-<code>o</code>. Toda estas funciones est&aacute;n construyendo el bloque que
-se encontrar&aacute;n y usar&aacute;n una y otra vez.
-</p>
-<hr>
-<a name="Nuevo-insert_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Insertar-let" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#insert_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#beginning_002dof_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Nuevo-cuerpo-para-insert_002dbuffer"></a>
-<h3 class="subsection">5.2.6 Nuevo cuerpo para <code>insert-buffer</code></h3>
-<a name="index-insert_002dbuffer_002c-nueva-version-del-cuerpo"></a>
-<a name="index-nueva-version-cuerpo-para-insert_002dbuffer"></a>
-
-<p>El cuerpo en la versi&oacute;n de GNU Emacs 22 es m&aacute;s confuso que en el
-original.
-</p>
-<p>Consiste de dos expresiones
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (push-mark
- (save-excursion
- (insert-buffer-substring (get-buffer buffer))
- (point)))
-
- nil
-</pre></div>
-
-<p>excepto, y esto es lo que los novicios confunden, un trabajo muy
-importante es hecho dentro de la expresi&oacute;n <code>push-mark</code>.
-</p>
-<p>La funci&oacute;n <code>get-buffer</code> devuelve un b&uacute;ffer con el nombre
-proporcionado. Se tomar&aacute; nota de que la funci&oacute;n <em>no</em> se
-llama <code>get-buffer-create</code>; eso no crea un b&uacute;ffer si uno no
-existe ya. El b&uacute;ffer devuelto por <code>get-buffer</code>, un b&uacute;ffer
-existente, es pasado a <code>insert-buffer-substring</code>, que inserta el
-total del b&uacute;ffer (desde que no se especific&oacute;n ninguna cosa
-m&aacute;s).
-</p>
-<p>La posici&oacute;n dentro del buffer es insertado es grabado por
-<code>push-mark</code>. Entonces la funci&oacute;n devuelve <code>nil</code>, el valor
-de su &uacute;ltimo comando. Pon otro camino, la funci&oacute;n
-<code>insert-buffer</code> existe solo para producir un efecto lateral,
-insertando otro buffer, no para devolver cualquier valor.
-</p>
-<hr>
-<a name="beginning_002dof_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Nuevo-insert_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Argumentos-opcionales" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Definicion-completa-de-beginning_002dof_002dbuffer"></a>
-<h2 class="section">5.3 Definici&oacute;n completa de <code>beginning-of-buffer</code></h2>
-<a name="index-beginning_002dof_002dbuffer"></a>
-
-<p>La estructura b&aacute;sica de la funci&oacute;n <code>beginning-of-buffer</code> ya
-ha sido discutida. (V&eacute;ase la secci&oacute;n <a href="#simplified_002dbeginning_002dof_002dbuffer">Una Definici&oacute;n Simplificada <code>beginning-of-buffer</code></a>). Esta secci&oacute;n
-describe la parte compleja de la definici&oacute;n.
-</p>
-<p>Como se describe previamente, cuando se invoca sin un argumento,
-<code>beginning-of-buffer</code> mueve el cursor al principio del b&uacute;ffer
-(en realidad, al principio de la porci&oacute;n accesible del b&uacute;ffer),
-dejando la marca en la posici&oacute;n previa. Sin embargo, cuando el
-comando es invocado con un n&uacute;mero entre uno y diez, la funci&oacute;n
-considera que n&uacute;mero ser&aacute; una fracci&oacute;n del tama&ntilde;o del
-b&uacute;ffer, medido en decenas, y Emacs mueve el cursor en esta
-fracci&oacute;n del camino desde el principio del b&uacute;ffer. De este modo,
-se puede o bien llamar a esta funci&oacute;n con la tecla comando <kbd>M-&lt;</kbd>,
-que mover&aacute; el cursor al principio del b&uacute;ffer, o con una tecla tal
-como <kbd>C-u 7 M-&lt;</kbd> que mover&aacute; el cursor a un punto 70% del camino
-a trav&eacute;s del b&uacute;ffer. Si un n&uacute;mero m&aacute;s grande de diez es usado
-para el argumento que se mueve al final del b&uacute;ffer.
-</p>
-<p>La funci&oacute;n <code>beginning-of-buffer</code> puede ser llamada con o sin
-argumentos. El uso del argumento es opcional.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Argumentos-opcionales">5.3.1 Argumentos opcionales</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#beginning_002dof_002dbuffer-opt-arg">5.3.2 <code>beginning-of-buffer</code> con un argumento</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo con argumento opcional.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Completo-beginning_002dof_002dbuffer">5.3.3 El <code>beginning-of-buffer</code> completo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Completo beginning-of-buffer
-</td></tr>
-</table>
-
-<hr>
-<a name="Argumentos-opcionales"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#beginning_002dof_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#beginning_002dof_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#beginning_002dof_002dbuffer-opt-arg" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Argumentos-opcionales-1"></a>
-<h3 class="subsection">5.3.1 Argumentos opcionales</h3>
-
-<p>A menos que se cuente de otro modo, Lisp espera que una funci&oacute;n con
-un argumento en su definici&oacute;n de funci&oacute;n se llame con un valor
-para este argumento. Si esto no ocurre, se obtiene un error y un
-mensaje que dice &lsquo;<samp>N&uacute;mero de argumentos err&oacute;neo</samp>&rsquo;.
-</p>
-<a name="index-Argumentos-Opcionales"></a>
-<a name="index-Palabra-Clave"></a>
-<a name="index-opcional"></a>
-<p>Sin embargo, los argumentos opcionales son una funcionalidad de Lisp:
-una <em>palabra clave</em> particular es usada para contar al
-int&eacute;rprete Lisp que un argumento es opcional. La palabra clave es
-<code>&amp;optional</code>. (El &lsquo;<samp>&amp;</samp>&rsquo; en frente de &lsquo;<samp>opcional</samp>&rsquo; es parte
-de la palabra clave.) En una definici&oacute;n de funci&oacute;n, si un
-argumento sigue a la palabra clave <code>&amp;optional</code>, ning&uacute;n valor
-necesita ser pasado a este argumento cuando la funci&oacute;n se llama.
-</p>
-<p>La primera l&iacute;nea de la definici&oacute;n de funci&oacute;n de
-<code>beginning-of-buffer</code> tiene lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun beginning-of-buffer (&amp;optional arg)
-</pre></div>
-
-<p>En el &quot;outline&quot; (esquema), la funci&oacute;n completa se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun beginning-of-buffer (&amp;optional arg)
- &quot;<var>documentation</var>&hellip;&quot;
- (interactive &quot;P&quot;)
- (or (<var>is-the-argument-a-cons-cell</var> arg)
- (and <var>are-both-transient-mark-mode-and-mark-active-true</var>)
- (push-mark))
- (let (<var>determine-size-and-set-it</var>)
- (goto-char
- (<var>if-there-is-an-argument</var>
- <var>figure-out-where-to-go</var>
- <var>else-go-to</var>
- (point-min))))
- <var>do-nicety</var>
-</pre></div>
-
-<p>La funci&oacute;n es similar a la funci&oacute;n
-<code>simplified-beginning-of-buffer</code> excepto que la expresi&oacute;n
-<code>interactive</code> tiene <code>&quot;P&quot;</code> como un argumento y la funci&oacute;n
-<code>goto-char</code> es seguida por una expresi&oacute;n if-then-else que
-figura donde poner el cursor si hay un argumento que no es un cons cell.
-</p>
-<p>(Puesto que no se explica un cons cell en muchos
-cap&iacute;tulos, por favor, considere ignorar la funci&oacute;n
-<code>consp</code>. <a href="#Implementaci_00f3n-de-listas">C&oacute;mo las Listas son Implementadas</a>, y <a href="elisp.html#Tipo-de-Cons-Cell">Cons Cell y Tipos de Listas</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>).
-</p>
-<p>El <code>&quot;P&quot;</code> en la expresi&oacute;n <code>interactive</code> cuenta a Emacs
-c&oacute;mo pasar un argumento prefijo, si hay uno, a la funci&oacute;n en forma
-plana. Un argumento prefijo se crea escribiendo la tecla &lt;META&gt;
-seguida por un n&uacute;mero, o escribiendo <kbd>C-u</kbd> y entonces un
-n&uacute;mero. (Si no escribes un n&uacute;mero, <kbd>C-u</kbd> por defecto a un cons
-cell con un 4. Una min&uacute;scula <code>&quot;p&quot;</code> en la expresi&oacute;n
-<code>interactive</code> causa a la funci&oacute;n convertir un argumento prefijo
-a un n&uacute;mero.)
-</p>
-<p>El true-or-false-test de la expresi&oacute;n <code>if</code> se ve compleja, pero
-no lo es: se chequea si <code>arg</code> tiene un valor que no es <code>nil</code>
-y si es un cons cell. (Esto es lo que <code>consp</code> hace; chequea si su
-argumento es un cons cell.) Si <code>arg</code> tiene un valor que no es
-<code>nil</code> (y no es un cons cell.), que ser&aacute; el caso si
-<code>beginning-of-buffer</code> se llama con un argumento, entonces este
-true-or-false-test devolver&aacute; cierto y la then-part de la expresi&oacute;n
-<code>if</code> falsa. Por otro lado, si <code>beginning-of-bufer</code> no se
-llama con un argumento, el valor de <code>arg</code> ser&aacute; <code>nil</code> y la
-else-part de la expresi&oacute;n <code>if</code> se evaluar&aacute;. La else-part es
-simple <code>point-min</code>, y esto es lo de fuera, la expresi&oacute;n
-<code>goto-char</code> es <code>(goto-char (point-min))</code>, que es c&oacute;mo se
-vi&oacute; la funci&oacute;n <code>beginning-of-buffer</code> en su forma
-simplificada.
-</p>
-<hr>
-<a name="beginning_002dof_002dbuffer-opt-arg"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Argumentos-opcionales" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#beginning_002dof_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Desenmara_00f1ar-beginning_002dof_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="beginning_002dof_002dbuffer-con-un-argumento"></a>
-<h3 class="subsection">5.3.2 <code>beginning-of-buffer</code> con un argumento</h3>
-
-<p>Cuando <code>beginning-of-buffer</code> se llama con un argumento, una
-expresi&oacute;n es evaluada que calcula que valor pasa a
-<code>goto-char</code>. Esto es incluso complicado a primera vista. Eso
-incluye una expresi&oacute;n <code>if</code> propia y mucha aritm&eacute;tica. Se ve
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (&gt; (buffer-size) 10000)
- ;; <span class="roman">&iexcl;Evitar sobrecarga para grandes tama&ntilde;os de b&uacute;ffer!</span>
- (* (prefix-numeric-value arg)
- (/ size 10))
- (/
- (+ 10
- (*
- size (prefix-numeric-value arg))) 10)))
-</pre></div>
-
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Desenmara_00f1ar-beginning_002dof_002dbuffer">Desenmara&ntilde;ar <code>beginning-of-buffer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Desenmara&ntilde;ar beginning-of-buffer
-</td></tr>
-<tr><td align="left" valign="top"><a href="#El-caso-del-buffer-largo">Qu&eacute; ocurre en un b&uacute;ffer largo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El caso del buffer largo
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Peque_00f1o-caso-de-b_00faffer">Qu&eacute; ocurre en un b&uacute;ffer peque&ntilde;o</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Peque&ntilde;o caso de b&uacute;ffer
-</td></tr>
-</table>
-
-<hr>
-<a name="Desenmara_00f1ar-beginning_002dof_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#beginning_002dof_002dbuffer-opt-arg" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#beginning_002dof_002dbuffer-opt-arg" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#El-caso-del-buffer-largo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Desenmaranar-beginning_002dof_002dbuffer"></a>
-<h4 class="unnumberedsubsubsec">Desenmara&ntilde;ar <code>beginning-of-buffer</code></h4>
-
-<p>Como otras expresiones que se ven complejas, la expresi&oacute;n
-condicional con <code>beginning-of-buffer</code> puede ser desenredada
-mir&aacute;ndola por partes de una plantilla, en este caso, la plantilla
-par una expresi&oacute;n if-then-else. En forma esquel&eacute;tica, la
-expresi&oacute;n se ve as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (<var>buffer-is-large</var>
- <var>divide-buffer-size-by-10-and-multiply-by-arg</var>
- <var>else-use-alternate-calculation</var>
-</pre></div>
-
-<p>El true-or-fase-test de esta expresi&oacute;n <code>if</code> propia chequea el
-tama&ntilde;o del buffer. La raz&oacute;n para esto es que la versi&oacute;n vieja de
-Emacs 18 usaba n&uacute;meros que no son m&aacute;s grandes que 8 millones o
-as&iacute; y en la computaci&oacute;n que segu&iacute;a, el
-programador tem&iacute;a que Emacs podr&iacute;a
-intentar usar a trav&eacute;s de largos n&uacute;meros si el b&uacute;ffer fuera
-largo. El t&eacute;rmino &lsquo;sobrecarga&rsquo;, que se mencion&oacute; en el comentario,
-significa que los n&uacute;meros son grandes. Las versiones m&aacute;s recientes
-de Emacs usan n&uacute;meros largos, pero este c&oacute;digo no ha sido tocado,
-solo porque la gente ahora mira en b&uacute;ffers que est&aacute;n lejos, tan
-lejos como antes.
-</p>
-<p>Hay dos casos: si el b&uacute;ffer es largo, o si no.
-</p>
-<hr>
-<a name="El-caso-del-buffer-largo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Desenmara_00f1ar-beginning_002dof_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#beginning_002dof_002dbuffer-opt-arg" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Peque_00f1o-caso-de-b_00faffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Que-ocurre-en-un-buffer-largo"></a>
-<h4 class="unnumberedsubsubsec">Qu&eacute; ocurre en un b&uacute;ffer largo</h4>
-
-<p>En <code>beginning-of-buffer</code>, la expresi&oacute;n propia <code>if</code> chequea
-si el tama&ntilde;o del b&uacute;ffer es mayor que 10000 caracteres. Para hacer
-esto, se usa la funci&oacute;n <code>&gt;</code> y la computaci&oacute;n de <code>size</code>
-que viene desde la expresi&oacute;n let.
-</p>
-<p>Hace tiempo, se usaba la funci&oacute;n <code>buffer-size</code>. No solo esta
-funci&oacute;n era llamada varias veces, eso daba el tama&ntilde;o del b&uacute;ffer
-completo, no la parte accesible. La computaci&oacute;n tiene mucho m&aacute;s
-sentido cuando se maneja solo la parte accesible. (V&eacute;ase la secci&oacute;n <a href="#Encogiendo-y-extendiendo">Encogiendo y extendiendo</a>, para m&aacute;s informaci&oacute;n en
-focalizar la atenci&oacute;n para una parte &lsquo;accesible&rsquo;.)
-</p>
-<p>La l&iacute;nea se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (&gt; size 10000)
-</pre></div>
-
-<p>Cuando el b&uacute;ffer es largo, el then-part de la expresi&oacute;n <code>if</code>
-se eval&uacute;a. Eso se lee as&iacute; (despu&eacute;s de ser formateado
-para una f&aacute;cil lectura):
-</p>
-<div class="smallexample">
-<pre class="smallexample">(*
- (prefix-numeric-value arg)
- (/ size 10))
-</pre></div>
-
-<p>Esta expresi&oacute;n es una multiplicaci&oacute;n, con dos argumentos para la
-funci&oacute;n <code>*</code>.
-</p>
-<p>El primer argumento es <code>(prefix-numeric-value arg)</code>. Cuando
-<code>&quot;P&quot;</code> se usa como argumento para <code>interactive</code>, el valor
-pasado para la funci&oacute;n como argumento es un &ldquo;argumento prefijo
-crudo&rdquo;, y no un n&uacute;mero. (Es un n&uacute;mero en una lista). Para
-desarrollar la aritm&eacute;tica, una conversi&oacute;n es necesaria, y
-<code>prefix-numeric-value</code> hace el trabajo.
-</p>
-<a name="index-_002f-_0028division_0029"></a>
-<a name="index-Division"></a>
-<p>El segundo argumento es <code>(/ size 10)</code>. Esta expresi&oacute;n divide el
-valor num&eacute;rico por diez &mdash; el valor num&eacute;rico del tama&ntilde;o de la
-porci&oacute;n accesible del b&uacute;ffer. Esto produce un n&uacute;mero que cuenta
-cu&aacute;ntos caracteres crean una decena del tama&ntilde;o del b&uacute;ffer. (En Lisp,
-<code>/</code> es usado para divisi&oacute;n, solo como <code>*</code> es usado para
-multiplicaci&oacute;n.)
-</p>
-<p>En la expresi&oacute;n de la multiplicaci&oacute;n como un todo, esta cantidad
-se multiplica por el valor del argumento prefijo &mdash; la
-multiplicaci&oacute;n se parece a:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(* <var>numeric-value-of-prefix-arg</var>
- <var>number-of-characters-in-one-tenth-of-the-accessible-buffer</var>)
-</pre></div>
-
-<p>Si, por ejemplo, el argumento prefijo es &lsquo;<samp>7</samp>&rsquo;, el valor one-tenth
-ser&aacute; multiplicado por 7 para dar una posici&oacute;n del 70% del camino.
-</p>
-<p>El resultado de todo esto es que si la porci&oacute;n accesible del b&uacute;ffer
-es largo, la expresi&oacute;n <code>goto-char</code> se lee esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(goto-char (* (prefix-numeric-value arg)
- (/ size 10)))
-</pre></div>
-
-<p>Esto pone el cursor donde se quiere.
-</p>
-<hr>
-<a name="Peque_00f1o-caso-de-b_00faffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#El-caso-del-buffer-largo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#beginning_002dof_002dbuffer-opt-arg" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Completo-beginning_002dof_002dbuffer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Que-ocurre-en-un-buffer-pequeno"></a>
-<h4 class="unnumberedsubsubsec">Qu&eacute; ocurre en un b&uacute;ffer peque&ntilde;o</h4>
-
-<p>Si el b&uacute;ffer contiene poco m&aacute;s de 10000 caracteres, una
-computaci&oacute;n ligeramente diferente es medida. Se podr&iacute;a
-pensar que esto no es necesario, desde que la primera computaci&oacute;n
-podr&iacute;a hacer el trabajo. Sin embargo, en un b&uacute;ffer
-peque&ntilde;o, el primer m&eacute;todo puede no poner el cursor en la
-l&iacute;nea exactamente deseada; el segundo m&eacute;todo hace un
-trabajo mejor.
-</p>
-<p>El c&oacute;digo se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(/ (+ 10 (* size (prefix-numeric-value arg))) 10))
-</pre></div>
-
-<p>Este es el c&oacute;digo en el que se ve qu&eacute; ocurre descubriendo como las
-funciones se embeben entre par&eacute;ntesis. Eso es f&aacute;cil de leer si se
-reformatea con cada expresi&oacute;n indentada m&aacute;s profundamente que la
-expresi&oacute;n que encierra:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (/
- (+ 10
- (*
- size
- (prefix-numeric-value arg)))
- 10))
-</pre></div>
-
-<p>Mirando los par&eacute;ntesis, se ve que la operaci&oacute;n propia es
-<code>(prefix-numeric-value arg)</code>, que convierte el argumento plano
-para un n&uacute;mero. En la siguiente expresi&oacute;n, este n&uacute;mero es
-multiplicado por el tama&ntilde;o de la porci&oacute;n accesible del b&uacute;ffer:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(* size (prefix-numeric-value arg))
-</pre></div>
-
-<p>Esta multiplicaci&oacute;n crea un n&uacute;mero que puede ser m&aacute;s largo que
-el tama&ntilde;o del buffer &mdash; siete veces m&aacute;s larga si el argumento es
-7, por ejemplo. Diez se a&atilde;nade a &eacute;ste n&#361;mero y finalmente el
-n&uacute;mero es dividido por 10 para proporcionar un valor que es un
-car&aacute;cter m&aacute;s largo que la posici&oacute;n de porcentaje en el b&uacute;ffer.
-</p>
-<p>El n&uacute;mero que resulta de todo esto se pasa a <code>goto-char</code> y
-el cursor se mueve a este punto.
-</p>
-<hr>
-<a name="Completo-beginning_002dof_002dbuffer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Peque_00f1o-caso-de-b_00faffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#beginning_002dof_002dbuffer" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Revisar-el-segundo-b_00faffer-relacionado" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-beginning_002dof_002dbuffer-completo"></a>
-<h3 class="subsection">5.3.3 El <code>beginning-of-buffer</code> completo</h3>
-
-<p>Aqu&iacute; est&aacute; el texto completo de la funci&oacute;n
-<code>beginning-of-buffer</code>:
-</p><br>
-
-<div class="smallexample">
-<pre class="smallexample">(defun beginning-of-buffer (&amp;optional arg)
- &quot;Mueve el punto al principio del buffer;
-deja marca en la posici&oacute;n previa.
-Con prefijo \\[universal-argument],
-no se asigna una marca en la posici&oacute;n previa.
-Con el argumento num&eacute;rico N, pon el
-punto N/10 del camino desde el principio.
-
-Si el b&uacute;ffer est&aacute; encogido
-este comando usa el principio y tama&ntilde;o
-de la parte accesible del b&uacute;ffer.
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">&iexcl;No use este comando en programas Lisp!
-\(goto-char (point-min)) es r&aacute;pido
-y evita poseer la marca.&quot;
- (interactive &quot;P&quot;)
- (or (consp arg)
- (and transient-mark-mode mark-active)
- (push-mark))
-</pre><pre class="smallexample"> (let ((size (- (point-max) (point-min))))
- (goto-char (if (and arg (not (consp arg)))
- (+ (point-min)
- (if (&gt; size 10000)
- ;; &iexcl;Evita sobrecarga para grandes tama&ntilde;os de b&uacute;ffer!
- (* (prefix-numeric-value arg)
- (/ size 10))
- (/ (+ 10 (* size (prefix-numeric-value arg)))
- 10)))
- (point-min))))
- (if arg (forward-line 1)))
-</pre></div>
-
-
-<p>Excepto por dos peque&ntilde;os puntos, la discusi&oacute;n previa muestra
-c&oacute;mo esta funci&oacute;n trabaja. El primer punto trata un detalle en la
-cadena de documentaci&oacute;n, y el segundo concierne la &uacute;ltima
-l&iacute;nea de la funci&oacute;n.
-</p>
-<p>En la cadena de documentaci&oacute;n, hay referencia a una expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">\\[universal-argument]
-</pre></div>
-
-<p>Un &lsquo;<samp>\\</samp>&rsquo; es usado antes de la primera llave de esta
-expresi&oacute;n. Este &lsquo;<samp>\\</samp>&rsquo; le cuenta al int&eacute;rprete Lisp sustituir
-qu&eacute; clave est&aacute; actualmente emparejada a los &lsquo;<samp>[&hellip;]</samp>&rsquo;. En el
-caso de <code>universal-argument</code>, que es normalmente <kbd>C-u</kbd>, pero
-eso podr&iacute;a ser diferente. (See <a href="elisp.html#Consejos-de-Documentaci_00f3n">Consejos para Cadenas de Documentaci&oacute;n</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>, para m&aacute;s informaci&oacute;n.)
-</p>
-<p>Finalmente, la &uacute;ltima l&iacute;nea del comando
-<code>beginning-of-buffer</code> dice mover el punto al principio de la
-siguiente l&iacute;nea si el comando es invocado con un argumento:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if arg (forward-line 1)))
-</pre></div>
-
-<p>Esto pone el cursor al principio de la primera l&iacute;nea
-despu&eacute;s de las apropiadas decenas de posiciones en el b&uacute;ffer. Esto
-significa que el cursor est&aacute; siempre localizado <em>al menos</em> las
-decenas solicitadas del camino a trav&eacute;s del b&uacute;ffer, que es un bien
-que es, quiz&aacute;s, no necesario, pero que, si no ocurri&oacute;,
-estar&iacute;a seguro de dibujar rumores.
-</p>
-<p>Por otro lado, eso significa que si se especifica el comando con un
-<kbd>C-u</kbd>, sin un n&uacute;mero, que es decir, si el &lsquo;prefijo de argumento
-plano&rsquo; es simplemente un cons cell, entonces el comando te pone al
-principio de la segunda l&iacute;nea &hellip; no s&eacute; si este se
-pretende ning&uacute;n trato con el c&oacute;digo para evitar que esto ocurre.
-</p>
-<hr>
-<a name="Revisar-el-segundo-b_00faffer-relacionado"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Completo-beginning_002dof_002dbuffer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-opcional" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Revisar-1"></a>
-<h2 class="section">5.4 Revisar</h2>
-
-<p>Aqu&iacute; hay un breve resumen de los asuntos cubierto en
-este cap&iacute;tulo.
-</p>
-<dl compact="compact">
-<dt><code>or</code></dt>
-<dd><p>Eval&uacute;a cada argumento en secuencia, y devuelve el valor del primer
-argumento que no es <code>nil</code>, si ninguno devuelve un valor que no es
-<code>nil</code>, devuelve <code>nil</code>. En breve, devuelve el primer valor de
-verdad de los argumento; devuelve un valor cierto si un <em>or</em>
-cualquier de los otros son verdad.
-</p>
-</dd>
-<dt><code>and</code></dt>
-<dd><p>Eval&uacute;a cada argumento en secuencia, y si cualquiera es <code>nil</code>,
-devuelve <code>nil</code>; si ninguno es <code>nil</code>, devuelve el valor del
-&uacute;ltimo argumento. En breve, devuelve un valor cierto solo si todos
-los argumentos cierto; devuelve un valor cierto si un <em>and</em> cada
-uno de los otros son ciertos.
-</p>
-</dd>
-<dt><code>&amp;optional</code></dt>
-<dd><p>Una palabra clave usaba para indicar que un argumento a una
-definici&oacute;n de funci&oacute;n es opcional; esto significa que la funci&oacute;n
-puede ser evaluado sin el argumento, si se desea.
-</p>
-</dd>
-<dt><code>prefix-numeric-value</code></dt>
-<dd><p>Convierte el &lsquo;argumento prefijo plano&rsquo; producido por
-<code>(interactive &quot;P&quot;)</code> a un valor num&eacute;rico.
-</p>
-</dd>
-<dt><code>forward-line</code></dt>
-<dd><p>Mueve el punto hacia delante al principio de la siguiente
-l&iacute;nea, o si el argumento es m&aacute;s de uno, hacia delante
-varias l&iacute;neas. Si eso no se puede mover tan lejos
-hacia delante como se puede, <code>forward-line</code> va hacia delante tan
-lejos como se puede y entonces devuelve un contaje del n&uacute;mero de
-l&iacute;neas adicionales que no pudo moverse.
-</p>
-</dd>
-<dt><code>erase-buffer</code></dt>
-<dd><p>Borra todos los contenidos del b&uacute;ffer actual.
-</p>
-</dd>
-<dt><code>bufferp</code></dt>
-<dd><p>Devuelve <code>t</code> si su argumento es un b&uacute;ffer; de otro modo
-devuelve <code>nil</code>.
-</p></dd>
-</dl>
-
-<hr>
-<a name="Ejercicio-opcional"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Revisar-el-segundo-b_00faffer-relacionado" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicio-de-argumento-opcional"></a>
-<h2 class="section">5.5 Ejercicio de argumento <code>opcional</code></h2>
-
-<p>Escribe una funci&oacute;n interactiva con un argumento opcional que
-chequee si su argumento, un n&uacute;mero, es mayor o igual, o al menos,
-menos que el valor de <code>fill-column</code>, y lo escribe, en un
-mensaje. Sin embargo, si no se pasa un argumento a la funci&oacute;n, usa
-56 como un valor por defecto.
-</p>
-<hr>
-<a name="Encogiendo-y-extendiendo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#M_00e1s-complejidad" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-opcional" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ventajas-de-encoger" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Encogiendo-y-extendiendo-1"></a>
-<h1 class="chapter">6 Encogiendo y extendiendo</h1>
-<a name="index-Focalizando-atencion-_0028encogiendo_0029"></a>
-<a name="index-Encogiendo"></a>
-<a name="index-Ampliando"></a>
-
-<p>Encoger es una funcionalidad de Emacs que hace posible focalizar en
-una parte espec&iacute;fica de un b&uacute;ffer, y funcionar sin
-cambiar accidentalmente otras partes. Encoger normalmente se
-deshabilita puesto que puede confundir a novatos.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Ventajas-de-encoger">Las ventajas de encoger</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#save_002drestriction">6.1 La forma especial <code>save-restriction</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#what_002dline">6.2 <code>what-line</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El n&uacute;mero de la l&iacute;nea que
- apunta est&aacute; activa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-narrow">6.3 Ejercicio de encoger</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio narrow
-</td></tr>
-</table>
-
-<hr>
-<a name="Ventajas-de-encoger"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#save_002drestriction" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Las-ventajas-de-encoger"></a>
-<h2 class="unnumberedsec">Las ventajas de encoger</h2>
-
-<p>Con encoger, el resto del b&uacute;ffer se hace invisible, como si no
-estuviera. Esto es una ventaja si, por ejemplo, se quiere reemplazar
-una palabra en una parte del b&uacute;ffer pero no otro: se encoge la parte
-que se quiere y el reemplazo se trae solo en esta secci&oacute;n, no en
-el resto del b&uacute;ffer. Las b&uacute;squedas solo funcionar&aacute;n con una
-regi&oacute;n encogida, no fuera de una, as&iacute; si tu est&aacute;s
-arreglando una parte de un documento, se puede guardar en
-s&iacute; desde encontrar partes accidentalmente que no
-necesitas arreglar encongiendo solo la regi&oacute;n que quieres. (La tecla
-asociada a <code>narrow-to-region</code> es <kbd>C-x n n</kbd>.)
-</p>
-<p>Sin embargo, encoger hace que el resto del b&uacute;ffer sea invisible,
-esto puede asustar a gente quien inadvertidamente invoca a encoger y
-pensar que se ha borrado una parte de su fichero. M&aacute;s all&aacute;, el
-comando <code>undo</code> (que es normalmente emparejado a <kbd>C-x u</kbd>) no
-se deja encoger, as&iacute; las personas pueden llegar a estar
-bastante desesperadas si no conocen que ellas pueden volver al resto
-de un b&uacute;ffer para visibilizarlo con el comando <code>widen</code>. (El
-emparejamiento de la tecla para <code>widen</code> es <kbd>C-x n w</kbd>.)
-</p>
-<p>Encoger es tan &uacute;til al int&eacute;rprete Lisp como para las personas. Con
-frecuencia, una funci&oacute;n Emacs Lisp est&aacute; dise&ntilde;ada para trabajar
-en solo parte de un b&uacute;ffer; o de manera conversa, una funci&oacute;n
-Emacs Lisp necesita trabajar en todo un b&uacute;ffer que ha sido
-encogido. La funci&oacute;n <code>what-line</code>, por ejemplo, borra el
-encogimiento desde un b&uacute;ffer, si eso tiene cualquier encogimiento y
-cuando eso ha finalizado su trabajo, restaura el encogimiento
-que haya. Por otro lado, la funci&oacute;n <code>count-lines</code>, que es
-llamada por <code>what-line</code>, usa el encogimiento para restringirse a
-s&iacute; misma solo a la porci&oacute;n del b&uacute;ffer en el que
-se est&aacute; interesado y entonces restaura la situaci&oacute;n previa.
-</p>
-<hr>
-<a name="save_002drestriction"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ventajas-de-encoger" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#what_002dline" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-forma-especial-save_002drestriction"></a>
-<h2 class="section">6.1 La forma especial <code>save-restriction</code></h2>
-<a name="index-save_002drestriction"></a>
-
-<p>En Emacs Lisp, se puede usar la forma especial <code>save-restriction</code>
-para guardar la traza siempre que el encogimiento est&eacute; en
-efecto. Cuando el int&eacute;rprete Lisp se encuentra con
-<code>save-restriction</code>, eso ejecuta el c&oacute;digo en el cuerpo de la
-expresi&oacute;n <code>save-restriction</code>, y entonces deshace cualquier
-cambio para encoger lo que el c&oacute;digo caus&oacute;. Si, por ejemplo, el
-b&uacute;ffer est&aacute; encogido y el c&oacute;digo que sigue al comando
-<code>save-restriction</code> devuelve el b&uacute;ffer para su regi&oacute;n
-encogida. En el comando <code>what-line</code>, cualquier encogimiento del
-b&uacute;ffer que se puede tener se deshace por el comando <code>widen</code> que
-inmediatamente sigue el comando <code>save-restriction</code>. Cualquier
-encogimiento original es restaurado solo antes de la compleci&oacute;n de
-la funci&oacute;n.
-</p>
-<p>La plantilla para una expresi&oacute;n <code>save-restriction</code> es simple:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(save-restriction
- <var>body</var>&hellip; )
-</pre></div>
-
-<p>El cuerpo del <code>save-restriction</code> es una o m&aacute;s expresiones que
-ser&aacute;n evaluadas en secuencia por el int&eacute;rprete Lisp.
-</p>
-<p>Finalmente, un punto a anotar: cuando se usa tanto
-<code>save-excursion</code> y <code>save-restriction</code>, uno correcto
-despu&eacute;s del otro, deber&iacute;as usar <code>save-excursion</code>
-fuera. Si se escribe en el orden inverso, se podr&iacute;a
-fallar para grabar el encogimiento en el b&uacute;ffer para el que Emacs
-cambia despu&eacute;s de llamar a <code>save-excursion</code>. De este modo, cuando
-se escribe junto a <code>save-excursion</code> y <code>save-restriction</code>
-ser&iacute;a escrito as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(save-excursion
- (save-restriction
- <var>body</var>&hellip;))
-</pre></div>
-
-<p>En otras circunstancias, cuando no se escribe junto, las formas
-especiales <code>save-excursion</code> y <code>save-restriction</code> deben ser
-escritas en el orden apropiado para la funci&oacute;n.
-</p>
-<p>Por ejemplo,
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (save-restriction
- (widen)
- (save-excursion
- <var>body</var>&hellip;))
-</pre></div>
-
-
-<hr>
-<a name="what_002dline"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#save_002drestriction" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-narrow" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="what_002dline-1"></a>
-<h2 class="section">6.2 <code>what-line</code></h2>
-<a name="index-what_002dline"></a>
-<a name="index-Extendiendo_002c-ejemplo-de"></a>
-
-<p>El comando <code>what-line</code> cuenta el n&uacute;mero de la
-l&iacute;nea en la que el cursor se ha localizado. La
-funci&oacute;n ilustra el uso de los comandos <code>save-restriction</code> y
-<code>save-excursion</code>. Aqu&iacute; est&aacute; el texto original de
-la funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun what-line ()
- &quot;Imprime el n&uacute;mero de l&iacute;nea actual (en el b&uacute;ffer)
- del punto.&quot;
- (interactive)
- (save-restriction
- (widen)
- (save-excursion
- (beginning-of-line)
- (message &quot;L&iacute;nea %d&quot;
- (1+ (count-lines 1 (point)))))))
-</pre></div>
-
-<p>(En versiones recientes de GNU Emacs, la funci&oacute;n <code>what-line</code> se
-ha expandido para contar el n&uacute;mero de l&iacute;neas en un
-b&uacute;ffer encogido tan bien como el n&uacute;mero de l&iacute;neas en
-un b&uacute;ffer ampliado. La versi&oacute;n reciente es m&aacute;s compleja que la
-versi&oacute;n que se muestra. Alguien sinti&eacute;ndose venturoso,
-podr&iacute;a querer mirarla despu&eacute;s de entender como esta
-versi&oacute;n funciona. Probablemente se necesitar&aacute; usar <kbd>C-h f</kbd>
-(<code>describe-function</code>). La versi&oacute;n nueva usa un condicional para
-determinar si el b&uacute;ffer se ha encogido.
-</p>
-<p>(Tambi&eacute;n, eso usa <code>line-number-at-pos</code>, que otras expresiones
-simples, tales como <code>(goto-char (point-min))</code>, mueve el punto al
-principio de la l&iacute;nea actual con <code>(forward-line 0)</code>
-en vez de <code>beginning-of-line</code>.)
-</p>
-<p>La funci&oacute;n <code>what-line</code> como se muestra aqu&iacute; tiene
-una l&iacute;nea de documentaci&oacute;n y es interactiva, como se
-esperar&iacute;a. Las dos l&iacute;neas siguientes usan
-las funciones <code>save-restriction</code> y <code>widen</code>.
-</p>
-<p>La forma especial <code>save-restriction</code> nota que encogiendo es en
-efecto, si cualquiera, en el buffer actual y restaura que encogiendo
-despu&eacute;s del c&oacute;digo en el cuerpo del <code>save-restriction</code> ha
-sido evaluada.
-</p>
-<p>La forma especial <code>save-restriction</code> es seguida por
-<code>widen</code>. Esta funci&oacute;n deshace cualquier distancia del actual
-b&uacute;ffer que puede haber tenido cuando <code>what-line</code> se llame. (La
-distancia que hab&iacute;a es la distancia que
-<code>save-restriction</code> recuerda.) Esta ampliaci&oacute;n se hace posible
-para la l&iacute;nea contando comandos a contar desde el
-principio del b&uacute;ffer. De otro modo, se habr&iacute;a
-limitado para contar con la regi&oacute;n accesible. Cualquier distancia
-original se restaura solo antes de la compleci&oacute;n de la funci&oacute;n
-por la forma especial <code>save-restriction</code>.
-</p>
-<p>La llamada a <code>widen</code> es seguida por <code>save-excursion</code>, que
-guarda la posici&oacute;n del cursor (por ej., el punto) y de la marca, y
-la restaura despu&eacute;s el c&oacute;digo en el cuerpo del
-<code>save-excursion</code> usa la funci&oacute;n <code>beginning-of-line</code> para
-mover el punto.
-</p>
-<p>(N&oacute;tese que la expresi&oacute;n <code>(widen)</code> viene entre las formas
-especiales <code>save-restriction</code> y <code>save-excursion</code>. Cuando se
-escribe las dos expresiones <code>save- &hellip;</code> en secuencia, escribe
-<code>save-excursion</code> finalmente.)
-</p>
-<p>Las &uacute;ltimas dos l&iacute;neas de la funci&oacute;n
-<code>what-line</code> son funciones para contar el n&uacute;mero de
-l&iacute;neas en el b&uacute;ffer y entonces imprimir el n&uacute;mero en
-el &aacute;rea echo.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(message &quot;Line %d&quot;
- (1+ (count-lines 1 (point)))))))
-</pre></div>
-
-<p>La funci&oacute;n <code>message</code> imprime un mensaje de una
-l&iacute;nea abajo de la pantalla Emacs. El primer argumento
-est&aacute; dentro de marcas de cita y est&aacute; impreso como una cadena de
-caracteres. Sin embargo, se puede contener una expresi&oacute;n &lsquo;<samp>%d</samp>&rsquo;
-para imprimir un argumento siguiente. &lsquo;<samp>%d</samp>&rsquo; imprime el argumento
-como un decimal, as&iacute; el mensaje dir&aacute; alguna cosa tal
-como &lsquo;<samp>L&iacute;nea 243</samp>&rsquo;.
-</p>
-<p>El n&uacute;mero que est&aacute; impreso en lugar de &lsquo;<samp>%d</samp>&rsquo; est&aacute; computada
-por la &uacute;ltima l&iacute;nea de la funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(1+ (count-lines 1 (point)))
-</pre></div>
-
-
-<p>Lo que esto hace es contar las l&iacute;neas entre la primera
-posici&oacute;n del b&uacute;ffer indicada por el <code>1</code>, y el
-<code>(point)</code>, y entonces se a&ntilde;ade uno a este n&uacute;mero. (La funci&oacute;n
-<code>1+</code> a&ntilde;ade uno a su argumento.) Se a&ntilde;ade a eso porque
-la l&iacute;nea 2 tiene solo una l&iacute;nea antes, y
-<code>count-lines</code> cuenta solo las l&iacute;neas <em>antes</em>
-de la l&iacute;nea actual.
-</p>
-<p>Despu&eacute;s de que <code>count-lines</code> ha hecho su trabajo, y el mensaje
-ha sido impreso en el &aacute;rea echo, la funci&oacute;n <code>save-excursion</code>
-restaura punto y marca a sus posiciones originales; y
-<code>save-restriction</code> restaura la contracci&oacute;n original, si la hay.
-</p>
-<hr>
-<a name="Ejercicio-narrow"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#what_002dline" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicio-de-encoger"></a>
-<h2 class="section">6.3 Ejercicio de encoger</h2>
-
-<p>Escribe una funci&oacute;n que mostrar&aacute; los primeros 60 caracteres del
-b&uacute;ffer actual, incluso si se ha encogido el b&uacute;ffer a su mitad
-as&iacute; que la primera l&iacute;nea es
-inaccesible. Restaura punto, marca y encogimiento. Para este
-ejercicio, se necesita usa un popurri entero de funciones, incluyendo
-<code>save-restriction</code>, <code>widen</code>, <code>goto-char</code>,
-<code>point-min</code>, <code>message</code>, y <code>buffer-substring</code>.
-</p>
-<a name="index-Propiedades_002c-mencion-de-buffer_002dsubstring_002dno_002dproperties"></a>
-<p>(<code>buffer-substring</code> es una funci&oacute;n previamente no mencionada
-que tendr&aacute; que investigarla cada cual por uno mismo; o quiz&aacute;s
-tendr&aacute; que usarse <code>buffer-substring-no-properties</code> o
-<code>filter-buffer-substring</code> &hellip;, o todav&iacute;a otras
-funciones. Las propiedades de texto son una funcionalidad que de otro
-modo no ser&iacute;an discutidas aqu&iacute;.
-See <a href="elisp.html#Propiedades-de-Texto">Propiedades de Texto</a> in <cite>El Manual de Referencia de Emacs Lisp</cite>.)
-</p>
-<p>Adem&aacute;s, &iquest;realmente se necesita <code>goto-char</code> o
-<code>point-min</code>?
-&iquest;O se puede escribir la funci&oacute;n sin ellos?
-</p>
-<hr>
-<a name="Car-cdr-y-cons"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Encogiendo-y-extendiendo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-narrow" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Nombres-extra_00f1os" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="car_002c-cdr_002c-cons_003a-Funciones-fundamentales"></a>
-<h1 class="chapter">7 <code>car</code>, <code>cdr</code>, <code>cons</code>: Funciones fundamentales</h1>
-<a name="index-car_002c-introducido"></a>
-<a name="index-cdr_002c-introducido"></a>
-
-<p>En Lisp, <code>car</code>, <code>cdr</code>, y <code>cons</code> son funciones
-fundamentales. La funci&oacute;n <code>cons</code> es usada para construir
-listas, y las funciones <code>car</code> y <code>cdr</code> son usadas para
-tomarlas aparte.
-</p>
-<p>En el paseo guiado a trav&eacute;s de la funci&oacute;n
-<code>copy-region-as-kill</code>, se ver&aacute; <code>cons</code> tan bien como dos
-variantes de <code>cdr</code>, llamadas <code>setcdr</code> y
-<code>nthcdr</code>. (V&eacute;ase la secci&oacute;n <a href="#copy_002dregion_002das_002dkill"><code>copy-region-as-kill</code></a>.)
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Nombres-extra_00f1os">Nombres extra&ntilde;os</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un lado hist&oacute;rico: &iquest;por qu&eacute;
- los nombres extra&ntilde;os?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#car-y-cdr">7.1 <code>car</code> y <code>cdr</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Funciones para extraer parte de una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#cons">7.2 <code>cons</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Construyendo una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#nthcdr">7.3 <code>nthcdr</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Llamando <code>cdr</code> repetidamente.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#nth">7.4 <code>nth</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> nth
-</td></tr>
-<tr><td align="left" valign="top"><a href="#setcar">7.5 <code>setcar</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cambiando el primer elemento de una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#setcdr">7.6 <code>setcdr</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cambiando el resto de una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-cons">7.7 Ejercicio</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio cons
-</td></tr>
-</table>
-
-<hr>
-<a name="Nombres-extra_00f1os"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#car-y-cdr" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Nombres-extranos"></a>
-<h2 class="unnumberedsec">Nombres extra&ntilde;os</h2>
-
-<p>El nombre de la funci&oacute;n <code>cons</code> es razonable: es una
-abreviaci&oacute;n de la palabra &lsquo;constructo&rsquo;. Los or&iacute;genes
-de los nombres <code>car</code> y <code>cdr</code>, por otro lado, son
-esot&eacute;ricos: <code>car</code> es un acr&oacute;nimo de la frase &lsquo;Contenidos de
-la parte de la Direcci&oacute;n del Registro&rsquo;; y <code>cdr</code> (pronunciado
-&lsquo;could-er&rsquo;) es un acr&oacute;nimo de la frase &lsquo;Contenidos del Decremento
-del Registro&rsquo;. Estas frases se refieren a piezas
-espec&iacute;ficas de hardware en el ordenador en el que el
-Lisp original fu&eacute; desarrollado. El resto de frases han sido
-completamente irrelevantes por m&aacute;s de 25 a&ntilde;os a cualquiera
-pensando acerca de Lisp. Ninguno, excepto unos pocos acad&eacute;micos
-valientes han empezado a usar nombres m&aacute;s razonables para estas
-funciones, los viejos t&eacute;rminos est&aacute;n todav&iacute;a en
-uso. En particular, los t&eacute;rminos usados en el c&oacute;digo fuente Emacs
-Lisp, que usaremos en esta introducci&oacute;n.
-</p>
-<hr>
-<a name="car-y-cdr"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Nombres-extra_00f1os" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#cons" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="car-y-cdr-1"></a>
-<h2 class="section">7.1 <code>car</code> y <code>cdr</code></h2>
-
-<p>El <small>CAR</small> de una lista es, bastante simple, el primer
-&iacute;tem en la lista. De este modo, el <small>CAR</small> de la lista
-<code>(rosa violeta margarita bot&oacute;ndeoro)</code> es <code>rosa</code>.
-</p>
-<p>Si est&aacute; leyendo en Info y en GNU Emacs, se puede ver esto evaluando
-lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(car '(rosa violeta margarita bot&oacute;ndeoro))
-</pre></div>
-
-<p>Despu&eacute;s de evaluar la expresi&oacute;n, <code>rosa</code> aparecer&aacute; en el
-&aacute;rea echo.
-</p>
-<p>Claramente, un nombre m&aacute;s razonable para la funci&oacute;n <code>car</code>
-ser&iacute;a <code>first</code> y esto es con frecuencia lo que se
-sugiere.
-</p>
-<p><code>car</code> no elimina el primer &iacute;tem de la lista; solo
-se informa de lo que hay. Despu&eacute;s de que <code>car</code> se haya aplicado a
-una lista, la lista es todav&iacute;a la misma que era. En la
-jerga, <code>car</code> es &lsquo;no-destructiva&rsquo;. Esta funcionalidad deja de ser
-importante.
-</p>
-<p>El <small>CDR</small> de una lista es el resto de la lista, que es, la funci&oacute;n
-<code>cdr</code> que devuelve la parte de la lista que sigue el primer
-&iacute;tem. De este modo, mientras el <small>CAR</small> de la lista
-<code>'(rosa violeta margarita bot&oacute;ndeoro)</code> es <code>rosa</code>, el resto
-de la lista, el valor devuelto por la funci&oacute;n <code>cdr</code>, es
-<code>(violeta margarita bot&oacute;ndeoro)</code>.
-</p>
-<p>Se puede ver esto evaluando lo siguiente del modo usual:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cdr '(rosa violeta margarita bot&oacute;ndeoro))
-</pre></div>
-
-<p>Cuando se eval&uacute;a esto, <code>(violeta margarita bot&oacute;ndeoro)</code>
-aparecer&aacute; en el &aacute;rea echo.
-</p>
-<p>Al igual que <code>car</code>, <code>cdr</code> no elimina los elementos desde la
-lista &mdash; solo devuelve un informe de lo que el segundo y subsiguientes
-elementos son.
-</p>
-<p>En el ejemplo, la lista de flores se cita. Si no, el int&eacute;rprete Lisp
-intentar&iacute;a evaluar la lista llamando a <code>rosa</code> como
-una funci&oacute;n. En este ejemplo, no queremos hacer esto.
-</p>
-<p>Claramente, un nombre m&aacute;s razonable para <code>cdr</code>
-ser&iacute;a <code>rest</code>.
-</p>
-<p>(Hay una lecci&oacute;n aqu&iacute;: cuando se nombran nuevas
-funciones, considere muy cuidadosamente lo que se est&aacute; haciendo, ya
-que puede estar pegadas con los nombres largos que se esperan. La
-raz&oacute;n es que este documento perpet&uacute;a estos nombres que el
-c&oacute;digo fuente de Emacs Lisp usa, y si no los usaba, se
-estar&iacute;a un duro rato leyendo el c&oacute;digo; pero, por
-favor, se debe intentar evitar usar estos t&eacute;rminos por uno
-mismo. Las personas que vengan despu&eacute;s se lo agradecer&aacute;n.
-</p>
-<p>Cuando <code>car</code> y <code>cdr</code> se aplica a una lista hecha de
-s&iacute;mbolos, tal como la lista <code>(pino roble abeto
-arce)</code>, el elemento de la lista devuelta por la funci&oacute;n <code>car</code>
-es el s&iacute;mbolo <code>pino</code> sin cualquier par&eacute;ntesis
-alrededor. <code>pino</code> es el primer elemento en la lista. Sin embargo,
-el <small>CDR</small> de la lista es una lista por s&iacute; misma,
-<code>(roble abeto arce)</code>, como se puede ver evaluando las siguientes
-expresiones en el modo usual:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(car '(pino roble abeto arce))
-
-(cdr '(pino roble abeto arce))
-</pre></div>
-
-<p>Por otro lado, en una lista de listas, el primer elemento es en
-s&iacute; mismo una lista. <code>char</code> devuelve este primer
-elemento como una lista. Por ejemplo, la siguiente lista contiene tres
-sublistas, una lista de carn&iacute;voros, una lista de
-herb&iacute;voros y una lista de mam&iacute;feros:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(car '((leon tigre leopardo)
- (gacela antilope cebra)
- (ballena delfin foca)))
-</pre></div>
-
-<p>En este ejemplo, el primer elemento de <small>CAR</small> de la lista es la
-lista de carn&iacute;voros, <code>(leon tigre leopardo)</code>, y el
-resto de la lista es <code>((gacela antilope cebra)
-(ballena delfin foca))</code>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cdr '((leon tigre leopardo)
- (gacela antilope cebra)
- (ballena delfin)))
-</pre></div>
-
-<p>Es un valor decir de nuevo que <code>car</code> y <code>cdr</code> son no
-destructivos &mdash; esto es, no se modifican o cambian listas para las
-que ser aplicados. Esto es muy importante por c&oacute;mo son usados.
-</p>
-<p>Tambi&eacute;n, en el primer cap&iacute;tulo, en la discusi&oacute;n
-acerca de &aacute;tomos, yo dije que en Lisp, &ldquo;ciertos tipos de &aacute;tomos,
-tales como un array, pueden separarse en partes; pero el mecanismo de
-hacer esto es diferente del mecanismo de separar una lista. Desde
-que Lisp se conoce, los &aacute;tomos de una lista son indivisibles.&rdquo;
-(V&eacute;ase la secci&oacute;n <a href="#g_t_00c1tomos-Lisp">&Aacute;tomos Lisp</a>.) El <code>car</code> y el <code>cdr</code> son funciones que
-son usadas para dividir listas y son consideradas fundamentales para
-Lisp. Puesto que no pueden dividir o ganar acceso a las partes de un array,
-un array es considerado un &aacute;tomo. De otro modo, la otra
-funci&oacute;n fundamental, <code>cons</code>, se puede poner cerca o construir
-una lista, pero no un array. (Los arrays son manejados por funciones de
-array espec&iacute;ficas. See <a href="elisp.html#Arrays">Arrays</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>.)
-</p>
-<hr>
-<a name="cons"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#car-y-cdr" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Construir-una-lista" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="cons-1"></a>
-<h2 class="section">7.2 <code>cons</code></h2>
-<a name="index-cons_002c-introducido"></a>
-
-<p>La funci&oacute;n <code>cons</code> construye listas; eso es lo inverso de
-<code>car</code> y <code>cdr</code>. Por ejemplo, <code>cons</code> puede usarse para
-crear una lista de cuatro elementos desde los tres elementos de la
-lista, <code>(abeto roble arce)</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cons 'pino '(abeto roble arce))
-</pre></div>
-
-<p>Despu&eacute;s de evaluar esto, se ver&aacute; lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(pino abeto roble arce)
-</pre></div>
-
-<p>aparece en el &aacute;rea echo. <code>cons</code> causa la creaci&oacute;n de una
-nueva lista en el que el elemento es seguido por los elementos de la
-lista original.
-</p>
-<p>Con frecuencia decimos que &lsquo;<code>cons</code> pone un nuevo elemento al
-principio de una lista; adjunta o empuja el elemento dentro de la lista&rsquo;,
-pero esta frase puede ser incorrecta, puesto que <code>cons</code> no cambia
-a una lista existente, pero crea una nueva.
-</p>
-<p>Como <code>car</code> y <code>cdr</code>, <code>cons</code> es no destructivo.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Construir-una-lista">Construir una lista</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#length">7.2.1 Encuentra el tama&ntilde;o de una lista: <code>length</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo encontrar el tama&ntilde;o de una lista.
-</td></tr>
-</table>
-
-<hr>
-<a name="Construir-una-lista"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#cons" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#cons" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#length" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Construir-una-lista-1"></a>
-<h3 class="unnumberedsubsec">Construir una lista</h3>
-
-<p><code>cons</code> debe tener una lista para adjuntar a<a name="DOCF9" href="#FOOT9">(9)</a> No se puede
-empezar desde absolutamente nada. Si se est&aacute; construyendo una lista,
-se necesita proveer al menos una lista vac&iacute;a al
-principio. Aqu&iacute; hay una serie de expresiones <code>cons</code>
-que construyen una lista de flores. Si est&aacute; leyendo esto en Info en
-GNU Emacs, se puede evaluar cada una de las expresiones en el camino
-usual; el valor es impreso en este texto despu&eacute;s de &lsquo;<samp>&rArr;</samp>&rsquo;,
-que puede leer como &lsquo;eval&uacute;as para&rsquo;.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cons 'bot&oacute;ndeoro ())
- &rArr; (bot&oacute;ndeoro)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(cons 'margarita '(bot&oacute;ndeoro))
- &rArr; (margarita bot&oacute;ndeoro)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(cons 'violeta '(margarita bot&oacute;ndeoro))
- &rArr; (violeta margarita bot&oacute;ndeoro)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(cons 'rosa '(violeta margarita bot&oacute;ndeoro))
- &rArr; (rosa violeta margarita bot&oacute;ndeoro)
-</pre></div>
-
-<p>En el primer ejemplo, la lista vac&iacute;a se muestra como
-<code>()</code> y despu&eacute;s se construye una lista de <code>bot&oacute;ndeoro</code>
-seguida por la lista vac&iacute;a. Como se puede ver, la lista
-vac&iacute;a no se muestra en la lista que fu&eacute;
-construida. Todo lo que se ve es <code>(bot&oacute;ndeoro)</code>. La lista
-vac&iacute;a no cuenta como un elemento de una lista porque
-no hay nada en una lista vac&iacute;a. Generalmente hablando,
-una lista vac&iacute;a es invisible.
-</p>
-<p>El segundo ejemplo, <code>(cons 'margarita '(bot&oacute;ndeoro))</code> construye
-una nueva lista de dos elemento poniendo <code>margarita</code> en frente de
-<code>bot&oacute;ndeoro</code>; y el tercer ejemplo construye una lista de tres
-elementos poniendo <code>violeta</code> en frente de <code>margarita</code> y
-<code>bot&oacute;ndeoro</code>.
-</p>
-<hr>
-<a name="length"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Construir-una-lista" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#cons" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#nthcdr" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Encuentra-el-tamano-de-una-lista_003a-length"></a>
-<h3 class="subsection">7.2.1 Encuentra el tama&ntilde;o de una lista: <code>length</code></h3>
-<a name="index-length"></a>
-
-<p>Se pueden encontrar cu&aacute;ntos elementos hay en una lista usando la
-funci&oacute;n Lisp <code>length</code>, como en los siguientes ejemplos:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(length '(bot&oacute;ndeoro))
- &rArr; 1
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(length '(margarita bot&oacute;ndeoro))
- &rArr; 2
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(length (cons 'violeta '(margarita bot&oacute;ndeoro)))
- &rArr; 3
-</pre></div>
-
-<p>En el tercer ejemplo, la funci&oacute;n <code>cons</code> es usada para construir
-una lista de tres elementos que entonces se pasa a la funci&oacute;n
-<code>length</code> como su argumento.
-</p>
-<p>Se puede tambi&eacute;n usar <code>length</code> para contar el n&uacute;mero de
-elementos en una lista vac&iacute;a:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(length ())
- &rArr; 0
-</pre></div>
-
-<p>Como se esperar&iacute;a, el n&uacute;mero de elementos en una lista
-vac&iacute;a es cero.
-</p>
-<p>Un experimento interesante es encontrar qu&eacute; ocurre si se intenta
-encontrar el tama&ntilde;o de una no lista en todo; que es, si se intenta
-llamar a <code>length</code> sin darle un argumento, incluso una lista no
-vac&iacute;a:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(length )
-</pre></div>
-
-<p>Lo que se ve, si se eval&uacute;a esto, es el mensaje de error
-</p>
-<div class="smallexample">
-<pre class="smallexample">Lisp error: (wrong-number-of-arguments length 0)
-</pre></div>
-
-<p>Esto significa que la funci&oacute;n recibe el n&uacute;mero incorrecto de
-argumentos, cero, cuando se espera alg&uacute;n otro n&uacute;mero de
-argumentos. En este caso, se espera un argumento, el argumento de una
-lista cuyo tama&ntilde;o de la funci&oacute;n se est&aacute; midiendo. (N&oacute;tese que
-<em>una</em> lista es <em>un</em> argumento, incluso si la lista tiene
-muchos elementos dentro.)
-</p>
-<p>La parte del mensaje de error que dice &lsquo;<samp>length</samp>&rsquo; es el nombre de la
-funci&oacute;n.
-</p>
-
-<hr>
-<a name="nthcdr"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#length" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#nth" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="nthcdr-1"></a>
-<h2 class="section">7.3 <code>nthcdr</code></h2>
-<a name="index-nthcdr"></a>
-
-<p>La funci&oacute;n <code>nthcdr</code> est&aacute; asociada con la funci&oacute;n
-<code>cdr</code>. Que lo que hace es tomar la <small>CDR</small> de una lista repetidamente.
-</p>
-<p>Si se toma el <small>CDR</small> de la lista <code>(pino roble abeto arce)</code>,
-ser&aacute; devuelta la lista <code>(roble abeto arce)</code>. Si se repite esto en
-lo que se devolvi&oacute;, se devolver&aacute; lista lista <code>(abeto
-arce)</code>. (De acuerdo, se repite <small>CDR</small> en la lista original solo se
-dar&aacute; <small>CDR</small> desde la funci&oacute;n que no cambia la lista. Se necesita
-evaluar el <small>CDR</small> del <small>CDR</small> y as&iacute;.) Si se conti&uacute;a
-esto, finalmente ser&aacute; devuelta una lista vac&iacute;a, que en
-este caso, en vez de ser mostrada como <code>()</code> es mostrado como
-<code>nil</code>.
-</p>
-<p>Para revisar, aqu&iacute; hay una serie de <small>CDR</small>s repetidos,
-el siguiente &lsquo;<samp>&rArr;</samp>&rsquo; muestra lo que se devuelve.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cdr '(pino roble abeto arce))
- &rArr;(roble abeto arce)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(cdr '(roble abeto arce))
- &rArr; (abeto arce)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(cdr '(abeto arce))
- &rArr;(arce)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(cdr '(arce))
- &rArr; nil
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(cdr 'nil)
- &rArr; nil
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(cdr ())
- &rArr; nil
-</pre></div>
-
-<p>Tambi&eacute;n se pueden hacer varios <small>CDR</small>s sin imprimir los valores
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cdr (cdr '(pino roble abeto arce)))
- &rArr; (abeto arce)
-</pre></div>
-
-<p>En este ejemplo, el int&eacute;rprete Lisp eval&uacute;a la lista propia
-dentro. La lista de dentro est&aacute; entre comillas, as&iacute; solo
-pasa la lista del <code>cdr</code> m&aacute;s interno. Este <code>cdr</code>
-pasa una lista hecho del segundo y subsiguientes elementos de la lista
-al <code>cdr</code> m&aacute;s externo, que produce una lista compuesta del tercer y
-subsiguientes elementos de la lista original. En este ejemplo, la
-funci&oacute;n <code>cdr</code> se repite y devuelve una lista que consiste de
-la lista original sin sus primeros dos elementos.
-</p>
-<p>La funci&oacute;n <code>nthcdr</code> hace lo mismo que repitiendo la llamada a
-<code>cdr</code>. En el siguiente ejemplo, el segundo argumento se pasa a la
-funci&oacute;n <code>nthcdr</code>, a trav&eacute;s con la lista, y el valor devuelto
-es la lista sin sus primeros dos &iacute;tems, que son
-exactamente los mismos dos <code>cdr</code> en la lista:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(nthcdr 2 '(pino roble abeto arce))
- &rArr; (abeto arce)
-</pre></div>
-
-<p>Usando la lista original de cuatro elementos, se puede ver qu&eacute;
-ocurre cuando varios argumentos num&eacute;ricos son pasados a <code>nthcdr</code>,
-incluyendo 0, 1, y 5:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;; <span class="roman">Deja la lista como estaba.</span>
-(nthcdr 0 '(pine fir oak maple))
- &rArr; (pino roble abeto arce)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;; <span class="roman">Devuelve una copia sin el primer elemento.</span>
-(nthcdr 1 '(pine fir oak maple))
- &rArr; (fir oak maple)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;; <span class="roman">Devuelve una copia de la lista sin tres elementos.</span>
-(nthcdr 3 '(pine fir oak maple))
- &rArr; (maple)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;; <span class="roman">Devuelve la lista faltando los cuatro elementos.</span>
-(nthcdr 4 '(pine fir oak maple))
- &rArr; nil
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;; <span class="roman">Devuelve una copia sin los elementos.</span>
-(nthcdr 5 '(pine fir oak maple))
- &rArr; nil
-</pre></div>
-
-<hr>
-<a name="nth"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#nthcdr" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#setcar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="nth-1"></a>
-<h2 class="section">7.4 <code>nth</code></h2>
-<a name="index-nth"></a>
-
-<p>La funci&oacute;n <code>nthcdr</code> toma el <small>CDR</small> de una lista
-repetidamente. La funci&oacute;n <code>nth</code> toma el <small>CAR</small> del resultado
-devuelto por <code>nthcdr</code>. Devuelve el elemento Nth de la lista.
-</p>
-<p>De este modo, si no fuera definido en C para velocidad, la
-definici&oacute;n de <code>nth</code> ser&iacute;a:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun nth (n list)
- &quot;Devuelve el elemento Nth de Lista.
-N cuenta desde cero. Si Lista no es larga, nil es devuelto&quot;.
- (car (nthcdr n list)))
-</pre></div>
-
-<p>(Originalmente, <code>nth</code> fu&eacute; definido en Emacs Lisp en
-&lsquo;<tt>subr.el</tt>&rsquo;, pero su definici&oacute;n fu&eacute; rehecha en C en los 1980s.)
-</p>
-<p>La funci&oacute;n <code>nth</code> devuelve un elemento simple de una lista. Esto
-puede ser muy conveniente.
-</p>
-<p>N&oacute;tese que los elementos son numerados desde cero, no desde uno. Es
-decir, el primer elemento de una lista, su <small>CAR</small> es el elemento
-cero. Esto se llama contar en &lsquo;base cero&rsquo; y con frecuencia las
-personas tienen la costumbre del que el primer elemento en una lista
-sea el n&uacute;mero uno, eso es &lsquo;basado en uno&rsquo;.
-</p>
-<p>Por ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(nth 0 '(&quot;uno&quot; &quot;dos&quot; &quot;tres&quot;))
- &rArr; &quot;uno&quot;
-
-(nth 1 '(&quot;uno&quot; &quot;dos&quot; &quot;tres&quot;))
- &rArr; &quot;dos&quot;
-</pre></div>
-
-<p>Es valorable mencionar que <code>nth</code>, como <code>nthcdr</code> y
-<code>cdr</code>, no cambia la lista original &mdash; la funci&oacute;n no es
-destructiva. En contraste con las funciones <code>setcar</code> y
-<code>setcdr</code>.
-</p>
-<hr>
-<a name="setcar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#nth" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#setcdr" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="setcar-1"></a>
-<h2 class="section">7.5 <code>setcar</code></h2>
-<a name="index-setcar"></a>
-
-<p>Como se podr&iacute;a adivinar desde sus nombres, las funciones
-<code>setcar</code> y <code>setcdr</code> asignan el <small>CAR</small> o la <small>CDR</small> de una
-lista a un nuevo valor. Ellos actualmente cambia la lista original, no
-como <code>car</code> y <code>cdr</code> que deja la lista original como
-estaba. Un camino para encontrar c&oacute;mo esto funciona es
-experimentar. Se comenzar&aacute; con la funci&oacute;n <code>setcar</code>.
-</p>
-<p>Primero, podemos crear una lista y entonces asignar el valor de una
-variable a la lista usando la funci&oacute;n
-<code>setq</code>. Aqu&iacute; hay una lista de animales:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq animales '(antilope jirafa leon tigre))
-</pre></div>
-
-<p>Si est&aacute; leyendo esto en Info dentro de GNU Emacs, se puede evaluar
-esta expresi&oacute;n del modo usual, posicionando el cursor despu&eacute;s de
-la expresi&oacute;n y escribiendo <kbd>C-x C-e</kbd>. Esto es una de las
-ventajas de tener el int&eacute;rprete construido dentro del entorno de
-computaci&oacute;n. Incidentalmente, cuando no hay nada en la
-l&iacute;nea despu&eacute;s del par&eacute;ntesis final, tal como un
-comentario, el punto puede estar en la siguiente
-l&iacute;nea. De este modo, si tu cursor est&aacute; en la primera
-columna de la siguiente l&iacute;nea, no se necesita mover. En
-realidad, Emacs permite cualquier cantidad de espacio en blanco
-despu&eacute;s del par&eacute;ntesis final.)
-</p>
-<p>Cuando se eval&uacute;a la variable <code>animal</code>, vemos que est&aacute;
-asociada a la lista <code>(antelope giraffer lion tiger)</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">animales
- &rArr; (antilope jirafa leon tigre)
-</pre></div>
-
-<p>Por otro lado, la variable <code>animales</code> apunta a la lista
-<code>(antilope jirafa leon tigre)</code>.
-</p>
-<p>Lo siguiente, es evaluar la funci&oacute;n <code>setcar</code> mientras le pasa
-dos argumentos, la variable <code>animales</code> y el s&iacute;mbolo
-citado <code>hipopotamo</code>; esto se hace escribiendo la lista de tres
-elementos <code>(setcar animales 'hipopotamo)</code> y entonces evaluando
-en el modo usual:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setcar animales 'hipopotamo)
-</pre></div>
-
-<p>Despu&eacute;s de evaluar esta expresi&oacute;n, eval&uacute;a la variable
-<code>animales</code> de nuevo. Se puede ver que la lista de animales ha
-cambiado:
-</p>
-<div class="smallexample">
-<pre class="smallexample">animales
- &rArr; (hipop&oacute;tamo jirafa leon tigre)
-</pre></div>
-
-<p>El primer elemento en la lista, <code>antilope</code> se reemplaza por
-<code>hipopotamo</code>.
-</p>
-<p>As&iacute; se puede ver que <code>setcar</code> no a&ntilde;adi&oacute; un
-nuevo elemento a la lista como <code>cons</code> tendr&iacute;a; eso
-reemplaz&oacute; <code>ant&iacute;lope</code> con <code>hipop&oacute;tamo</code>; eso
-<em>cambi&oacute;</em> la lista.
-</p>
-<hr>
-<a name="setcdr"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#setcar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-cons" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="setcdr-1"></a>
-<h2 class="section">7.6 <code>setcdr</code></h2>
-<a name="index-setcdr"></a>
-
-<p>La funci&oacute;n <code>setcdr</code> es similar a la funci&oacute;n <code>setcar</code>,
-excepto que la funci&oacute;n reemplaza el segundo y subsiguientes
-elementos de una lista en vez del primer elemento.
-</p>
-<p>(Para ver c&oacute;mo se cambia el &uacute;ltimo elemento de una lista, mira hacia
-delante a la <a href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code></a>,
-que usa las funciones <code>nthcdr</code> y <code>setcdr</code>.)
-</p>
-<p>Para ver c&oacute;mo esto funciona, asigna el valor de la variable a una
-lista de animales domesticados evaluando la siguiente expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq animales-domesticos '(caballo vaca oveja cabra))
-</pre></div>
-
-<p>Si ahora se eval&uacute;a la lista, lo que se devuelve es <code>(caballo
-vaca oveja cabra)</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">animales-domesticos
- &rArr; (caballo vaca oveja cabra)
-</pre></div>
-
-<p>Lo siguiente, eval&uacute;a <code>setcdr</code> con dos argumentos, el nombre de la
-variable que tiene una lista como su valor, y la lista para la que el
-<small>CDR</small> de la primera lista sea asignada;
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setcdr animales-domesticos '(gato perro))
-</pre></div>
-
-<p>Si se eval&uacute;a esta expresi&oacute;n, la lista <code>(gato perro)</code> aparecer&aacute;
-en el &aacute;rea echo. Este es el valor devuelto por la funci&oacute;n. El
-resultado en el que estamos interesados es el &ldquo;efecto lateral&rdquo;, que
-se puede ver evaluando la variable <code>domesticated-animals</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">animales-domesticos
- &rArr; (caballo gato perro)
-</pre></div>
-
-<p>En realidad, la lista es cambiada desde <code>(caballo vaca oveja cabra)</code>
-a <code>(caballo gato perro)</code>. El <small>CDR</small> de la lista es cambiada desde
-<code>(vaca oveja cabra)</code> a <code>(gato perro)</code>.
-</p>
-<hr>
-<a name="Ejercicio-cons"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#setcdr" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicio-2"></a>
-<h2 class="section">7.7 Ejercicio</h2>
-
-<p>Construye una lista de cuatro p&aacute;jaros evaluando varias expresiones
-con <code>cons</code>. Encuentra que ocurre cuando <code>cons</code> una lista
-dentro de s&iacute;. Reemplaza el primer elemento de la lista
-de cuatro p&aacute;jaros con un pez. Reemplaza el resto de esta lista con
-una lista de otro pez.
-</p>
-<hr>
-<a name="Cortando-y-almacenando-texto"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Car-cdr-y-cons" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-cons" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Almacenando-Texto" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Cortando-y-almacenando-texto-1"></a>
-<h1 class="chapter">8 Cortando y almacenando texto</h1>
-<a name="index-Cortando-y-almacenando-texto"></a>
-<a name="index-Almacenando-y-cortando-texto"></a>
-<a name="index-Cortando-texto"></a>
-<a name="index-Copiando-texto"></a>
-<a name="index-Borrando-texto"></a>
-<a name="index-Borrando-texto-1"></a>
-
-<p>Siempre y cuando se corte o pegue texto de un b&uacute;ffer con un comando
-&lsquo;kill&rsquo; en GNU Emacs, se almacenar&aacute; dentro de una lista que se puede
-traer con un comando &lsquo;yank&rsquo;.
-</p>
-<p>(El uso de la palabra &lsquo;kill&rsquo; <em>matar, cortar</em> en Emacs para
-procesos que espec&iacute;ficamente <em>no</em> destruyen los
-valores de las entidades es un accidente hist&oacute;rico desafortunado. Una
-palabra mucho m&aacute;s apropiada deber&iacute;a ser &lsquo;clip&rsquo;
-<em>cortar</em> puesto que es lo que los comandos de corte hacen; ellos
-cortan texto fuera de un b&uacute;ffer y lo ponen dentro del almacenamiento
-desde el que puede traerse. Con frecuencia ha sido tentada de
-reemplazar globalmente todas las ocurrencia de &lsquo;kill&rsquo; <em>matar,
-cortar</em> en las fuentes de Emacs con &lsquo;clip&rsquo; <em>cortar</em> y todas las
-ocurrencias de &lsquo;killed&rsquo; <em>cortado, muerto</em> con &lsquo;clipped&rsquo;
-<em>cortado</em>.)
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Almacenando-Texto">Almacenando texto en una lista</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El texto est&aacute; almacenado en una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#zap_002dto_002dchar">8.1 <code>zap-to-char</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cortando texto a un car&aacute;cter.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#kill_002dregion">8.2 <code>kill-region</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cortando texto de una regi&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#copy_002dregion_002das_002dkill">8.3 <code>copy-region-as-kill</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una definici&oacute;n para copiar texto.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Disgresi_00f3n-dentro-de-C">8.4 Disgresi&oacute;n dentro de C</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Nota menor en macros del lenguaje de
- programaci&oacute;n C.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#defvar">8.5 Inicializando una variable con <code>defvar</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo dar a una variable un valor inicial.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Revisi_00f3n-de-cons-y-search_002dfwd">8.6 Revisar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Revisi&oacute;n de cons y search-fwd
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Buscar-ejercicios">8.7 Buscando ejercicios</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Buscar ejercicios
-</td></tr>
-</table>
-
-<hr>
-<a name="Almacenando-Texto"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#zap_002dto_002dchar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Almacenando-texto-en-una-lista"></a>
-<h2 class="unnumberedsec">Almacenando texto en una lista</h2>
-
-<p>Cuando el texto se corta de un b&uacute;ffer, es almacenado en una
-lista. Piezas sucesivas de texto se almacenan en la lista
-sucesivamente, as&iacute; la lista podr&iacute;a verse
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&quot;una pieza de texto&quot; &quot;pieza previa&quot;)
-</pre></div>
-
-<p>La funci&oacute;n <code>cons</code> puede usarse para crear una nueva lista
-desde una pieza de texto (un &lsquo;&aacute;tomo&rsquo;, para usar la jerga) y una
-lista existente, como esta:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cons &quot;otra pieza&quot;
- '(&quot;una pieza de texto&quot; &quot;pieza previa&quot;))
-</pre></div>
-
-<p>Si se eval&uacute;a esta expresi&oacute;n, una lista de tres elementos
-aparecer&aacute; en el &aacute;rea echo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&quot;otra pieza&quot; &quot;una pieza de texto&quot; &quot;pieza previa&quot;)
-</pre></div>
-
-<p>Con las funciones <code>car</code> y <code>nthcdr</code>, se puede recuperar
-siempre la pieza de texto que se quiere. Por ejemplo, en el siguiente
-c&oacute;digo, <code>nthcdr 1 &hellip;</code> devuelve la lista con el primer
-&iacute;tem eliminado; y el <code>car</code> devuelve el primer
-elemento de este resto &mdash; el segundo elemento de la lista
-original:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(car (nthcdr 1 '(&quot;otra pieza&quot;
- &quot;una pieza de texto&quot;
- &quot;pieza previa&quot;)))
- &rArr; &quot;una pieza de texto&quot;
-</pre></div>
-
-<p>Las funciones actuales en Emacs son m&aacute;s complejas que esto, de
-acuerdo. El c&oacute;digo para cortar y recuperar texto tiene que ser
-escrito de modo que Emacs pueda ver qu&eacute; elemento en la lista se
-quiere &mdash; el primer, segundo, tercer o cualquier otro. Adem&aacute;s,
-cuando tiene el fin de la lista, Emacs dar&iacute;a el primer
-elemento de la lista, en lugar de nada.
-</p>
-<p>La lista que maneja las piezas de texto se llama <em>kill ring</em>
-(anillo de la muerte). Este cap&iacute;tulo lidera una
-descripci&oacute;n del anillo de la muerte y como eso se usa por la
-primera traza de c&oacute;mo la funci&oacute;n <code>zap-to-char</code> funciona. Esta
-funci&oacute;n usa (o &lsquo;llama&rsquo;) a una funci&oacute;n que invoca a otra funci&oacute;n
-que manipula el anillo de la muerte. De este modo, antes de lograr las
-monta&ntilde;as, se escalan las colinas.
-</p>
-<p>Un cap&iacute;tulo subsiguiente describe c&oacute;mo el texto que se
-corta desde el b&uacute;ffer se recupera. V&eacute;ase la secci&oacute;n <a href="#Pegando">Pegando Texto</a>.
-</p>
-<hr>
-<a name="zap_002dto_002dchar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Almacenando-Texto" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Completar-zap_002dto_002dchar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="zap_002dto_002dchar-1"></a>
-<h2 class="section">8.1 <code>zap-to-char</code></h2>
-<a name="index-zap_002dto_002dchar"></a>
-
-<p>La funci&oacute;n <code>zap-to-char</code> cambi&oacute; poco entre GNU Emacs
-versi&oacute;n 19 y GNU Emacs versi&oacute;n 22. Sin embargo, <code>zap-to-char</code>
-llama a otra funci&oacute;n, <code>kill-region</code>, que se reescribi&oacute; m&aacute;s.
-</p>
-<p>La funci&oacute;n <code>kill-region</code> en Emacs 19 es compleja, pero no usa
-c&oacute;digo que es importante en este momento. Se obviar&aacute;.
-</p>
-<p>La funci&oacute;n <code>kill-region</code> en Emacs 22 es m&aacute;s de f&aacute;cil leer
-que la misma funci&oacute;n en Emacs 19 e introduce un concepto muy
-importante, que el error maneja. Nosotros pasearemos a trav&eacute;s de la
-funci&oacute;n.
-</p>
-<p>Pero primero, d&eacute;janos ver en la funci&oacute;n interactive <code>zap-to-char</code>.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Completar-zap_002dto_002dchar">La implementaci&oacute;n completa <code>zap-to-char</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La implementaci&oacute;n completa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#zap_002dto_002dchar-interactivo">8.1.1 La expresi&oacute;n <code>interactive</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una expresi&oacute;n interactiva de tres partes.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#cuerpo-zap_002dto_002dchar">8.1.2 El cuerpo de <code>zap-to-char</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un resumen corto
-</td></tr>
-<tr><td align="left" valign="top"><a href="#search_002dforward">8.1.3 La funci&oacute;n <code>search-forward</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo buscar una cadena.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#progn">8.1.4 La forma especial <code>progn</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Resumiendo-zap_002dto_002dchar">8.1.5 Resumiendo <code>zap-to-char</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usando <code>point</code> y <code>search-forward</code>.
-</td></tr>
-</table>
-
-<hr>
-<a name="Completar-zap_002dto_002dchar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#zap_002dto_002dchar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#zap_002dto_002dchar" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#zap_002dto_002dchar-interactivo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-implementacion-completa-zap_002dto_002dchar"></a>
-<h3 class="unnumberedsubsec">La implementaci&oacute;n completa <code>zap-to-char</code></h3>
-
-<p>La funci&oacute;n <code>zap-to-char</code> elimina el texto en la regi&oacute;n entre
-la localizaci&oacute;n del curso (por ej. punto) para incluir la siguiente
-ocurrencia de un caracter espec&iacute;fico. El texto que
-<code>zap-to-char</code> borra es puesto en el kill ring <em>anillo de la
-muerte</em>; y puede ser recuperado desde el kill ring <em>anillo de la
-muerte</em> escribiendo <kbd>C-y</kbd> (<code>yank</code>). Si el comando dado es un
-argumento, eso borra texto a trav&eacute;s de este n&uacute;mero de
-ocurrencias. De este modo, si el cursor estuviera al principio de esta
-frase y el car&aacute;cter fuera &lsquo;<samp>s</samp>&rsquo;, &lsquo;<samp>De este modo</samp>&rsquo;
-ser&iacute;a borrado. Si el argumento fueran dos, &lsquo;<samp>De este
-modo, si el cursor</samp>&rsquo; se borrase, y incluir&iacute;a la &lsquo;<samp>s</samp>&rsquo;
-en el &lsquo;<samp>cursor</samp>&rsquo;.
-</p>
-<p>Si el car&aacute;cter espec&iacute;fico no encuentra <code>zap-to-char</code>
-dir&aacute; &ldquo;B&uacute;squeda fallida&rdquo;, eso cuenta el car&aacute;cter que se
-escribi&oacute;, y no elimin&oacute; cualquier texto.
-</p>
-<p>En orden para determinar cu&aacute;nto texto eliminar <code>zap-to-char</code> usa
-una funci&oacute;n de b&uacute;squeda. Las b&uacute;squedas son usadas extensivamente
-en el c&oacute;digo que manipula texto, y focalizar&aacute; la atenci&oacute;n en
-ellos tan bien como el comando de borrado.
-</p>
-
-<p>Aqu&iacute; est&aacute; el texto completo de la versi&oacute;n 22 de la
-funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun zap-to-char (arg char)
- &quot;Corta e incluye ARG'th ocurrencia de CHAR
-En caso de ser ignorada si `case-fold-search' es no nulo en el
- b&uacute;ffer actual.
-Para ir atr&aacute;s si ARG es negativo; error si CHAR no se encuentra.&quot;
- (interactive &quot;p\ncZap to char: &quot;)
- (if (char-table-p translation-table-for-input)
- (setq char (or (aref translation-table-for-input char) char)))
- (kill-region (point) (progn
- (search-forward (char-to-string char)
- nil nil arg)
- (point))))
-</pre></div>
-
-<p>La documentaci&oacute;n es en l&iacute;nea. Se necesita conocer el
-significado de la jerga de la palabra &lsquo;kill&rsquo;.
-</p>
-<hr>
-<a name="zap_002dto_002dchar-interactivo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Completar-zap_002dto_002dchar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#zap_002dto_002dchar" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#cuerpo-zap_002dto_002dchar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-expresion-interactive"></a>
-<h3 class="subsection">8.1.1 La expresi&oacute;n <code>interactive</code></h3>
-
-<p>La expresi&oacute;n interactiva en el comando <code>zap-to-char</code> se ve
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(interactive &quot;p\ncZap to char: &quot;)
-</pre></div>
-
-<p>La parte con comillas, <code>&quot;p\ncZap to char: &quot;</code> <em>Cortar a
-caracter</em>, especifica dos cosas diferentes. Primero, y m&aacute;s simple es
-el &lsquo;<samp>p</samp>&rsquo;. Este parte se separa desde la siguiente parte por una
-nueva l&iacute;nea, &lsquo;<samp>\n</samp>&rsquo;. El &lsquo;<samp>p</samp>&rsquo; significa que la
-parte del primero argumento a la funci&oacute;n ser&aacute; pasando el valor de
-un &lsquo;prefijo procesado&rsquo;. El argumento prefijo es pasado escribiendo
-<kbd>C-u</kbd> y un n&uacute;mero, o <kbd>M-</kbd> y un n&uacute;mero. Si la funci&oacute;n es
-llamada interactivamente sin un prefijo, el n&uacute;mero que se pasa es 1.
-</p>
-<p>La segunda parte de <code>&quot;p\ncZap a caracter: &quot;</code> es &lsquo;<samp>cZap a
-car&aacute;cter:</samp>&rsquo;. En esta parte, la tecla baja &lsquo;<samp>c</samp>&rsquo; indica que
-<code>interactive</code> espera una consola que el argumento ser&aacute; un
-caracter. La consola sigue el &lsquo;<samp>c</samp>&rsquo; y es la cadena &lsquo;<samp>Zap a
-caracter: </samp>&rsquo; (con un espacio despu&eacute;s del punto y coma para hacerlo
-bien).
-</p>
-<p>Todo lo que se hace es preparar los argumentos para <code>zap-to-char</code>
-as&iacute; est&aacute;n en el tipo correcto, y dan al usuario un
-prompt.
-</p>
-<p>En un b&uacute;ffer de solo lectura, la funci&oacute;n <code>zap-to-char</code> copia
-el texto al anillo de la muerte, no se elimina. El &aacute;rea echo muestra
-un mensaje diciendo que el b&uacute;ffer es de solo lectura. Tambi&eacute;n, la
-terminal avisa con un pitido.
-</p>
-<hr>
-<a name="cuerpo-zap_002dto_002dchar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#zap_002dto_002dchar-interactivo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#zap_002dto_002dchar" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#search_002dforward" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-cuerpo-de-zap_002dto_002dchar"></a>
-<h3 class="subsection">8.1.2 El cuerpo de <code>zap-to-char</code></h3>
-
-<p>El cuerpo de la funci&oacute;n <code>zap-to-char</code> contiene el c&oacute;digo que
-mata (que se borra/corta) el texto en la regi&oacute;n desde la posici&oacute;n
-actual del cursor e incluyendo el car&aacute;cter especificado.
-</p>
-<p>La primera parte del c&oacute;digo se ve como:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (char-table-p translation-table-for-input)
- (setq char (or (aref translation-table-for-input char) char)))
-(kill-region (point) (progn
- (search-forward (char-to-string char) nil nil arg)
- (point)))
-</pre></div>
-
-<p><code>char-table-p</code> es una funci&oacute;n prescrita no vista. Eso determina
-si sus argumentos son una tabla de caracteres. As&iacute;, se
-asigna el car&aacute;cter pasado a <code>zap-to-char</code> a uno de ellos, si
-este car&aacute;cter existe, o al car&aacute;cter en s&iacute;. (Esto
-llega a ser importante para ciertos caracteres en lenguajes no
-Europeos. La funci&oacute;n <code>aref</code> extrae un elemento desde un
-array. Eso es una funci&oacute;n espec&iacute;fica de array que no
-est&aacute; descrita en este documento. See <a href="elisp.html#Array">Arrays</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>.)
-</p>
-<p>Lo que devuelve <code>(point)</code> es la posici&oacute;n actual del cursor.
-</p>
-<p>La siguiente parte del c&oacute;digo es una expresi&oacute;n usando
-<code>progn</code>. El cuerpo del <code>progn</code> se basa en llamadas a
-<code>search-forward</code> y <code>point</code>.
-</p>
-<p>Es f&aacute;cil comprender c&oacute;mo <code>progn</code> funciona despu&eacute;s de aprender
-acerca de <code>search-forward</code>, as&iacute; se ver&aacute; en
-<code>search-forward</code> y entonces en <code>progn</code>.
-</p>
-<hr>
-<a name="search_002dforward"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#cuerpo-zap_002dto_002dchar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#zap_002dto_002dchar" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#progn" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-search_002dforward"></a>
-<h3 class="subsection">8.1.3 La funci&oacute;n <code>search-forward</code></h3>
-<a name="index-search_002dforward"></a>
-
-<p>La funci&oacute;n <code>search-forward</code> se usa para localizar el
-zapped-for-character en <code>zap-to-char</code>. Si la b&uacute;squeda es
-exitosa, <code>search-forward</code> deja el punto inmediatamente despu&eacute;s
-del &uacute;ltimo car&aacute;cter en la cadena objetivo. (En <code>zap-to-char</code>,
-la cadena objetivo es solo un car&aacute;cter largo. <code>zap-to-char</code> usa
-la funci&oacute;n <code>char-to-string</code> para asegurar que el ordenador
-trata este car&aacute;cter como una cadena). Si la b&uacute;squeda es hacia
-atr&aacute;s, <code>search-forward</code> deja el punto solo antes del primer
-car&aacute;cter en el objetivo. Tambi&eacute;n, <code>search-forward</code> devuelve
-<code>t</code> para verdad. (Moviendo el punto all&iacute; es un
-&lsquo;efecto lateral&rsquo;.)
-</p>
-<p>En <code>zap-to-char</code>, la funci&oacute;n <code>search-forward</code> se ve
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(search-forward (char-to-string char) nil nil arg)
-</pre></div>
-
-<p>La funci&oacute;n <code>search-forward</code> toma cuatro argumentos:
-</p>
-<ol>
-<li>
-El primer argumento es el objetivo, para el que es buscado. Esto debe
-ser una cadena, tal como &lsquo;<samp>&quot;z&quot;</samp>&rsquo;.
-
-<p>Cuando eso ocurre, el argumento pasado a <code>zap-to-char</code> es un
-caracter simple. Debido a la forma en la que los ordenadores son
-construidos, el int&eacute;rprete Lisp puede tratar un caracter simple
-siendo diferente desde una cadena de caracteres. Dentro del ordenador,
-un caracter simple tiene un formato electr&oacute;nico en vez de una cadena
-de un caracter. (Un caracter simple puede con frecuencia ser grabado
-en el ordenador usando exactamente un byte; pero una cadena puede ser
-larga, y el ordenador necesita estar listo para esto.) Desde que la
-funci&oacute;n <code>search-forward</code> busca una cadena, el caracter que la
-funci&oacute;n <code>zap-to-char</code> recibe como argumento debe ser
-convertida dentro del ordenador de un formato a otro; de otro modo,
-la funci&oacute;n <code>search-forward</code> fallar&aacute;. La funci&oacute;n
-<code>char-to-string</code> es usada para hacer esta conversi&oacute;n.
-</p>
-</li><li>
-El segundo argumento asocia la b&uacute;squeda; eso se especifica como
-una posici&oacute;n en el b&uacute;ffer. En este caso, la b&uacute;squeda puede ir al
-final del b&uacute;ffer, as&iacute; no se asigna y el segundo
-argumento es <code>nil</code>.
-
-</li><li>
-El tercer argumento cuenta la funci&oacute;n que har&iacute;a si la
-b&uacute;squeda cae &mdash; eso puede se&ntilde;alar un error (e imprimir un
-mensaje) o puede devolver <code>nil</code>. Un <code>nil</code> como tercer
-argumento hace que la funci&oacute;n se&ntilde;ale un error cuando la b&uacute;squeda
-falla.
-
-</li><li>
-El cuarto argumento <code>search-forward</code> es el contaje repetido &mdash;
-cu&aacute;ntas ocurrencias de la cadena para buscar. Este argumento es
-opcional y si la funci&oacute;n es llamada sin un contaje repetido, este
-argumento pasa el valor 1. Si este argumento es negativo, la
-b&uacute;squeda va hacia atr&aacute;s.
-</li></ol>
-
-<p>En la forma de plantilla, una expresi&oacute;n <code>search-forward</code> se ve
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(search-forward &quot;<var>cadena-a-buscar</var>&quot;
- <var>limite-de-busqueda</var>
- <var>que-hacer-si-la-busqueda-falla</var>
- <var>repetir-contaje</var>)
-</pre></div>
-
-<p>Lo siguiente es echar un vistazo a <code>progn</code>.
-</p>
-<hr>
-<a name="progn"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#search_002dforward" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#zap_002dto_002dchar" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Resumiendo-zap_002dto_002dchar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-forma-especial-progn"></a>
-<h3 class="subsection">8.1.4 La forma especial <code>progn</code></h3>
-<a name="index-progn"></a>
-
-<p><code>progn</code> es una forma especial que causa que cada uno de sus
-argumentos puedan ser evaluados en secuencia y entonces devuelve el valor
-del &uacute;ltimo. Las expresiones precedentes son evaluadas solo por los
-efectos laterales que ellos desarrollan. Los valores producidos por
-ellos son descartados.
-</p>
-<p>La plantilla para una expresi&oacute;n <code>progn</code> es muy simple:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(progn
- <var>body</var>&hellip;)
-</pre></div>
-
-<p>En <code>zap-to-char</code>, la expresi&oacute;n <code>progn</code> tiene que hacer dos
-cosas: poner el punto en la posici&oacute;n exacta; y devolver la
-posici&oacute;n del punto de modo que <code>kill-region</code> conoce c&oacute;mo de
-lejos se copia.
-</p>
-<p>El primer argumento de <code>progn</code> es <code>search-forward</code>. Cuando
-<code>search-forward</code> encuentra la cadena, la funci&oacute;n deja el punto
-inmediatamente despu&eacute;s del &uacute;ltimo caracter en la cadena
-objetivo. (En este caso la cadena objetivo es solo un car&aacute;cter
-largo.) Si la b&uacute;squeda es hacia atr&aacute;s, <code>search-forward</code> deja
-el punto justo antes del primer car&aacute;cter en el objetivo. El
-movimiento del punto es un efecto lateral.
-</p>
-<p>El segundo y &uacute;ltimo argumento de <code>progn</code> es la expresi&oacute;n
-<code>(point)</code>. Esta expresi&oacute;n devuelve el valor del punto, que en
-este caso ser&aacute; la localizaci&oacute;n para la que se ha movido por
-<code>search-forward</code>. (En la fuente, una l&iacute;nea que
-cuenta la funci&oacute;n para ir al car&aacute;cter previo, si se est&aacute; yendo
-hacia delante, se coment&oacute; en 1999; yo no recuerdo si esta
-funcionalidad o no funcionalidad era siempre parte de las fuentes
-distribuidas.) El valor de <code>point</code> se devuelve por la expresi&oacute;n
-<code>progn</code> y se pasa a <code>kill-region</code> como el segundo argumento
-de <code>kill-region</code> .
-</p>
-<hr>
-<a name="Resumiendo-zap_002dto_002dchar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#progn" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#zap_002dto_002dchar" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#kill_002dregion" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Resumiendo-zap_002dto_002dchar-1"></a>
-<h3 class="subsection">8.1.5 Resumiendo <code>zap-to-char</code></h3>
-
-<p>Ahora que se ha visto c&oacute;mo <code>search-forward</code> y <code>progn</code>
-trabajan, se puede ver c&oacute;mo la funci&oacute;n <code>zap-to-char</code>
-funciona como un todo.
-</p>
-<p>El primer argumento de <code>kill-region</code> es la posici&oacute;n del cursor
-cuando el comando <code>zap-to-char</code> da &mdash; el valor del punto en este
-momento. Con el <code>progn</code>, la b&uacute;squeda de la funci&oacute;n mueve el
-punto a solo despu&eacute;s del zapped-to-character y <code>point</code> devuelve
-el valor de localizaci&oacute;n. La funci&oacute;n <code>kill-region</code> pone junto
-a estos dos valores de punto, el primero como el principio de la
-regi&oacute;n y el segundo como el fin de la regi&oacute;n, y borra la
-regi&oacute;n.
-</p>
-<p>La forma especial <code>progn</code> se necesita porque el comando
-<code>kill-region</code> toma dos argumentos; y fallar&iacute;a si
-<code>search-forward</code> y expresiones <code>point</code> fueran escritas en
-secuencia como dos argumentos adicionales. La expresi&oacute;n <code>progn</code>
-es un argumento simple para <code>kill-region</code> y devuelve un valor
-para que <code>kill-region</code> se necesite por su segundo argumento.
-</p>
-<hr>
-<a name="kill_002dregion"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Resumiendo-zap_002dto_002dchar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Completa-kill_002dregion" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="kill_002dregion-1"></a>
-<h2 class="section">8.2 <code>kill-region</code></h2>
-<a name="index-kill_002dregion"></a>
-
-<p>La funci&oacute;n <code>zap-to-char</code> usa la funci&oacute;n
-<code>kill-region</code>. Esta funci&oacute;n corta texto desde una regi&oacute;n y
-copia este texto al kill ring <em>anillo de la muerte</em>, desde el que
-puede ser recuperado.
-</p>
-
-<p>Tanto la versi&oacute;n de Emacs 22 de esta funci&oacute;n usa
-<code>condition-case</code> y <code>copy-region-as-kill</code>, ambas se
-explicar&aacute;n. <code>condition-case</code> es una forma especial importante.
-</p>
-<p>En esencia, la funci&oacute;n <code>kill-region</code> llama a
-<code>condition-case</code>, que toma tres argumentos. En esta funci&oacute;n, el
-primer argumento no hace nada. El segundo argumento contiene el
-c&oacute;digo hace el trabajo cuando todo va bien. El tercer argumento
-contiene el c&oacute;digo que se llama en el evento de un error.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Completa-kill_002dregion">La definici&oacute;n completa <code>kill-region</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La definici&oacute;n de funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#condition_002dcase">8.2.1 <code>condition-case</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Tratando con un problema.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Macro-Lisp">8.2.2 Macro Lisp</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-</table>
-
-<hr>
-<a name="Completa-kill_002dregion"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#kill_002dregion" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#kill_002dregion" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#condition_002dcase" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-definicion-completa-kill_002dregion"></a>
-<h3 class="unnumberedsubsec">La definici&oacute;n completa <code>kill-region</code></h3>
-
-<p>Ahora se puede volver a trav&eacute;s del c&oacute;digo <code>condition-case</code> en
-un momento. Primero, se echa un vistazo a la definici&oacute;n de
-<code>kill-region</code>, con comentarios a&ntilde;adidos:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun kill-region (beg end)
- &quot;Kill (\&quot;corta\&quot;) texto entre punto y marca.
-Esto borra el texto desde el b&uacute;ffer y lo guarda en anillo de la
- muerte <em>kill ring</em>.
-El comando \\[yank] puede recuperarse desde all&iacute;. &hellip;
- &quot;
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; &bull; Desde materias de orden, pasa el punto primero.
- (interactive (list (point) (mark)))
- ;; &bull; Y cu&eacute;ntanos si no podemos cortar el texto.
- ;; `a menos que' sea un `if' sin una then-part.
- (unless (and beg end)
- (error &quot;La marca no est&aacute; asignada ahora, as&iacute; que
- no hay regi&oacute;n&quot;))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; &bull; `condition-case' toma tres argumentos
- ;; Si el primer argumento es nulo, como aqu&iacute;
- ;; la informaci&oacute;n acerca del error no est&aacute;
- ;; almacenada para ser usada por otra funci&oacute;n
- (condition-case nil
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; &bull; El segundo argumento a `condition-case' cuenta lo que el
- ;; int&eacute;rprete que hace cuando todo va bien.
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; Empieza con una funci&oacute;n `let' que extrae la cadena
- ;; y chequea si existe. Si es as&iacute; (esto es lo
- ;; que `when' chequea), eso llama a una funci&oacute;n `if' que
- ;; determina si el comando previo que era otra llamada
- ;; si el comando previo fu&eacute; otra llamada a `kill-region';
- ;; si lo era, entonces el siguiente texto se a&ntilde;ade
- ;; cuando se chequea), eso llama a una funci&oacute;n `if' que
- ;; determina si el comando previo era otra llamada a
- ;; `kill-region'; si era eso, entonces el nuevo texto es
- ;; a&ntilde;adido al texto previo; si no, entonces una funci&oacute;n
- ;; diferente, `kill-new' se llama.
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; La funci&oacute;n `kill-append' concatena la nueva cadena y
- ;; la vieja. La funci&oacute;n `kill-new' inserta texto dentro de
- ;; &iacute;tem en el kill ring <em>anillo de la muerte</em>.
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; `when' es un `if' sin una parte else. El segundo `when'
- ;; de nuevo chequea si la cadena actual existe;
- ;; por a&ntilde;adidura, eso chequea si el comando previo fuese
- ;; otra llamada a `kill-region'. Si una u otra condici&oacute;n
- ;; es verdadero, entonces eso configura el actual comando a
- ;; ser `kill-region'.
-</pre><pre class="smallexample"> (let ((string (filter-buffer-substring beg end t)))
- (when string ;STRING is nil if BEG = END
- ;; Add that string to the kill ring, one way or another.
- (if (eq last-command 'kill-region)
-</pre><pre class="smallexample"> ;; - `yank-handler' es un argumento opcional para
- ;; `kill-region' que cuenta el `kill-append' y funciones
- ;; `kill-new' como tratan con propiedades a&ntilde;adidas
- ;; al texto, tal como `negrilla' o `it&aacute;lica'
- (kill-append string (&lt; end beg) yank-handler)
- (kill-new string nil yank-handler)))
- (when (or string (eq last-command 'kill-region))
- (setq this-command 'kill-region))
- nil)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; &bull; El tercer argumento a `condition-case' cuenta el int&eacute;rprete
- ;; qu&eacute; hacer con un error.
-</pre><pre class="smallexample"> ;; El tercer argumento tiene una parte de condiciones y una
- ;; parte del cuerpo.
- ;; Si las condiciones se encuentra (en este caso,
- ;; si el texto o b&uacute;ffer son de solo lectura)
- ;; entonces el cuerpo es ejecutado.
-</pre><pre class="smallexample"> ;; La primera parte del tercer es el siguiente:
- ((buffer-read-only text-read-only) ;; parte if
- ;; &hellip; parte then-part
- (copy-region-as-kill beg end)
-</pre><pre class="smallexample"> ;; Lo siguiente, tambi&eacute;n como parte de la then-part, asigna this-command, as&iacute;
- ;; ser&aacute; asignado en un error
- (setq this-command 'kill-region)
- ;; Finalmente, en la then-part, env&iacute;a un mensaje
- ;; si se puede copiar el texto al anillo de la muerte
- ;; <em>kill ring</em> sin se&ntilde;alar un error, pero no si no se puede.
-
-</pre><pre class="smallexample"> (if kill-read-only-ok
- (progn (message &quot;Lee solo texto copiado para el kill ring&quot;) nil)
- (barf-if-buffer-read-only)
- ;; If the buffer isn't read-only, the text is.
- (signal 'text-read-only (list (current-buffer)))))
-</pre></div>
-
-
-<hr>
-<a name="condition_002dcase"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Completa-kill_002dregion" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#kill_002dregion" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Macro-Lisp" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="condition_002dcase-1"></a>
-<h3 class="subsection">8.2.1 <code>condition-case</code></h3>
-<a name="index-condition_002dcase"></a>
-
-<p>Como se ha visto antes (v&eacute;ase la secci&oacute;n <a href="#Creando-errores">Genera un Mensaje de Error</a>), cuando el int&eacute;rprete Emacs Lisp tiene problemas evaluando
-una expresi&oacute;n, se provee de una ayuda; en jerga, se dice &ldquo;signaling an
-error&rdquo; <em>se&ntilde;alando un error</em>. Normalmente, el ordenador para el
-programa y te muestra un mensaje.
-</p>
-<p>Sin embargo, algunos programas garantizan acciones complicadas. Eso no
-parar&iacute;a en un error. En la funci&oacute;n <code>kill-region</code>,
-la mayor&iacute;a parece un error que intentar&aacute; cortar texto
-que es de solo lectura y no puede ser eliminado. As&iacute; la
-funci&oacute;n <code>kill-region</code> contiene c&oacute;digo para manejar esta
-circunstancia. Este c&oacute;digo, hace que el cuerpo de la funci&oacute;n
-<code>kill-region</code>, est&eacute; dentro de una forma especial
-<code>condition-case</code>.
-</p>
-<p>La plantilla para <code>condition-case</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(condition-case
- <var>var</var>
- <var>bodyform</var>
- <var>error-handler</var>&hellip;)
-</pre></div>
-
-<p>El segundo argumento, <var>bodyform</var> es sencillo. La forma especial
-<code>condition-case</code> causa que el int&eacute;rprete Lisp eval&uacute;e el
-c&oacute;digo en <var>bodyform</var>. Si ning&uacute;n error ocurre, la forma
-especial devuelve el valor del c&oacute;digo y produce efectos laterales,
-si hay.
-</p>
-<p>En resumen, la parte <var>bodyform</var> de una expresi&oacute;n
-<code>condition-case</code> determina qu&eacute; ocurre cuando cualquier cosa
-funciona correctamente.
-</p>
-<p>Sin embargo, si un error ocurre, entre sus otras acciones, la
-funci&oacute;n genera la se&ntilde;al de error que definir&aacute; uno o m&aacute;s
-errores de nombres de condici&oacute;n.
-</p>
-<p>Un manejador de errores es el tercer argumento para
-<code>condition-case</code>. Un manejador de errores tiene dos partes, un
-<var>condition-name</var> y un <var>body</var>. Si la parte <var>condition-name</var>
-tiene un manejador de errores encuentra un nombre de condici&oacute;n generado
-por un error, entonces la parte del <var>body</var> del manejador de errores
-se ejecuta.
-</p>
-<p>Como se esperar&iacute;a, la parte <var>condition-name</var> de un
-manejador de errores puede ser as&iacute;, un nombre de
-condici&oacute;n simple o una lista de nombres de condici&oacute;n.
-</p>
-<p>Tambi&eacute;n, una expresi&oacute;n completa <code>condition-case</code> puede
-contener m&aacute;s de un manejador de errores. Cuando un error ocurre, el
-primer manejador aplicable se ejecuta.
-</p>
-<p>Finalmente, el primer argumento a la expresi&oacute;n
-<code>condition-case</code>, es el argumento <var>var</var>, que es algunas veces
-asignado a una variable que contiene informaci&oacute;n acerca del
-error. Sin embargo, si este argumento es nulo, como es el caso en
-<code>kill-region</code>, esta informaci&oacute;n se descarta.
-</p>
-<p>En breve, en la funci&oacute;n <code>kill-region</code>, el c&oacute;digo
-<code>condition-case</code> funciona as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample"><var>Si no hay errores</var>, <var>ejecuta solo este c&oacute;digo</var>
- <var>pero</var>, <var>si hay errores</var>, <var>ejecuta este otro c&oacute;digo</var>.
-</pre></div>
-
-
-<hr>
-<a name="Macro-Lisp"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#condition_002dcase" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#kill_002dregion" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#copy_002dregion_002das_002dkill" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Macro-Lisp-1"></a>
-<h3 class="subsection">8.2.2 Macro Lisp</h3>
-<a name="index-Macro_002c-lisp"></a>
-<a name="index-Macro-Lisp"></a>
-
-<p>La parte de la expresi&oacute;n <code>condition-case</code> que se eval&uacute;a en la
-expectativa de que todo va bien si tiene un <code>when</code>. El c&oacute;digo usa
-<code>when</code> para determinar si la variable <code>string</code> (<em>cadena</em>)
-apunta al texto que existe.
-</p>
-<p>Una expresi&oacute;n <code>when</code> es simplemente una conveniencia de
-programadores. Eso es un <code>if</code> sin la posibilidad de una
-cl&aacute;usula else. En tu mente, se puede reemplazar <code>when</code> con
-<code>if</code> y comprender de que va. Esto es lo que el int&eacute;rprete Lisp hace.
-</p>
-<p>T&eacute;cnicamente hablando, <code>when</code> es una macro Lisp. Una
-<em>macro</em> Lisp permite definir una nueva construcci&oacute;n de control y
-otras funcionalidades del lenguaje. Eso cuenta al int&eacute;rprete c&oacute;mo
-computar otra expresi&oacute;n Lisp que dejar&aacute; de computar el valor. En
-este caso, la &lsquo;otra expresi&oacute;n&rsquo; es una expresi&oacute;n <code>if</code>.
-</p>
-<p>La definici&oacute;n de funci&oacute;n tambi&eacute;n tiene una macro <code>unless</code>;
-que acompa&ntilde;a a <code>when</code>. La macro <code>unless</code> es un
-<code>if</code> sin una cl&aacute;usula then.
-</p>
-<p>Para m&aacute;s acerca de macros Lisp, ver <a href="elisp.html#Macros">Macros</a> in <cite>El Manual de Referencia de Emacs Lisp</cite>. El lenguaje de programaci&oacute;n C
-tambi&eacute;n provee macros. Estos son diferentes, pero tambi&eacute;n &uacute;tiles.
-</p>
-
-<p>Guardando la macro <code>when</code>, en la expresi&oacute;n
-<code>condition-case</code>, cuando la cadena tiene contenido, entonces otra
-expresi&oacute;n condicional se ejecuta. Esto es un <code>if</code> tanto con una
-then-part y como con una else-part.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (eq last-command 'kill-region)
- (kill-append string (&lt; end beg) yank-handler)
- (kill-new string nil yank-handler))
-</pre></div>
-
-<p>La parte then (then-part) se eval&uacute;a si el comando previo fu&eacute; otra
-llamada para <code>kill-region</code>; si no, se eval&uacute;a la parte else
-(else-part)
-</p>
-<p><code>yank-handler</code> es un argumento opcional para <code>kill-region</code>
-que cuenta c&oacute;mo las funciones <code>kill-append</code> y <code>kill-new</code> se
-tratan con propiedades a&ntilde;adidas al texto, tal como &lsquo;negrilla&rsquo; o
-&lsquo;it&aacute;lica&rsquo;.
-</p>
-<p><code>last-command</code> es una variable que viene con Emacs y que no se ha
-visto antes. Normalmente, siempre y cuando una funci&oacute;n se ejecute,
-Emacs asigna el valor de <code>last-command</code> al comando previo.
-</p>
-<p>En este segmento de la definici&oacute;n, la expresi&oacute;n <code>if</code> chequea
-si el comando previo era <code>kill-region</code>. Si era eso,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(kill-append string (&lt; end beg) yank-handler)
-</pre></div>
-
-<p>Se concatena una copia del nuevo texto cortado al texto cortado
-previamente en el kill ring <em>anillo de la muerte</em>.
-</p>
-<hr>
-<a name="copy_002dregion_002das_002dkill"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Macro-Lisp" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Completar-copy_002dregion_002das_002dkill" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="copy_002dregion_002das_002dkill-1"></a>
-<h2 class="section">8.3 <code>copy-region-as-kill</code></h2>
-<a name="index-copy_002dregion_002das_002dkill"></a>
-<a name="index-nthcdr-1"></a>
-
-<p>La funci&oacute;n <code>copy-region-as-kill</code> copia una regi&oacute;n de texto
-desde un b&uacute;ffer y (via <code>kill-append</code> o <code>kill-new</code>) lo
-guarda en el <code>kill-ring</code>.
-</p>
-<p>Si se llama a <code>copy-region-as-kill</code> inmediatamente despu&eacute;s de
-un comando <code>kill-region</code>, Emacs inserta el texto nuevamente
-copiado al texto copiado previamente. Esto significa que si se pega el
-texto, se obtiene todo, tanto esto, como la operaci&oacute;n previa. Por
-otro lado, si alg&uacute;n otro comando precede la
-<code>copy-region-as-kill</code>, la funci&oacute;n copia el texto dentro de una
-entrada separada el kill ring <em>anillo de la muerte</em>.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Completar-copy_002dregion_002das_002dkill">La definici&oacute;n de la funci&oacute;n completa <code>copy-region-as-kill</code>.</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La definici&oacute;n completa de funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#cuerpo-copy_002dregion_002das_002dkill">8.3.1 El cuerpo de <code>copy-region-as-kill</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-</table>
-
-<hr>
-<a name="Completar-copy_002dregion_002das_002dkill"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#copy_002dregion_002das_002dkill" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#copy_002dregion_002das_002dkill" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#cuerpo-copy_002dregion_002das_002dkill" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-definicion-de-la-funcion-completa-copy_002dregion_002das_002dkill_002e"></a>
-<h3 class="unnumberedsubsec">La definici&oacute;n de la funci&oacute;n completa <code>copy-region-as-kill</code>.</h3>
-
-<p>Aqu&iacute; est&aacute; el texto completo de la versi&oacute;n 22
-de la funci&oacute;n <code>copy-region-as-kill</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun copy-region-as-kill (beg end)
- &quot;Guarda la regi&oacute;n como si estuviera cortada, pero no la cortes.
-En el modo Marca de Tr&aacute;nsito <em>Transient Mark</em>, se desactiva la
- marca.
-Si `interprogram-cut-function' es no nulo, tambi&eacute;n se guarda el
- texto para una sistema de ventanas de cortar y pegar.&quot;
- (interactive &quot;r&quot;)
-</pre><pre class="smallexample"> (if (eq last-command 'kill-region)
- (kill-append (filter-buffer-substring beg end) (&lt; end beg))
- (kill-new (filter-buffer-substring beg end)))
-</pre><pre class="smallexample"> (if transient-mark-mode
- (setq deactivate-mark t))
- nil)
-</pre></div>
-
-<p>De normal, esta funci&oacute;n puede ser dividida dentro sus componentes:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun copy-region-as-kill (<var>argument-list</var>)
- &quot;<var>documentation</var>&hellip;&quot;
- (interactive &quot;r&quot;)
- <var>body</var>&hellip;)
-</pre></div>
-
-<p>Los argumentos son <code>beg</code> y <code>end</code> y la funci&oacute;n es
-interactiva con <code>&quot;r&quot;</code>, as&iacute; los dos argumentos deben
-referirse al principio y al final de la regi&oacute;n. Si ha estado
-leyendo a trav&eacute;s de este documento desde el principio, comprendiendo
-estas partes de una funci&oacute;n casi llegar&iacute;a a ser rutina.
-</p>
-<p>La documentaci&oacute;n es algo confusa a menos que se recuerde que la
-palabra &lsquo;kill&rsquo; <em>matar, cortar</em> tiene un significado diferente de la
-usual. La &lsquo;Marca Transitoria&rsquo; y <code>interprogram-cut-function</code>
-comenta explicar ciertos efectos laterales.
-</p>
-<p>Despu&eacute;s de que se ha asignado una marca, un b&uacute;ffer siempre
-contiene una regi&oacute;n. Si se desea se puede usar el modo Marca
-Transitoria para iluminar la regi&oacute;n temporalmente. (Nadie quiere
-iluminar la regi&oacute;n todo el rato, as&iacute; el modo Marca
-Transitoria subrraya solo en el momento apropiado. Muchas personas
-desactivan el modo Marca Transitoria, as&iacute; la regi&oacute;n
-nunca se ilumina.)
-</p>
-<p>Tambi&eacute;n, un sistema de ventanas permite copiar, cortar y pegar entre
-programas diferentes. En el sistema de X windows, por ejemplo, la
-funci&oacute;n <code>interprogram-cut-function</code> es <code>x-select-text</code>,
-que funciona con el sistema de ventanas equivalente del kill ring de
-Emacs.
-</p>
-<p>El cuerpo de la funci&oacute;n <code>copy-region-as-kill</code> empieza con una
-cl&aacute;usula <code>if</code>. Lo que esta cl&aacute;usula hace es distinguir entre
-dos situaciones diferentes: si este comando se ejecuta o no
-inmediatamente despu&eacute;s de un comando previo <code>kill-region</code>. En
-el primer caso, la nueva regi&oacute;n se concatena al texto copiado
-previamente. De otro modo, eso se inserta al principio del anillo de
-la muerte <em>kill ring</em> como una pieza separada de texto desde la
-pieza previa.
-</p>
-<p>Las dos l&iacute;neas de la funci&oacute;n previene la regi&oacute;n
-desde la iluminaci&oacute;n si el modo Transient Mark <em>Marca
-Transitoria</em> est&aacute; activado.
-</p>
-<p>El cuerpo de <code>copy-region-as-kill</code> merece discusi&oacute;n en detalle.
-</p>
-<hr>
-<a name="cuerpo-copy_002dregion_002das_002dkill"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Completar-copy_002dregion_002das_002dkill" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#copy_002dregion_002das_002dkill" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#last_002dcommand-_0026-this_002dcommand" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-cuerpo-de-copy_002dregion_002das_002dkill"></a>
-<h3 class="subsection">8.3.1 El cuerpo de <code>copy-region-as-kill</code></h3>
-
-<p>La funci&oacute;n <code>copy-region-as-kil</code> funciona de un modo parecido a
-la funci&oacute;n <code>kill-region</code>. Ambas est&aacute;n escritas
-de un modo que dos o m&aacute;s textos cortados en una fila combinan
-su texto en una entrada simple. Si se pega el texto desde el
-anillo de la muerte <em>kill ring</em>, se tiene todo en una
-pieza. M&aacute;s all&aacute;, los cortes de textos que se cortan hacia adelante
-desde la posici&oacute;n actual del cursor se a&ntilde;aden al fin del texto
-copiado previamente y comanda este texto copiado vaya hacia atr&aacute;s al
-principio del texto copiado previamente. De este modo, las palabras en
-el texto est&aacute;n en el orden apropiado.
-</p>
-<p>Como <code>kill-region</code>, la funci&oacute;n <code>copy-region-as-kill</code> hace
-uso de la variable <code>last-command</code> que deja traza del comando de
-Emacs previo.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#last_002dcommand-_0026-this_002dcommand"><code>last-command</code> y <code>this-command</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> last-command &amp; this-command
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Funci_00f3n-kill_002dappend">La funci&oacute;n <code>kill-append</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Funci&oacute;n kill-append
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Funci&oacute;n kill-new
-</td></tr>
-</table>
-
-<hr>
-<a name="last_002dcommand-_0026-this_002dcommand"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#cuerpo-copy_002dregion_002das_002dkill" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#cuerpo-copy_002dregion_002das_002dkill" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Funci_00f3n-kill_002dappend" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="last_002dcommand-y-this_002dcommand"></a>
-<h4 class="unnumberedsubsubsec"><code>last-command</code> y <code>this-command</code></h4>
-
-<p>Normalmente, siempre y cuando una funci&oacute;n se ejecuta, Emacs asigna
-el valor de <code>this-command</code> a la funci&oacute;n que se ejecuta (que en
-este caso ser&iacute;a <code>copy-region-as-kill</code>). Al mismo
-tiempo, Emacs asigna el valor de <code>last-command</code> al valor previo
-de <code>this-command</code>.
-</p>
-<p>En la primera parte del cuerpo de la funci&oacute;n
-<code>copy-region-as-kill</code>, una expresi&oacute;n <code>if</code> determina si el
-valor de <code>last-command</code> es <code>kill-region</code>. Si es
-as&iacute;, la then-part de la expresi&oacute;n <code>if</code> se
-eval&uacute;a; eso usa la funci&oacute;n <code>kill-append</code> para concatenar el
-texto copiado en esta llamada a la funci&oacute;n con el texto ya en el
-primer elemento (el <small>CAR</small> del anillo de la muerte. Por otro lado,
-si el valor de <code>last-command</code> no es <code>kill-region</code>, entonces
-la funci&oacute;n <code>copy-region-as-kill</code> adjunta un nuevo elemento al
-anillo de la muerte <em>kill ring</em> usando la funci&oacute;n
-<code>kill-new</code>.
-</p>
-<p>La expresi&oacute;n <code>or</code> se ve as&iacute;; usa <code>eq</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (if (eq last-command 'kill-region)
- ;; <span class="roman">parte then</span>
- (kill-append (filter-buffer-substring beg end) (&lt; end beg))
- ;; <span class="roman">parte else</span>
- (kill-new (filter-buffer-substring beg end)))
-</pre></div>
-
-<a name="index-filter_002dbuffer_002dsubstring"></a>
-<p>(La funci&oacute;n <code>filter-buffer-substring</code> devuelve una subcadena
-filtrada del b&uacute;ffer, cualquiera. Opcionalmente &mdash; los argumentos no
-est&aacute;n aqu&iacute;, as&iacute; nunca est&aacute; hecho &mdash;
-la funci&oacute;n puede borrar el texto inicial o devolver el texto sin sus
-propiedades; esta funci&oacute;n es un reemplazo para la vieja funci&oacute;n
-<code>buffer-substring</code>, que viene antes que las propiedades del texto
-fuesen implementadas.)
-</p>
-<a name="index-eq-_0028ejemplo-de-uso_0029"></a>
-<p>La funci&oacute;n <code>eq</code> chequea si su primer argumento es el mismo
-objeto Lisp que su segundo argumento. La funci&oacute;n <code>eq</code> es
-similar a la funci&oacute;n <code>equal</code> en esto que es usado para chequear
-para igualdad, pero difiere en esto que determina si dos
-representaciones son actualmente el mismo objeto dentro del ordenador,
-pero con diferentes nombres. <code>equal</code> determina si la estructura y
-contenidos de dos expresiones son la misma.
-</p>
-<p>Si el comando previo era <code>kill-region</code>, entonces el int&eacute;rprete
-Emacs Lisp llama a la funci&oacute;n <code>kill-append</code>
-</p>
-<hr>
-<a name="Funci_00f3n-kill_002dappend"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#last_002dcommand-_0026-this_002dcommand" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#cuerpo-copy_002dregion_002das_002dkill" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Funci_00f3n-kill_002dnew" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-kill_002dappend"></a>
-<h4 class="unnumberedsubsubsec">La funci&oacute;n <code>kill-append</code></h4>
-<a name="index-kill_002dappend"></a>
-
-<p>La funci&oacute;n <code>kill-new</code> se ve como as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun kill-append (string before-p &amp;optional yank-handler)
- &quot;Inserta STRING al fin del &uacute;ltimo corte en el anillo de la muerte <em>kill ring</em>.
-Si BEFORE-P es no nulo, inserta STRING.
-&hellip; &quot;
- (let* ((cur (car kill-ring)))
- (kill-new (if before-p (concat string cur) (concat cur string))
- (or (= (length cur) 0)
- (equal yank-handler
- (get-text-property 0 'yank-handler cur)))
- yank-handler)))
-</pre></div>
-
-
-<p>La funci&oacute;n <code>kill-append</code> es limpia. Usa la funci&oacute;n
-<code>kill-new</code>, que discutiremos en m&aacute;s detalle en un momento.
-</p>
-<p>(Tambi&eacute;n, la funci&oacute;n provee un argumento opcional llamado
-<code>yank-handler</code>; cuando se invoque, este argumento cuenta a la
-funci&oacute;n c&oacute;mo tratar con la propiedades a&ntilde;adidas al texto, tales
-como &lsquo;negrilla&rsquo; o &lsquo;it&aacute;licas&rsquo;.)
-</p>
-<p>Eso tiene una funci&oacute;n <code>let*</code> para asignar el valor del primer
-elemento del kill ring a <code>cur</code>. (No se sabe por qu&eacute; la
-funci&oacute;n no usa <code>let</code>; solo un valor es asignado en la
-expresi&oacute;n. &iquest;Quiz&aacute;s esto es un error que no produce
-problemas?
-</p>
-<p>Considera el condicional que es uno de los dos argumentos para
-<code>kill-new</code>. Eso usa <code>concat</code> para concatenar el nuevo texto
-al <small>CAR</small> del anillo de la muerte <em>kill ring</em>. Si eso se
-concatena atr&aacute;s o delante depende de los resultados de una
-expresi&oacute;n <code>if</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if before-p ; <span class="roman">if-part</span>
- (concat string cur) ; <span class="roman">then-part</span>
- (concat cur string)) ; <span class="roman">else-part</span>
-</pre></div>
-
-<p>Si la regi&oacute;n cortada est&aacute; antes que la regi&oacute;n que se cort&oacute; en
-el &uacute;ltimo comando, entonces deber&iacute;a ser puesto antes
-que el material salvador en el anterior corte <em>kill</em>; y de manera
-contraria, si el texto cortado sigue lo que fu&eacute; cortado, eso
-ser&iacute;a a&ntilde;adido despu&eacute;s del texto previo. La
-expresi&oacute;n <code>if</code> depende del predicado <code>before-p</code> para
-decidir si el texto nuevamente salvado es puesto antes o despu&eacute;s.
-</p>
-<p>El s&iacute;mbolo <code>before-p</code> es el nombre de uno de los
-argumentos a <code>kill-append</code>. Cuando la funci&oacute;n
-<code>kill-append</code> se eval&uacute;a, se asocia al valor devuelto evaluando
-el argumento actual. En este caso, esta es la expresi&oacute;n <code>(&lt; end
-beg)</code>. Esta expresi&oacute;n no determina directamente si el texto cortado
-en este comando se localiza antes o despu&eacute;s del texto cortado del
-&uacute;ltimo comando; lo que hace es determinar si el valor de la variable
-<code>end</code> es menor que el valor de la variable <code>beg</code>. Si es
-as&iacute;, significa que el usuario se encara al principio del
-b&uacute;ffer. Tambi&eacute;n, el resultado de evaluar la expresi&oacute;n del
-predicado. <code>(&lt; end beg)</code>, ser&aacute; verdadero y el texto se
-concatena antes del texto previo. Por otro lado, si el valor de la
-variable <code>end</code> es mayor que el valor del la variable <code>beg</code>,
-el texto ser&aacute; concatenado despu&eacute;s del texto previo.
-</p>
-<p>Cuando el texto nuevamente guardado se concatena, entonces la cadena
-con el nuevo texto ser&aacute; concatenado antes del viejo texto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(concat string cur)
-</pre></div>
-
-<p>Pero si el texto ser&aacute; a&ntilde;adido, eso ser&aacute; concatenado despu&eacute;s
-del viejo texto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(concat cur string))
-</pre></div>
-
-<p>Para comprender c&oacute;mo funciona esto, primero se necesita revisar la
-funci&oacute;n <code>concat</code>. La funci&oacute;n <code>concat</code> enlaza junto o une
-dos cadenas de texto. El resultado es una cadena. Por ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(concat &quot;abc&quot; &quot;def&quot;)
- &rArr; &quot;abcdef&quot;
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(concat &quot;nuevo &quot;
- (car '(&quot;primer elemento&quot; &quot;segundo elemento&quot;)))
- &rArr; &quot;nuevo primer elemento&quot;
-
-(concat (car
- '(&quot;primer elemento&quot; &quot;segundo elemento&quot;)) &quot; modificado&quot;)
- &rArr; &quot;primer elemento modificado&quot;
-</pre></div>
-
-<p>Ahora puede tener sentido <code>kill-append</code>: eso modifica los
-contenidos del anillo de la muerte <em>kill ring</em>. El anillo de la
-muerte <em>kill ring</em> es una lista, en la que cada elemento es texto
-guardado. La funci&oacute;n <code>kill-append</code> usa la funci&oacute;n
-<code>kill-new</code> que usa la funci&oacute;n <code>setcar</code>.
-</p>
-<hr>
-<a name="Funci_00f3n-kill_002dnew"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Funci_00f3n-kill_002dappend" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#cuerpo-copy_002dregion_002das_002dkill" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Disgresi_00f3n-dentro-de-C" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-kill_002dnew"></a>
-<h4 class="unnumberedsubsubsec">La funci&oacute;n <code>kill-new</code></h4>
-<a name="index-kill_002dnew"></a>
-
-<p>La funci&oacute;n <code>kill-new</code> se ve de esta manera:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun kill-new (string &amp;optional replace yank-handler)
- &quot;Crea STRING el &uacute;ltimo corte en el anillo de la muerte <em>kill
- ring</em>.
-Asigna `kill-ring-yank-pointer' para apuntarlo.
-
-Si `interprogram-cut-function' es no nulo, apl&iacute;calo a su
- STRING.
-Segundo argumento opcional REPLACE no-nulo significa que STRING
- reemplazar&aacute; el frente del kill ring, en vez de ser a&atilde;ndido a la lista.
-&hellip;&quot;
-</pre><pre class="smallexample"> (if (&gt; (length string) 0)
- (if yank-handler
- (put-text-property 0 (length string)
- 'yank-handler yank-handler string))
- (if yank-handler
- (signal 'args-out-of-range
- (list string &quot;yank-handler specified for empty string&quot;))))
-</pre><pre class="smallexample"> (if (fboundp 'menu-bar-update-yank-menu)
- (menu-bar-update-yank-menu string (and replace (car kill-ring))))
-</pre><pre class="smallexample"> (if (and replace kill-ring)
- (setcar kill-ring string)
- (push string kill-ring)
- (if (&gt; (length kill-ring) kill-ring-max)
- (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
-</pre><pre class="smallexample"> (setq kill-ring-yank-pointer kill-ring)
- (if interprogram-cut-function
- (funcall interprogram-cut-function string (not replace))))
-</pre></div>
-
-<p>(Vea que la funci&oacute;n no es interactiva.)
-</p>
-<p>Normalmente, se mira a esta funci&oacute;n en partes.
-</p>
-<p>La definici&oacute;n de la funci&oacute;n tiene un argumento opcional
-<code>yank-handler</code>, que cuando se invoca cuenta la funci&oacute;n de c&oacute;mo
-tratar con propiedades a&ntilde;adidas al texto, tal como &lsquo;negrilla&rsquo; o
-&lsquo;it&aacute;lica&rsquo;. Nosotros evitaremos esto.
-</p>
-<p>La primer l&iacute;nea de la documentaci&oacute;n tiene sentido:
-</p>
-<div class="smallexample">
-<pre class="smallexample">Crea la CADENA la &uacute;ltima copia en el anillo de la muerte <em>kill
-ring</em>.
-</pre></div>
-
-<p>Permite saltarse el resto de la documentaci&oacute;n por el momento.
-</p>
-<p>Tambi&eacute;n, permite salir de la expresi&oacute;n inicial <code>if</code> y estas
-l&iacute;neas de c&oacute;digo involucrando
-<code>menu-bar-update-yank-menu</code>. Nosotros explicaremos debajo.
-</p>
-<p>Las l&iacute;neas cr&iacute;ticas son estas:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (if (and replace kill-ring)
- ;; <span class="roman">entonces</span>
- (setcar kill-ring string)
-</pre><pre class="smallexample"> ;; <span class="roman">resto</span>
- (push string kill-ring)
-</pre><pre class="smallexample"> (setq kill-ring (cons string kill-ring))
- (if (&gt; (length kill-ring) kill-ring-max)
- ;; <span class="roman">avoid overly long kill ring</span>
- (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil)))
-</pre><pre class="smallexample"> (setq kill-ring-yank-pointer kill-ring)
- (if interprogram-cut-function
- (funcall interprogram-cut-function string (not replace))))
-</pre></div>
-
-<p>El test condicional es <code>(and&nbsp;replace&nbsp;<span class="nolinebreak">kill-ring)</span></code>. Esto ser&aacute;
-verdad cuando dos condiciones se encuentran: el anillo de la muerte
-<em>kill ring</em> tiene alguna cosa dentro, y la variable
-<code>replace</code> es verdad.
-</p>
-<p>Cuando la funci&oacute;n <code>kill-append</code> asigna <code>replace</code> para ser
-cierto y cuando el anillo de la muerte <em>kill ring</em> tiene al menos
-un &iacute;tem en eso, la expresi&oacute;n <code>setcar</code> es ejecutada.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setcar kill-ring string)
-</pre></div>
-
-<p>La funci&oacute;n <code>setcar</code> actualemten cambia el primer elemento del
-anillo de la muerte (<code>kill-ring</code> lista al valor de
-<code>string</code>. Eso reemplaza el primer elemento.
-</p>
-<p>Por otro lado, si el kill ring est&aacute; vac&iacute;o, o
-reemplazar es falso, la else-part de la condici&oacute;n est&aacute; ejecutado:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(push string kill-ring)
-</pre></div>
-
-<p><code>push</code> pone su primer argumento dentro del segundo. Es similar al
-viejo.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq kill-ring (cons string kill-ring))
-</pre></div>
-
-<p>o el nuevo
-</p>
-<div class="smallexample">
-<pre class="smallexample">(add-to-list kill-ring string)
-</pre></div>
-
-<p>Cuando eso es falso, la expresi&oacute;n primero construye una nueva
-versi&oacute;n del anillo de la muerte <em>kill ring</em> a&ntilde;adiendo
-<code>string</code> al anillo de la muerte <em>kill ring</em> como un nuevo
-elemento (que es lo que <code>push</code> hace). Entonces ejecuta un segundo
-<code>if</code> cl&aacute;usula. Este segundo <code>if</code> cl&aacute;usula guarada el
-anillo de la muerte <em>kill ring</em> desde el creciente demasiado largo.
-</p>
-<p>D&eacute;janos mirar estas dos expresiones en orden.
-</p>
-<p>La l&iacute;nea <code>push</code> de la parte else asigna el nuevo
-valor del kill ring <em>anillo de la muerte</em> a que resultados
-a&ntilde;aden la cadena siendo cortada al viejo anillo de la muerte
-<em>kill ring</em>
-</p>
-<p>Nosotros podemos ver c&oacute;mo esto funciona con un ejemplo.
-</p>
-<p>Primero,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq example-list '(&quot;aqui una clausula&quot; &quot;otra clausula&quot;))
-</pre></div>
-
-<p>Despu&eacute;s de evaluar esta expresi&oacute;n con <kbd>C-x C-e</kbd>, se puede
-evaluar <code>example-list</code> y mira lo que devuelve:
-</p>
-<div class="smallexample">
-<pre class="smallexample">example-list
- &rArr; (&quot;aqu&iacute; hay una cla&uacute;sula&quot; &quot;otra cla&uacute;sula&quot;)
-</pre></div>
-
-<p>Ahora, se puede a&ntilde;adir un nuevo elemento en esta lista evaluando la
-siguiente expresi&oacute;n:
-<a name="index-push_002c-ejemplo"></a>
-</p>
-<div class="smallexample">
-<pre class="smallexample">(push &quot;una tercera cl&aacute;usula&quot; lista-de-ejemplo)
-</pre></div>
-
-<p>Cuando se eval&uacute;a <code>example-list</code>, se encuentra su valor es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">example-list
- &rArr; (&quot;una tercera cla&uacute;sula&quot; &quot;aqu&iacute; hay una
- cla&uacute;sula&quot; &quot;otra cla&uacute;sula&quot;)
-</pre></div>
-
-<p>De este modo, la tercera cla&uacute;sula se a&ntilde;ade a la lista con <code>push</code>.
-</p>
-<p>Ahora para la segunda parte de la cla&uacute;sula <code>if</code>. Esta
-expresi&oacute;n deja el kill ring desde lo creciente demasiado largo. Eso
-se ve de la siguiente manera:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (&gt; (length kill-ring) kill-ring-max)
- (setcdr (nthcdr (1- kill-ring-max) kill-ring) nil))
-</pre></div>
-
-<p>El c&oacute;digo chequea si el tama&ntilde;o del anillo de la muerte <em>kill
-ring</em> es m&aacute;s grande que el m&aacute;ximo tama&ntilde;o permitido. Este es el
-valor de <code>kill-ring-max</code> (que es 60, por defecto). Si el tama&ntilde;o
-del anillo de la muerte <em>kill ring</em> es demasiado largo, entonces
-este c&oacute;digo asigna el &uacute;ltimo elemento del anillo de la muerte
-<em>kill ring</em> a <code>nil</code>. Eso hace esto usando dos funciones,
-<code>nthcdr</code> y <code>setcdr</code>.
-</p>
-<p>Nosotros vemos que <code>setcdr</code> temprano (v&eacute;ase la secci&oacute;n <a href="#setcdr"><code>setcdr</code></a>). Eso asigna el <small>CDR</small> de una lista, solo como
-<code>setcar</code> asigna el <small>CAR</small> de una lista. En este caso, sin
-embargo, <code>setcdr</code> no estar&aacute; configurando el <small>CDR</small> del kill
-ring completo; la funci&oacute;n <code>nthcdr</code> es usada para causarlo para
-asignar el <small>CDR</small> del siguiente al &uacute;ltimo elemento del kill ring
-&mdash; esto significa que desde el <small>CDR</small> del siguiente al &uacute;ltimo
-elemnto del kill ring <em>anillo de la muerte</em>, eso asignar&aacute; el
-&uacute;ltimo elemento del kill ring <em>anillo de la muerte</em>.
-</p>
-<a name="index-nthcdr_002c-ejemplo"></a>
-<p>La funci&oacute;n <code>nthcdr</code> funciona repetidamente tomando el <small>CDR</small>
-de una lista &mdash; eso toma el <small>CDR</small> del <small>CDR</small> del <small>CDR</small>
-&hellip;. Eso hace esto <var>N</var> veces y devuelve los
-resultados. (V&eacute;ase la secci&oacute;n <a href="#nthcdr"><code>nthcdr</code></a>.)
-</p>
-<a name="index-setcdr_002c-ejemplo"></a>
-<p>De este modo, si teniamos una lista de cuatro elemento que era
-supuestamente de tres elementos, se podr&iacute;a asignar el
-<small>CDR</small> del siguiente al &uacute;ltimo elemento a <code>nil</code>, y por eso se
-ordena la lista. (Si se asigna el &uacute;ltimo elemento a alg&uacute;n otro
-valor a <code>nil</code>, que se podr&iacute;a hacer, entonces no
-se habr&iacute;a ordenado la lista. V&eacute;ase la secci&oacute;n <a href="#setcdr"><code>setcdr</code></a>.)
-</p>
-<p>Se puede ver ordenando la evaluaci&oacute;n de las siguientes tres
-expresiones en turno. Primero asigna el valor de <code>arboles</code> a
-<code>(arce encina pino abedul)</code> entonces asigna el <small>CDR</small> de su
-segundo <small>CDR</small> y entonces encuentra el valor de <code>arboles</code>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq arboles '(arce encina pino abedul))
- &rArr; (arce encina pino abedul)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(setcdr (nthcdr 2 arboles) nil)
- &rArr; nil
-
-&aacute;rboles
- &rArr; (arce encina pino)
-</pre></div>
-
-<p>(El valor devuelto por la expresi&oacute;n <code>setcdr</code> es <code>nil</code>
-desde que es que el <small>CDR</small> es asignado.)
-</p>
-<p>Para repetir, en <code>kill-new</code>, la funci&oacute;n <code>nthcdr</code> toma el
-<small>CDR</small> un n&uacute;mero de veces que es uno menos que el tama&ntilde;o
-m&aacute;ximo permitido del anillo de la muerte <em>kill ring</em> y
-<code>setcdr</code> asigna el <small>CDR</small> de este elemento (que ser&aacute; el resto
-de los elementos en el anillo muerte) para <code>nil</code>. Esto previene
-el anillo de la muerte <em>kill ring</em> desde lo que crece demasiado largo.
-</p>
-<p>De la siguiente a la &uacute;ltima expresi&oacute;n en la funci&oacute;n
-<code>kill-new</code> es
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq kill-ring-yank-pointer kill-ring)
-</pre></div>
-
-<p>El <code>kill-ring-yank-pointer</code> es una variable global que es
-asignado para ser el <code>kill-ring</code>.
-</p>
-<p>Incluso aunque el <code>kill-ring-yank-pointer</code> es llamado un
-&lsquo;<samp>puntero</samp>&rsquo;, eso es una variable solo como el anillo de la muerte
-<em>kill ring</em>. Sin embargo, el nombre que ha sido elegido para
-ayudar a humanos a comprender c&oacute;mo la variable se usa.
-</p>
-<p>Ahora, para devolver r&aacute;pido una expresi&oacute;n en el cuerpo de la funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (if (fboundp 'menu-bar-update-yank-menu)
- (menu-bar-update-yank-menu string (and replace (car kill-ring))))
-</pre></div>
-
-<p>Empieza con una expresi&oacute;n <code>if</code>
-</p>
-<p>En este caso, la expresi&oacute;n chequea primero si
-<code>menu-bar-update-yank-menu</code> existe como una funci&oacute;n, y si
-as&iacute;, se llama. La funci&oacute;n <code>fboundp</code> devuelve
-cierto si el s&iacute;mbolo que se chequea tiene una
-definici&oacute;n de funci&oacute;n que &lsquo;no es vac&iacute;a&rsquo;. Si el
-s&iacute;mbolo de la definici&oacute;n de funci&oacute;n fuera
-vac&iacute;o, recibir&iacute;a un mensaje de error, como
-se hizo cuando se crearon errores intencionalmente (v&eacute;ase la secci&oacute;n <a href="#Creando-errores">Genera un Mensaje de Error</a>).
-</p>
-<p>La then-part contiene una expresi&oacute;n cuyo primer elemento es la
-funci&oacute;n <code>and</code>.
-</p>
-<a name="index-and"></a>
-<p>La forma especial <code>and</code> eval&uacute;a cada uno de sus argumentos hasta
-que uno de los argumentos devuelva un valor de <code>nil</code>, en cuyo caso
-la expresi&oacute;n <code>and</code> devuelve <code>nil</code>; sin embargo, si
-ninguno de los argumentos devuelve una valor de <code>nil</code>, el valor
-resultante desde la evaluaci&oacute;n el &uacute;ltimo argumento es
-devuelto. (Desde que tal valor no es <code>nil</code>, eso es considerado
-cierto en Emacs Lisp.) En otras palabras, una expresi&oacute;n <code>and</code>
-devuelve un valor cierto solo si todos sus argumentos son
-verdaderos. (V&eacute;ase la secci&oacute;n <a href="#Revisar-el-segundo-b_00faffer-relacionado">Revisar</a>.)
-</p>
-<p>La expresi&oacute;n determina si el segundo argumento
-<code>menu-bar-update-yank-menu</code> es verdadero o no.
-</p>
-<p><code>menu-bar-update-yank-menu</code> es una de la funciones que lo hace
-posible para usar el menu &lsquo;Seleccionar y Pegar&rsquo; en el
-&iacute;tem Editar de una barra de menu; usando un rat&oacute;n, se
-pueden mirar varias piezas de texto que se han guardado y se
-selecciona una pieza para pegar.
-</p>
-<p>La &uacute;ltima expresi&oacute;n en la funci&oacute;n <code>kill-new</code> a&ntilde;ade las
-cadenas nuevamente copiadas a aquella facilidad que existe copiando y
-pegando entre diferentes programas ejecutando un sistema de
-ventanas. En el Sistema de Ventanas de X, por ejemplo, la funci&oacute;n
-<code>x-select-text</code> toma la cadena y la almacena en memoria operada
-por X. Se puede pegar la cadena en otro programa, tal como un Xterm.
-</p>
-<p>La expresi&oacute;n se ve como:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (if interprogram-cut-function
- (funcall interprogram-cut-function string (not replace))))
-</pre></div>
-
-<p>Si <code>interprogram-cut-function</code> existe, entonces Emacs ejecuta
-<code>funcall</code>, que en vez de llamar a su primer argumento como una
-funci&oacute;n, pasa los argumentos que permanecen en
-eso. (Incidentalmente, tan lejos como se puede ver, esta expresi&oacute;n
-<code>if</code> podr&iacute;a ser reemplazado por una expresi&oacute;n
-<code>and</code> similar a uno en la primera parte de la funci&oacute;n.)
-</p>
-<p>Estamos yendo a discutir sistemas de ventanas y otros programas m&aacute;s
-all&aacute; pero meramente nota que este es un mecanismo que habilita GNU
-Emacs a trabajar f&aacute;cilmente y bien con otros programas.
-</p>
-<p>Este c&oacute;digo para emplazar texot en el anillo de la muerte <em>kill
-ring</em>, concatenado con un elemento existente o como un nuevo elemento,
-nos lidera al c&oacute;digo para traer texto que ha sido cortado del
-b&uacute;ffer &mdash; los comandos de corte. Sin embargo, antes de discutir los
-comandos de corte, es mejor aprender c&oacute;mo las listas son implementadas
-en un ordenador. Esto dejar&aacute; claro tales misterios como el uso del
-t&eacute;rmino &lsquo;puntero&rsquo;. Pero antes de esto, nos desviaremos a C.
-</p>
-
-<hr>
-<a name="Disgresi_00f3n-dentro-de-C"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Funci_00f3n-kill_002dnew" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#defvar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Disgresion-dentro-de-C"></a>
-<h2 class="section">8.4 Disgresi&oacute;n dentro de C</h2>
-<a name="index-delete_002dand_002dextract_002dregion"></a>
-<a name="index-C_002c-una-disgresion-dentro"></a>
-<a name="index-Disgresion-dentro-de-C"></a>
-
-<p>La funci&oacute;n <code>copy-region-as-kill</code> (v&eacute;ase la secci&oacute;n <a href="#copy_002dregion_002das_002dkill"><code>copy-region-as-kill</code></a>) usa la funci&oacute;n
-<code>filter-buffer-substring</code>, que en vez de eso usa la funci&oacute;n
-<code>delete-and-extract-region</code>. Eso elimina los contenidos de una
-regi&oacute;n y no se puede volverlos a tener.
-</p>
-<p>Al contrario que el otro c&oacute;digo discutido aqu&iacute;, la
-funci&oacute;n <code>delete-and-extract-region</code> no est&aacute; escrita en Emacs
-Lisp; eso est&aacute; escrito en C y es una de las primitivas del sistema
-GNU Emacs. Puesto que es muy simple, se har&aacute; la disgresi&oacute;n
-brevemente desde el Lisp y se describe aqu&iacute;.
-</p>
-
-<p>Como muchas de las otras primitivas Emacs,
-<code>delete-and-extract-region</code> se escribe como una instancia de una
-macro C, una macro es una plantilla para codificar. La macro completa
-se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">DEFUN (&quot;delete-and-extract-region&quot;, Fdelete_and_extract_region,
- Sdelete_and_extract_region, 2, 2, 0,
- doc: /* Borra el texto entre START y END y lo devuelve. */)
- (Lisp_Object start, Lisp_Object end)
-{
- validate_region (&amp;start, &amp;end);
- if (XINT (start) == XINT (end))
- return empty_unibyte_string;
- return del_range_1 (XINT (start), XINT (end), 1, 1);
-}
-</pre></div>
-
-<p>Sin ir dentro de los detalles de la macro que escribe el proceso, se
-har&aacute; un apunte de esta macro que empieza con la palabra
-<code>DEFUN</code>. La palabra <code>DEFUN</code> fu&eacute; elegida puesto que el
-c&oacute;digo sirve para el mismo prop&oacute;sito que <code>defun</code> hace en
-Lisp. (La macro C <code>DEFUN</code> definida en &lsquo;<tt>emacs/src/lisp.h</tt>&rsquo;.)
-</p>
-<p>El palabra <code>DEFUN</code> tiene siete partes dentro de los
-par&eacute;ntesis:
-</p>
-<ul>
-<li>
-La primera parte es el nombre dado a la funci&oacute;n en Lisp,
-<code>delete-and-extract-region</code>.
-
-</li><li>
-La segunda parte es el nombre de la funci&oacute;n en C,
-<code>Fdelete_and_extract_region</code>. Por convenci&oacute;n, eso empieza con
-&lsquo;<samp>F</samp>&rsquo;. Puesto que C no usa guiones en nombres, los guiones bajos son
-usados a su vez.
-
-</li><li>
-La tercera parte es el nombre para la estructura constante C que
-registra informaci&oacute;n en esta funci&oacute;n para uso interno. Es el
-nombre de la funci&oacute;n en C pero empieza con una &lsquo;<samp>S</samp>&rsquo; en vez de
-una &lsquo;<samp>F</samp>&rsquo;.
-
-</li><li>
-Las partes cuarta y quinta especifican el n&uacute;mero
-m&iacute;nimo y m&aacute;ximo de argumentos que la funci&oacute;n puede
-tener. Esta funci&oacute;n demanda exactamente 2 argumentos.
-
-</li><li>
-La sexta parte est&aacute; cerca del argumento que sigue la declaraci&oacute;n
-<code>interactive</code> en una funci&oacute;n escrita en Lisp: una carta
-seguida, quiz&aacute;s, por una consola. La &uacute;nica diferencia con Lisp es
-que si la macro se llama sin argumentos. Entonces se escribe un <code>0</code>
-(que es una &lsquo;cadena nula&rsquo;), como en esta macro.
-
-<p>Si se fueran a especificar argumentos, se emplazar&iacute;an
-entre marcas de comillas. La macro C para <code>goto-char</code> incluye
-<code>\&quot;NGoto char \&quot;</code> en esta posici&oacute;n se indica que la funci&oacute;n
-espera un prefijo plano, en este caso, una localizaci&oacute;n num&eacute;rica
-en un b&uacute;ffer, y provee una consola.
-</p>
-</li><li>
-La s&eacute;ptima parte es una cadena de documentaci&oacute;n, solo como la
-&uacute;nica para una funci&oacute;n escrita en Emacs Lisp. Esto es escrito como
-un comentario C. (Cuando se escribe Emacs, el programa
-<code>lib-src/make-docfile</code> extrae estos comentarios y los usa para
-crear la documentaci&oacute;n &ldquo;real&rdquo;.)
-</li></ul>
-
-<p>En una macro C, los par&aacute;metros son los siguientes, con una frase de
-este tipo de objeto se siguen por lo que podr&iacute;a ser
-llamado el &lsquo;cuerpo&rsquo; de la macro. Para <code>delete-and-extract-region</code>
-el &lsquo;cuerpo&rsquo; consiste de las siguientes cuatro l&iacute;neas:
-</p>
-<div class="smallexample">
-<pre class="smallexample">validate_region (&amp;start, &amp;end);
-if (XINT (start) == XINT (end))
- return build_string (&quot;&quot;);
-return del_range_1 (XINT (start), XINT (end), 1, 1);
-</pre></div>
-
-<p>La funci&oacute;n <code>validate_region</code> chequea si los valores pasados
-como el principio y fin de la regi&oacute;n son el tipo apropiado y son del
-mismo rango. Si las posiciones del principio y fin son las mismas, entonces
-se devuelve una cadena vac&iacute;a.
-</p>
-<p>La funci&oacute;n <code>del_range_1</code> actualmente borra el texto. Eso es una
-funci&oacute;n compleja que no miraremos. Eso actualiza el b&uacute;ffer y hace
-otras cosas. Sin embargo, es el valorable mirar los dos argumentos
-pasados para <code>del_range</code>. Estos son <code>XINT&nbsp;(start)</code> y
-<code>XINT&nbsp;(end)</code>.
-</p>
-<p>Tan lejos como el lenguaje C es concebido, <code>start</code> y <code>end</code>
-son dos enteros que marcan el principio y el fin de la regi&oacute;n para
-ser borrada<a name="DOCF10" href="#FOOT10">(10)</a>.
-</p>
-<p>En las primeras versiones de Emacs, estos dos n&uacute;meros fueron 32 bits
-de longitud, pero el c&oacute;digo est&aacute; lentamente siendo generalizado
-para manejar otras longitudes. Tres de los bits disponibles son usados
-para especificar el tipo de informaci&oacute;n; los bits permanecen ser
-usados como &lsquo;contenido&rsquo;.
-</p>
-<p>&lsquo;<samp>XINT</samp>&rsquo; es una macro C que extrae los n&uacute;meros relevantes desde
-la colecci&oacute;n larga de bits; los otros tres bits se descartan.
-</p>
-<p>El comando en <code>delete-and-extract-region</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">del_range_1 (XINT (start), XINT (end), 1, 1);
-</pre></div>
-
-<p>Esto borra la regi&oacute;n entre la posici&oacute;n del principio,
-<code>start</code>, y la posici&oacute;n final, <code>end</code>.
-</p>
-<p>Desde el punto de vista de la persona que escribe Lisp, Emacs es muy
-simple; pero oculta en el fondo un gran trato de complejidad para
-hacer todo el trabajo.
-</p>
-<hr>
-<a name="defvar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Disgresi_00f3n-dentro-de-C" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Mira-el-valor-actual-de-la-variable" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Inicializando-una-variable-con-defvar"></a>
-<h2 class="section">8.5 Inicializando una variable con <code>defvar</code></h2>
-<a name="index-defvar"></a>
-<a name="index-Inicializando-una-variable"></a>
-<a name="index-Inicializacion-de-Variable"></a>
-
-
-<p>La funci&oacute;n <code>copy-region-as-kill</code> es escrita en Emacs Lisp. Dos
-funciones con eso, <code>kill-append</code> y <code>kill-new</code>, copiar una
-regi&oacute;n en un b&uacute;ffer y guardarlo en una variable llamada el
-<code>kill-ring</code>. Esta secci&oacute;n describe c&oacute;mo la variable
-<code>kill-ring</code> es creada e inicializada usando la forma especial
-<code>defvar</code>.
-</p>
-<p>(De nuevo se nota que el t&eacute;rmino <code>kill-ring</code> es un sin
-nombre. El texto que es cortado fuera del b&uacute;ffer puede ser traido;
-eso no es un corpus de anillo, pero un anillo de texto resucitable.)
-</p>
-<p>En Emacs Lisp, una variable tal como <code>kill-ring</code> es creada y dada
-por un valor inicial usando la forma especial <code>defvar</code>. El nombre
-viene de &ldquo;definir variable&rdquo;.
-</p>
-<p>La forma especial <code>defvar</code> es similar a <code>setq</code> en este se
-configura el valor de una variable. Eso no es <code>setq</code> en dos
-modos; primero solo configura el valor de la variable si la variable
-no tiene ya un valor. Si la variable ya tiene un valor, <code>defvar</code>
-no sobreescribe el valor existente. Segundo, <code>defvar</code> tiene una
-cadena de documentaci&oacute;n.
-</p>
-<p>(Otra forma especial, <code>defcustom</code>, est&aacute; dise&ntilde;ado para
-variables que la gente personaliza. Eso tiene m&aacute;s funcionalidades
-que <code>defvar</code>. (V&eacute;ase la secci&oacute;n <a href="#defcustom">Configurando Variables con <code>defcustom</code></a>.)
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Mira-el-valor-actual-de-la-variable">Mirando el actual valor de una variable</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Mira el valor actual de la variable
-</td></tr>
-<tr><td align="left" valign="top"><a href="#defvar-y-asterisk">8.5.1 <code>defvar</code> y un asterisco</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> defvar y asterisk
-</td></tr>
-</table>
-
-<hr>
-<a name="Mira-el-valor-actual-de-la-variable"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#defvar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#defvar" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#defvar-y-asterisk" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Mirando-el-actual-valor-de-una-variable"></a>
-<h3 class="unnumberedsubsec">Mirando el actual valor de una variable</h3>
-
-<p>Se puede ver el actual valor de una variable, cualquier variable,
-usando la funci&oacute;n <code>describe-variable</code>, que es normalmente
-invocado escribiendo <kbd>C-h v</kbd>. Si se escribe <kbd>C-h v</kbd> y
-<code>kill-ring</code> (seguido por &lt;RET&gt;), se ver&aacute; que hay en tu
-anillo de la muerte actual <em>kill ring</em> al ser pulsado &mdash;
-&iexcl;esto puede ser bastante tranquilo! A la inversa, si no
-has estado haciendo nada esta sesi&oacute;n en Emacs, excepto leer este
-documento, se puede no tener nada dentro. Tambi&eacute;n, se ver&aacute; la
-documentaci&oacute;n para <code>kill-ring</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">Documentaci&oacute;n:
-Lista de secuencias de texto muerto (guardado).
-Desde que el (kill ring) se supone que interactua bien con
-cut-and-paste facilita ofrecer por sistemas de ventanas,
-deber&iacute;a usar esta variable
-</pre><pre class="smallexample">interact&uacute;a bin con `interprogram-cut-function' y
-`interprogram-paste-function'. Las funciones `kill-new',
-`kill-append', y `current-kill' se suponen para implementar esta
-interacci&oacute;n; se puede querer usarlo en vez de manipular en anillo de
-la muerte <em>kill ring</em> directamente.
-</pre></div>
-
-<p>El kill ring <em>anillo de la muerte</em> est&aacute; definido por un
-<code>defvar</code> del siguiente modo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defvar kill-ring nil
- &quot;Lista de secuencia de textos cortados.
-&hellip;&quot;)
-</pre></div>
-
-<p>En esta definici&oacute;n de variable, la variable es dada un valor inicial
-de <code>nil</code>, que tiene sentido, desde que si no se ha guardado nada,
-no se quiere nada si se da un comando <code>yank</code>. La cadena de
-documentaci&oacute;n es escrito solo como la cadena de documentaci&oacute;n de
-un <code>defun</code>. Como con la cadena de documentaci&oacute;n
-ser&iacute;a una frase completa, desde que algunos comandos,
-como <code>apropos</code>, imprime solo la primera l&iacute;nea de
-documentaci&oacute;n. Las l&iacute;neas de exito no
-ser&iacute;an indentadas; de otro modo se mira cuando se usa
-<kbd>C-h v</kbd> (<code>describe-variable</code>).
-</p>
-<hr>
-<a name="defvar-y-asterisk"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Mira-el-valor-actual-de-la-variable" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#defvar" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Revisi_00f3n-de-cons-y-search_002dfwd" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="defvar-y-un-asterisco"></a>
-<h3 class="subsection">8.5.1 <code>defvar</code> y un asterisco</h3>
-<a name="index-defvar-para-una-variable-personalizable"></a>
-<a name="index-defvar-con-un-asterisco"></a>
-
-<p>En el pasado, Emacs usaba la forma especial <code>defvar</code> tanto para
-variables interna que no esperar&iacute;a que un usuario cambie
-y para variables que espera un usuario cambie. Aunque se puede
-todav&iacute;a usar <code>defvar</code> para variables
-personalizadas, por favor, usa <code>defcustom</code> en vez, desde que la
-forma especial provee una ruta dentro de los comando de
-Personalizaci&oacute;n. (V&eacute;ase la secci&oacute;n <a href="#defcustom">Especificando Variables usando <code>defcustom</code></a>.)
-</p>
-<p>Cuando se especifica una variable usando la forma especial
-<code>defvar</code>, se podr&iacute;a distinguir una variable que un
-usuario podr&iacute;a querer cambiar desde otros escribiendo,
-&lsquo;<samp>*</samp>&rsquo;, en la primera columna de su cadena de documentaci&oacute;n. Por
-ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defvar shell-command-default-error-buffer nil
- &quot;*Nombre de buffer para `shell-command' &hellip; salir del error.
-&hellip; &quot;)
-</pre></div>
-
-<a name="index-set_002dvariable"></a>
-<p>Tu podr&iacute;as (y todav&iacute;a puedes) usar el
-comando <code>set-variable</code> para cambiar el valor de
-<code>shell-command-default-error-buffer</code> temporalmente. Sin embargo,
-las opciones configuradas usando <code>set-variable</code> no est&aacute;n
-asignadas solo por la duraci&oacute;n de tu sesi&oacute;n de edici&oacute;n. Los
-nuevos valores no est&aacute;n guardados entre sesiones. Cada vez que Emacs
-empieza, lee el valor original, a menos que tu cambia el valor con tu
-fichero &lsquo;<tt>.emacs</tt>&rsquo;, si configur&aacute;ndolo manualmente o usando
-<code>customize</code>. V&eacute;ase la secci&oacute;n <a href="#Inicializaci_00f3n-de-Emacs">Tu Fichero &lsquo;<tt>.emacs</tt>&rsquo;</a>.
-</p>
-<p>Para m&iacute;, el mayor uso del comando <code>set-variable</code> es
-sugerir variables que se podr&iacute;an querer asignar en mi
-fichero &lsquo;<tt>.emacs</tt>&rsquo;. Ahora hay m&aacute;s de 700 variables, demasiadas
-para recordarlas f&aacute;cilmente. Afortunadamente, se puede presionar
-&lt;TAB&gt; despu&eacute;s de llamar al comando <code>M-x set-variable</code> para
-ver la lista de variables. (See <a href="emacs.html#Examinando">Examinando y Configurando Variables</a> in <cite>El Manual de GNU Emacs</cite>.)
-</p>
-<hr>
-<a name="Revisi_00f3n-de-cons-y-search_002dfwd"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#defvar-y-asterisk" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-ejercicios" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Revisar-4"></a>
-<h2 class="section">8.6 Revisar</h2>
-
-<p>Aqu&iacute; hay un breve resumen de algunas funciones
-introducidas recientemente.
-</p>
-<dl compact="compact">
-<dt><code>car</code></dt>
-<dt><code>cdr</code></dt>
-<dd><p><code>car</code> devuelve el primer elemento de una lista; <code>cdr</code>
-devuelve el segundo y subsiguientes elementos de una lista.
-</p>
-<p>Por ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(car '(1 2 3 4 5 6 7))
- &rArr; 1
-(cdr '(1 2 3 4 5 6 7))
- &rArr; (2 3 4 5 6 7)
-</pre></div>
-
-</dd>
-<dt><code>cons</code></dt>
-<dd><p><code>cons</code> construye una lista enlazando su primer argumento a su
-segundo argumento.
-</p>
-<p>Por ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cons 1 '(2 3 4))
- &rArr; (1 2 3 4)
-</pre></div>
-
-</dd>
-<dt><code>funcall</code></dt>
-<dd><p><code>funcall</code> eval&uacute;a su primer argumento como una
-funci&oacute;n. As&iacute; pasa los argumentos que permanecen a su
-primer argumento.
-</p>
-</dd>
-<dt><code>nthcdr</code></dt>
-<dd><p>Devuelve el resultado de tomar <small>CDR</small> &lsquo;n&rsquo; veces en una lista.
-El &lsquo;resto del resto&rsquo;, como estaba
-</p>
-<p>Por ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(nthcdr 3 '(1 2 3 4 5 6 7))
- &rArr; (4 5 6 7)
-</pre></div>
-
-</dd>
-<dt><code>setcar</code></dt>
-<dt><code>setcdr</code></dt>
-<dd><p><code>setcar</code> cambia el primer elemento de una lista; <code>setcdr</code>
-cambia el segundo y subsiguiente elementos de una lista.
-</p>
-<p>Por ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq triple '(1 2 3))
-
-(setcar triple '37)
-
-triple
- &rArr; (37 2 3)
-
-(setcdr triple '(&quot;foo&quot; &quot;bar&quot;))
-
-triple
- &rArr; (37 &quot;foo&quot; &quot;bar&quot;)
-</pre></div>
-
-</dd>
-<dt><code>progn</code></dt>
-<dd><p>Eval&uacute;a cada argumento en secuencia y entonces devuelve el valor del
-&uacute;ltimo.
-</p>
-<p>Por ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(progn 1 2 3 4)
- &rArr; 4
-</pre></div>
-
-</dd>
-<dt><code>save-restriction</code></dt>
-<dd><p>Graba siempre que encoger est&eacute; en efecto en el b&uacute;ffer, si
-cualquiera, restaura este encogimiento despu&eacute;s de evaluar los argumentos.
-</p>
-</dd>
-<dt><code>search-forward</code></dt>
-<dd><p>Buscar una cadena, y si la cadena es encontrada, mueve el punto. Con
-una expresi&oacute;n regular, usa algo similar a
-<code>re-search-forward</code>. (V&eacute;ase la secci&oacute;n <a href="#Buscar-regexp">B&uacute;squedas de Expresiones Regulares</a>, para una explicaci&oacute;n de expresiones
-regulares patrones y b&uacute;squedas.)
-</p>
-<p><code>search-forward</code> y <code>re-search-forward</code> tiene cuatro argumentos:
-</p>
-<ol>
-<li>
-La cadena o la expresi&oacute;n regular para buscar.
-
-</li><li>
-Opcionalmente, el l&iacute;mite de la b&uacute;squeda.
-
-</li><li>
-Opcionalmente, que haces si la b&uacute;squeda falla, devuelve <code>nil</code> o
-un mensaje de error.
-
-</li><li>
-Opcionalmente, cu&aacute;ntas veces se puede repetir la b&uacute;squeda; si es
-negativa, la b&uacute;squeda va hacia atr&aacute;s.
-</li></ol>
-
-</dd>
-<dt><code>kill-region</code></dt>
-<dt><code>delete-and-extract-region</code></dt>
-<dt><code>copy-region-as-kill</code></dt>
-<dd>
-<p><code>kill-region</code> corta el texto entre punto y marca desde el
-b&uacute;ffer y almacena ese texto en el anillo de la muerte <em>kill
-ring</em>, as&iacute; se puede obtener peg&aacute;ndolo.
-</p>
-<p><code>copy-region-as-kill</code> copia el texto entre punto y marca dentro
-del anillo de la muerte <em>kill ring</em>, que se puede obtener
-peg&aacute;ndolo. La funci&oacute;n no corta o borra el texto desde el b&uacute;ffer.
-</p></dd>
-</dl>
-
-<p><code>delete-and-extract-region</code> elimina el texto entre el punto y
-marca desde el b&uacute;ffer y a trav&eacute;s. No se puede volver. Esto no es
-un comando interactivo.)
-</p>
-<hr>
-<a name="Buscar-ejercicios"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Revisi_00f3n-de-cons-y-search_002dfwd" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Buscando-ejercicios"></a>
-<h2 class="section">8.7 Buscando ejercicios</h2>
-
-<ul>
-<li>
-Escribe una funci&oacute;n interactiva que busca una cadena. Si la
-b&uacute;squeda encuentra la cadena, deja el punto despu&eacute;s y muestra un
-mensaje que dice &ldquo;&iexcl;Encontrado!&rdquo;. (No use
-<code>search-forward</code> como nombre de esta funci&oacute;n; si se hace, se
-sobreescribir&aacute; la versi&oacute;n existente <code>search-forward</code> que
-viene con Emacs. Use un nombre tal como <code>test-search</code> en vez de
-eso.
-
-</li><li>
-Escribe una funci&oacute;n que imprime el tercer elemento del kill ring
-<em>anillo de la muerte</em> en el &aacute;rea echo, si cualquiera; si el
-kill ring <em>anillo de la muerte</em> no contiene un tercer elemento,
-imprime un mensaje apropiado.
-</li></ul>
-
-<hr>
-<a name="Implementaci_00f3n-de-listas"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Cortando-y-almacenando-texto" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-ejercicios" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Listas-diagramadas" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Pegando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Como-las-listas-se-implementan"></a>
-<h1 class="chapter">9 C&oacute;mo las listas se implementan</h1>
-<a name="index-Listas-en-un-ordenador"></a>
-
-<p>En Lisp, los &aacute;tomos se graban de manera simple, si la
-implementaci&oacute;n no es sencilla en la pr&aacute;ctica, no es, nada sencilla
-en la teor&iacute;a. El &aacute;tomo &lsquo;<samp>rosa</samp>&rsquo;, por ejemplo, se
-graba como las cuatro letras contiguas &lsquo;<samp>r</samp>&rsquo;, &lsquo;<samp>o</samp>&rsquo;, &lsquo;<samp>s</samp>&rsquo;,
-&lsquo;<samp>a</samp>&rsquo;. Una lista, por otro lado, se guarda de manera diferente. El
-mecanismo es igualmente simple, pero toma un momento para tener usada
-la idea. Una lista se guarda usando una serie de pares de punteros. En
-las series, el primer puntero en cada par de puntos a un &aacute;tomo o a
-otra lista, y el segundo puntero en cada par al siguiente par, o al
-s&iacute;mbolo <code>nil</code>, que marca el fin de la lista.
-</p>
-<p>Un puntero por s&iacute; mismo es poco simple a la direcci&oacute;n
-electr&oacute;nica de la que est&aacute; apuntada. Aqu&iacute;, una lista
-se guarda como una serie de direcciones electr&oacute;nicas.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Listas-diagramadas">Listas diagramadas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#S_00edmbolos-como-cajas">9.1 S&iacute;mbolos como una caja con cajones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Explorando una met&aacute;fora poderosa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-Lista">9.2 Ejercicio</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio Lista
-</td></tr>
-</table>
-
-<hr>
-<a name="Listas-diagramadas"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#S_00edmbolos-como-cajas" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Pegando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Listas-diagramadas-1"></a>
-<h2 class="unnumberedsec">Listas diagramadas</h2>
-
-<p>Por ejemplo, la lista <code>(rosa violeta bot&oacute;ndeoro)</code> tiene tres
-elementos, &lsquo;<samp>rosa</samp>&rsquo;, &lsquo;<samp>violeta</samp>&rsquo;, y &lsquo;<samp>bot&oacute;ndeoro</samp>&rsquo;. En el
-ordenador, la direcci&oacute;n electr&oacute;nica de &lsquo;<samp>rosa</samp>&rsquo; se graba en un
-segmento de memoria del ordenador a trav&eacute;s de la direcci&oacute;n que da
-la direcci&oacute;n electr&oacute;nica de donde el &aacute;tomo &lsquo;<samp>violeta</samp>&rsquo; est&aacute;
-localizado; y esta direcci&oacute;n (la que cuenta donde &lsquo;<samp>violeta</samp>&rsquo;
-est&aacute; se localiza) se guarda con una direcci&oacute;n que cuenta donde la
-direcci&oacute;n para el &aacute;tomo &lsquo;<samp>bot&oacute;ndeoro</samp>&rsquo; se localiza.
-</p>
-<p>Esto parece m&aacute;s complicado de lo que es y es m&aacute;s f&aacute;cil visto en
-un diagrama:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> ___ ___ ___ ___ ___ ___
- |___|___|--&gt; |___|___|--&gt; |___|___|--&gt; nil
- | | |
- | | |
- ---&gt; rosa ---&gt; violeta ---&gt; bot&oacute;ndeoro
-</pre></div>
-<br>
-<br>
-
-<p>En el diagrama, cada caja representa una palabra de memoria del
-ordenador que maneja un objeto Lisp, normalmente en la forma de una
-direcci&oacute;n de memoria. Las cajas, por ej. las direcciones, est&aacute;n en
-pares. Cada flecha apunta a lo que la direcci&oacute;n es la direcci&oacute;n
-de, si un &aacute;tomo u otro par de direcciones. La primera caja es la
-direcci&oacute;n electr&oacute;nica de &lsquo;<samp>rosa</samp>&rsquo; y la flecha apunta a
-&lsquo;<samp>rosa</samp>&rsquo;; la segunda caja es la direcci&oacute;n del siguiente par de
-cajas, la primera parte de la que es la direcci&oacute;n de &lsquo;<samp>violeta</samp>&rsquo;
-y la segunda parte es la direcci&oacute;n del siguiente par. La &uacute;ltima
-caja apunta al s&iacute;mbolo <code>nil</code>, que marca el fin de
-la lista.
-</p>
-<p>Cuando una variable es configurado a una lista con una funci&oacute;n tal
-como <code>setq</code>, almacena la direcci&oacute;n de la primera caja en la
-variable. De este modo, la evaluaci&oacute;n de la expresi&oacute;n es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq ramo '(rosa violeta bot&oacute;ndeoro))
-</pre></div>
-
-<p>crea una situaci&oacute;n como esta:
-</p>
-<div class="smallexample">
-<pre class="smallexample">ramo
- |
- | ___ ___ ___ ___ ___ ___
- --&gt; |___|___|--&gt; |___|___|--&gt; |___|___|--&gt; nil
- | | |
- | | |
- --&gt; rosa --&gt; violeta --&gt; bot&oacute;ndeoro
-</pre></div>
-<br>
-<br>
-
-<p>En este ejemplo, el s&iacute;mbolo <code>ramo</code> maneja la
-direcci&oacute;n del primer par de cajas.
-</p>
-<p>Esta misma lista puede ser ilustrada en un modo diferente de
-anotaci&oacute;n de cajas como esta:
-</p>
-<div class="smallexample">
-<pre class="smallexample">ramo
- |
- | -------------- ---------------- --------------------
- | | car | cdr | | car | cdr | | car | cdr |
- --&gt;| rosa | o-------&gt;| violeta | o-------&gt;| bot&oacute;ndeoro | nil |
- | | | | | | | | |
- -------------- ---------------- --------------------
-</pre></div>
-<br>
-<br>
-
-<p>(Los s&iacute;mbolos consisten de m&aacute;s pares de direcciones,
-pero la estructura de un s&iacute;mbolo es hecha de
-direcciones. De manera profunda, el s&iacute;mbolo <code>ramo</code>
-consiste de un grupo de cajas-de-direcciones, una que es la
-direcci&oacute;n de la palabra impresa &lsquo;<samp>ramo</samp>&rsquo;, una segunda de la que
-es la direcci&oacute;n de una definici&oacute;n de funci&oacute;n adjunta al
-s&iacute;mbolo, si cualquiera, un tercero del que es la
-direcci&oacute;n del primer par de cajas-de-direccion para la lista
-<code>(rosa violeta bot&oacute;ndeoro)</code>, y
-as&iacute;. Aqu&iacute; se est&aacute; mostrando que la
-tercera caja de direcci&oacute;n del s&iacute;mbolo apunta al primer
-par de cajas-de-direccion para la lista.)
-</p>
-<p>Si un s&iacute;mbolo se asigna al <small>CDR</small> de una lista, la
-lista en s&iacute; no cambia; el s&iacute;mbolo
-simplemente tiene una direcci&oacute;n abajo de la lista. (En la jerga,
-<small>CAR</small> y <small>CDR</small> son &lsquo;no destructivos&rsquo;.) De este modo, se eval&uacute;a
-la siguiente expresi&oacute;n
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq flores (cdr ramo))
-</pre></div>
-
-<p>produce esto:
-</p>
-<br>
-<div class="smallexample">
-<pre class="smallexample">ramo flores
- | |
- | ___ ___ | ___ ___ ___ ___
- --&gt; | | | --&gt; | | | | | |
- |___|___|----&gt; |___|___|--&gt; |___|___|--&gt; nil
- | | |
- | | |
- --&gt; rosa --&gt; violeta --&gt; bot&oacute;ndeoro
-</pre></div>
-<br>
-<br>
-<br>
-
-<p>El valor de <code>flores</code> es <code>(violeta bot&oacute;ndeoro)</code>, esto es
-decir que el s&iacute;mbolo <code>flores</code> maneja la direcci&oacute;n
-del par address-boxes el primero que maneja la direcci&oacute;n de
-<code>violeta</code>, y el segundo que maneja la direcci&oacute;n de
-<code>bot&oacute;ndeoro</code>.
-</p>
-<p>Un par de cajas-de-direcciones se llama una <em>cons cell</em> o <em>par
-de puntos</em>. See <a href="elisp.html#Tipo-de-C_00e9lula-Cons">la C&eacute;lula Cons y los Tipos Lista</a> in <cite>El Manual de Referencia de Emacs Lisp</cite>, y
-<a href="elisp.html#Notaci_00f3n-de-Pares-de-Puntos">Notaci&oacute;n de Pares de Puntos</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>, para m&aacute;s
-informaci&oacute;n acerca de c&eacute;lulas cons y pares de puntos.
-</p>
-<p>La funci&oacute;n <code>cons</code> a&ntilde;ade un nuevo par de direcciones al frente
-de una serie de direcciones como son mostradas debajo. Por ejemplo,
-evaluando la expresi&oacute;n
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq ramo (cons 'lila ramo))
-</pre></div>
-
-<p>produce:
-</p>
-<br>
-<div class="smallexample">
-<pre class="smallexample">ramo flores
- | |
- | ___ ___ ___ ___ | ___ ___ ___ ___
- --&gt; | | | | | | --&gt; | | | | | |
- |___|___|----&gt; |___|___|----&gt; |___|___|----&gt;|___|___|--&gt; nil
- | | | |
- | | | |
- --&gt; lila --&gt; rosa --&gt; violeta --&gt; bot&oacute;ndeoro
-</pre></div>
-<br>
-<br>
-<br>
-
-<p>Sin embargo, esto no cambia el valor del s&iacute;mbolo
-<code>flores</code>, as&iacute; puedes ver evaluando lo siguiente,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(eq (cdr (cdr ramo)) flores)
-</pre></div>
-
-<p>que devuelve <code>t</code> para verdad.
-</p>
-<p>Hasta que se resetea, <code>flores</code> todav&iacute;a tiene el
-valor de <code>(violeta bot&oacute;ndeoro)</code>; que es, eso tiene la
-direcci&oacute;n de la celula cons cuya primera direcci&oacute;n es
-<code>violeta</code>. Tambi&eacute;n, esto no altera cualquier c&eacute;lula
-prexistente cons; ellas est&aacute; todav&iacute;a all&iacute;.
-</p>
-<p>De este modo, en Lisp, tiene el <small>CDR</small> de una lista, se obtiene la
-direcci&oacute;n del siguiente cons en las serie; para tener el <small>CAR</small> de
-una lista, se obtiene la direcci&oacute;n del primer elemento de la lista;
-para <code>cons</code> un nuevo elemento en una lista, se a&ntilde;ade una nueva
-c&eacute;lula cons al frente de la lista. &iexcl;Esto es todo lo que
-hay as&iacute;! &iexcl;La estructura subyacente de Lisp
-es brillantemente simple!
-</p>
-<p>&iquest;Y qu&eacute; hace la &uacute;ltima direcci&oacute;n en una serie de
-c&eacute;lulas cons
-se refieren? Eso es la direcci&oacute;n de la lista vac&iacute;a, de
-<code>nil</code>.
-</p>
-<p>En resumen, cuando una variable Lisp es asignada a un valor, eso
-provee con la direcci&oacute;n de la lista a la que la variable se refiere.
-</p>
-<hr>
-<a name="S_00edmbolos-como-cajas"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Listas-diagramadas" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-Lista" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Pegando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Simbolos-como-una-caja-con-cajones"></a>
-<h2 class="section">9.1 S&iacute;mbolos como una caja con cajones</h2>
-<a name="index-Simbolos-como-una-caja-con-cajones"></a>
-<a name="index-Caja-con-cajones_002c-metafora-para-su-simbolo"></a>
-<a name="index-Cajones_002c-Caja-de_002c-metafora-para-un-simbolo"></a>
-
-<p>En una secci&oacute;n temprana, se suger&iacute;a que se
-podr&iacute;a imaginar un s&iacute;mbolo siendo una caja
-con cajones. La definici&oacute;n de funci&oacute;n se pone en un caj&oacute;n, el
-valor en otro, y as&iacute;. Lo que se pone en el caj&oacute;n
-maneja el valor que puede cambiarse sin afectar a los contenidos del
-caj&oacute;n manejando la definici&oacute;n de funci&oacute;n, y viceversa.
-</p>
-<p>Actualmente, lo que est&aacute; puesto en cada caj&oacute;n es la direcci&oacute;n
-del valor o definici&oacute;n de funci&oacute;n. Eso es como si se encontrara un
-viejo caj&oacute;n en el &aacute;tico, y en uno de sus cajones se encontrara un
-mapa d&aacute;ndote direcciones a donde est&aacute; el tesoro escondido.
-</p>
-<p>(Adem&aacute;s de su nombre, la definici&oacute;n del s&iacute;mbolo, y
-un valor de la variable, un s&iacute;mbolo tiene un &lsquo;caj&oacute;n&rsquo;
-para una <em>lista de propiedades</em> que puede ser usada para grabar
-otra informaci&oacute;n. Las listas de propiedades no se discuten
-aqu&iacute;; ver <a href="elisp.html#Listas-de-Propiedades">Listas de Propiedades</a> in <cite>El Manual de Referencia de Emacs Lisp</cite>.)
-</p>
-<p>Aqu&iacute; hay una representaci&oacute;n visionaria:
-</p>
-<br>
-<div class="smallexample">
-<pre class="smallexample"> Caja de Cajones Contenidos de Cajones
-
- __ o0O0o __
- / \
- ---------------------
- | direcciones al | [mapeo a]
- | nombre del simbolo | ramo
- | |
- +---------------------+
- | direcciones a la |
- | definici&oacute;n del | [nunca]
- | simbolo |
- +---------------------+
- | direcciones al | [mapeo a]
- | valor de variable | (rosa violeta bot&oacute;ndeoro)
- | |
- +---------------------+
- | direcciones a la |
- |lista de propiedades | [no descrito aqu&iacute;]
- | |
- +---------------------+
- |/ \|
-</pre></div>
-<br>
-<br>
-<br>
-
-<hr>
-<a name="Ejercicio-Lista"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#S_00edmbolos-como-cajas" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Pegando" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Pegando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicio-1"></a>
-<h2 class="section">9.2 Ejercicio</h2>
-
-<p>Asignar <code>flores</code> a <code>violeta</code> y <code>bot&oacute;ndeoro</code>. Asigna
-dos flores m&aacute;s en esta lista y asigna esta nueva lista a
-<code>mas-flores</code>. Asigna el <small>CAR</small> de <code>flores</code> a un
-pez. &iquest;Qu&eacute; lista contiene ahora <code>mas-flores</code>?
-</p>
-<hr>
-<a name="Pegando"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Implementaci_00f3n-de-listas" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-Lista" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Resumen-del-anillo-de-la-muerte" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Pegando-texto"></a>
-<h1 class="chapter">10 Pegando texto</h1>
-<a name="index-pegar"></a>
-<a name="index-Recuperar-Texto"></a>
-<a name="index-Recuperando-Texto"></a>
-<a name="index-Pegando-Texto"></a>
-
-<p>Siempre y cuando se corta texto fuera de un b&uacute;ffer con un comando
-&lsquo;kill&rsquo; en GNU Emacs, se puede traer con un comando &lsquo;pegar&rsquo;. El texto
-cortado del b&uacute;ffer es puesto en el anillo de la muerte y en los
-comandos pegar, se insertan los contenidos apropiados del kill ring
-detr&aacute;s de un b&uacute;ffer (no necesariamente el b&uacute;ffer original).
-</p>
-<p>Un simple comando <kbd>C-y</kbd> (<code>yank</code>) inserta el primer
-&iacute;tem desde el anillo de la muerte <em>kill ring</em>
-dentro del actual b&uacute;ffer. Si el comando <kbd>C-y</kbd> es seguido
-inmediatamente para <kbd>M-y</kbd>, el primer elemento se reemplaza por el
-segundo elemento. Los sucesivos comandos <kbd>M-y</kbd> reemplazan el
-segundo elemento con el tercer, cuarto, o quinto elemento, y
-as&iacute;. Cuando se llega al &uacute;ltimo elemento en el anillo
-de la muerte <em>kill ring</em>, se reemplaza por el primer elemento y
-el ciclo se repite. (De este modo, el kill ring se llama un &lsquo;anillo&rsquo;
-en vez de solo una &lsquo;lista&rsquo;. Sin embargo, la estructura de de datos
-actual que maneja el texto es una lista. V&eacute;ase la secci&oacute;n <a href="#Qu_00e9-hace-el-anillo-de-la-muerte">Manejando el anillo de la muerte <em>kill ring</em></a>, para
-los detalles de c&oacute;mo la lista es manejada como un anillo.)
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Resumen-del-anillo-de-la-muerte">10.1 Resumen del anillo de la muerte</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#kill_002dring_002dyank_002dpointer">10.2 La variable <code>kill-ring-yank-pointer</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El anillo de la muerte es una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#pegar-Ejercicio-nthcdr">10.3 Ejercicios con <code>yank</code> y <code>nthcdr</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La variable <code>kill-ring-yank-pointer</code>.
-</td></tr>
-</table>
-
-<hr>
-<a name="Resumen-del-anillo-de-la-muerte"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Pegando" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Pegando" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Pegando" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#kill_002dring_002dyank_002dpointer" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Resumen-del-anillo-de-la-muerte-1"></a>
-<h2 class="section">10.1 Resumen del anillo de la muerte</h2>
-<a name="index-Resumen-del-Anillo-de-la-Muerte-Kill-ring"></a>
-
-<p>El anillo de la muerte <em>kill ring</em> es una lista de cadenas
-textuales. Esto es lo que se ve:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&quot;alg&uacute;n texto&quot; &quot;una pieza diferente pieza de texto&quot;
-&quot;todav&iacute;a m&aacute;s texto&quot;)
-</pre></div>
-
-<p>Si estos fueran los contenidos de mi anillo de la muerte <em>kill
-ring</em> y yo presionara <kbd>C-y</kbd>, la cadena de caracteres diciendo
-&lsquo;<samp>alg&uacute;n texto</samp>&rsquo; ser&iacute;a insertado en este b&uacute;ffer
-donde mi cursor est&aacute; localizado.
-</p>
-<p>El comando <code>yank</code> <em>pegar</em> es tambi&eacute;n usado para duplicar
-texto copi&aacute;ndolo. El texto copiado no es cortado desde el b&uacute;ffer,
-pero una copia de eso se pone en el anillo de la muerte <em>kill
-ring</em> y se inserta peg&aacute;ndolo.
-</p>
-<p>Tres funciones se usan para atraer texto desde el anillo de la muerte
-<em>kill ring</em>: <code>yank</code> (<em>pegar</em>), que normalmente se
-asocian a <kbd>C-y</kbd>; <code>yank-pop</code>, que normalmente se asocia a
-<kbd>M-y</kbd>; y <code>rotate-yank-pointer</code>, que se usa por las otras
-dos funciones.
-</p>
-<p>Estas funciones se refieren al kill ring <em>anillo de la muerte</em> a
-trav&eacute;s de una variable llamada el <code>kill-ring-yank-pointer</code>. En
-vez de eso, la inserci&oacute;n del c&oacute;digo para ambos son las funciones
-<code>yank</code> y <code>yank-pop</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(insert (car kill-ring-yank-pointer))
-</pre></div>
-
-<p>(Bien, no m&aacute;s. En GNU Emacs 22, la funci&oacute;n se ha reemplazado por
-<code>insert-for-yank</code> que llama a <code>insert-for-yank-1</code>
-repetitivamente para cada segmento <code>yank-handler</code>. En vez de eso,
-<code>insert-for-yank-1</code> destituye las propiedades de texto desde el
-texto insertado de acuerdo a <code>yank-excluded-properties</code>. De otro
-modo, eso es como <code>insert</code>. Nosotros lo pegamos con un <code>insert</code>
-plano puesto que sea f&aacute;cil de comprender.)
-</p>
-<p>Para empezar a comprender c&oacute;mo <code>yank</code> y <code>yank-pop</code>
-funcionan, primero es necesario mirar en la variable
-<code>kill-ring-yank-pointer</code>.
-</p>
-<hr>
-<a name="kill_002dring_002dyank_002dpointer"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Pegando" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Resumen-del-anillo-de-la-muerte" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Pegando" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#pegar-Ejercicio-nthcdr" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-variable-kill_002dring_002dyank_002dpointer"></a>
-<h2 class="section">10.2 La variable <code>kill-ring-yank-pointer</code></h2>
-
-<p><code>kill-ring-yank-pointer</code> es una variable, solo como
-<code>kill-ring</code> es una variable. Eso apunta a alguna cosa siendo
-asignada al valor de lo que apunta, como cualquier otra variable Lisp.
-</p>
-<p>De este modo, si el valor del kill ring es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&quot;alg&uacute;n texto&quot; &quot;una pieza diferente pieza de texto&quot;
-&quot;todav&iacute;a m&aacute;s texto&quot;)
-</pre></div>
-
-<p>y el <code>kill-ring-yank-pointer</code> apunta a la segunda cl&aacute;usula, el
-valor de <code>kill-ring-yank-pointer</code> es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&quot;una pieza diferente de texto&quot; &quot;todav&iacute;a m&aacute;s texto&quot;)
-</pre></div>
-
-<p>Como se explica en el cap&iacute;tulo previo
-(V&eacute;ase la secci&oacute;n <a href="#Implementaci_00f3n-de-listas">C&oacute;mo las listas se implementan</a>), el ordenador no guarda dos copias
-diferentes del texto siendo apuntado por ambos el <code>kill-ring</code> (el
-<em>anillo de la muerte</em>) y el <code>kill-ring-yank-pointer</code> (el
-<em>puntero de pegar el anillo de la muerte</em>). Las
-palabras &ldquo;una pieza diferente de texto&rdquo; y &ldquo;todav&iacute;a
-m&aacute;s texto&rdquo; no est&aacute;n duplicadas. En vez de eso, las dos variables
-Lisp apuntan a las mismas piezas de texto. Aqu&iacute; hay un
-diagrama:
-</p>
-<div class="smallexample">
-<pre class="smallexample">kill-ring kill-ring-yank-pointer
- | |
- | ___ ___ | ___ ___ ___ ___
- ---&gt; | | | --&gt; | | | | | |
- |___|___|----&gt; |___|___|--&gt; |___|___|--&gt; nil
- | | |
- | | |
- | | --&gt; &quot;todav&iacute;a m&aacute;s texto&quot;
- | |
- | --&gt; &quot;una pieza diferente de texto&quot;
- |
- --&gt; &quot;algo de texto&quot;
-</pre></div>
-<br>
-<br>
-<br>
-
-<p>Tanto la variable <code>kill-ring</code> y la variable
-<code>kill-ring-yank-pointer</code> son punteros. Pero el kill ring
-<em>anillo de la muerte</em> en s&iacute; es normalmente descrito
-como si fuera actualmente de lo que est&aacute; compuesto. El
-<code>kill-ring</code> se refiere a lo que es la lista en vez de lo que
-apunta a la lista. Conversando, el <code>kill-ring-yank-pointer</code> se
-refiere a como se apunta a una lista.
-</p>
-<p>Estas dos maneras hablar acerca de la misma cosa suena confuso al
-principio pero tiene sentido para reflexionar. El kill ring
-<em>anillo de la muerte</em> es generalmente pensado como la estructura
-completa de datos que manejan la informaci&oacute;n de lo que se ha
-cortado reci&eacute;ntemente de los b&uacute;ffers de Emacs. El
-<code>kill-ring-yank-pointer</code> en la otra mano, sirve para indicar &mdash;
-que es, para &lsquo;apuntar a&rsquo; &mdash; esta parte del anillo de la muerte del
-que el primer elemento (el <small>CAR</small>) ser&aacute; insertado.
-</p>
-
-<hr>
-<a name="pegar-Ejercicio-nthcdr"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Pegando" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#kill_002dring_002dyank_002dpointer" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Pegando" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicios-con-yank-y-nthcdr"></a>
-<h2 class="section">10.3 Ejercicios con <code>yank</code> y <code>nthcdr</code></h2>
-
-<ul>
-<li>
-Usando <kbd>C-h v</kbd> (<code>describe-variable</code>), mira en el valor de tu
-kill ring <em>anillo de la muerte</em>. A&ntilde;ade varios
-&iacute;tems a tu anillo de la muerte <em>kill ring</em>; mira en
-su valor de nuevo. Usando <kbd>M-y</kbd> (<code>yank-pop</code>, mueve todo el
-camino alrededor del kill ring <em>anillo de la
-muerte</em>. &iquest;Cu&aacute;ntos &iacute;tems estaban en tu
-kill ring <em>anillo de la muerte</em>? Encuentra el valor de
-<code>kill-ring-max</code>. &iquest;Estaba tu anillo de la muerte
-<em>kill ring</em> completo, o podr&iacute;as haber guardado
-m&aacute;s bloques de texto dentro?
-
-</li><li>
-Usando <code>nthcrd</code> y <code>car</code>, construye una serie de expresiones
-para devolver, el primer, segundo, tercer y cuarto elemento de una lista.
-</li></ul>
-
-<hr>
-<a name="Bucles-y-recursi_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Pegando" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#pegar-Ejercicio-nthcdr" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#while" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Bucles-y-recursion"></a>
-<h1 class="chapter">11 Bucles y recursi&oacute;n</h1>
-<a name="index-Bucles-y-recursion"></a>
-<a name="index-Recursion-y-bucles"></a>
-<a name="index-Repeticion-_0028bucles_0029"></a>
-
-<p>Emacs Lisp tiene dos caminos primarios para causar una expresi&oacute;n, o
-una serie de expresiones, para ser evaluado repetidamente: uno usa un
-bucle <code>while</code>, y el otro usa <em>recursi&oacute;n</em>.
-</p>
-<p>La repetici&oacute;n puede ser valorable. Por ejemplo, para mover hacia
-delante cuatro frases, tu solo necesitas escribir un programa que
-mover&aacute; hacia delante una frase y entonces repite el proceso cuatro
-veces. Ya que un ordenador no est&aacute; aburrido o cansado, tal acci&oacute;n
-repetitiva no tiene los efectos de borrado por equivocaci&oacute;n o exceso
-que pueden tener los humanos.
-</p>
-<p>La gente mayoritariamente escribe funciones de Emacs Lisp usando
-bucles <code>while</code>; pero se puede usar recursi&oacute;n, que provee un
-poderoso camino mental para resolver problemas<a name="DOCF11" href="#FOOT11">(11)</a>.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#while">11.1 <code>while</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Causando un cierto c&oacute;digo para repetir.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Dolist-y-dotimes">11.2 Ahorra tiempo: <code>dolist</code> y <code>dotimes</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Dolist y dotimes
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Recursi_00f3n">11.3 Recursi&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Causando que una funci&oacute;n se llame a
- s&iacute; misma.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-de-Bucle">11.4 Ejercicio de bucles</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio de Bucle
-</td></tr>
-</table>
-
-<hr>
-<a name="while"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-while" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="while-1"></a>
-<h2 class="section">11.1 <code>while</code></h2>
-<a name="index-Bucles"></a>
-<a name="index-while"></a>
-
-<p>La forma especial <code>while</code> chequea si el valor devuelto para
-evaluar el primer argumento es verdadero o falso. Esto es parecido a
-lo que el int&eacute;rprete Lisp hace con un <code>if</code>; el int&eacute;rprete
-hace lo siguiente, sin embargo, es diferente.
-</p>
-<p>En una expresi&oacute;n <code>while</code>, si el valor devuelto por evaluar el
-primer argumento es falso, el int&eacute;rprete Lisp descarta el resto de la
-expresi&oacute;n (el <em>cuerpo</em> de la expresi&oacute;n) y no la eval&uacute;a. Sin
-embargo, si el valor es cierto, el int&eacute;rprete Lisp eval&uacute;a el
-cuerpo de la expresi&oacute;n y entonces de nuevo chequea si el primer
-argumento para <code>while</code> es cierto o falso. Si el valor devuelto de
-evaluar el primer argumento es cierto de nuevo, el int&eacute;rprete Lisp
-eval&uacute;a el cuerpo de la expresi&oacute;n.
-</p>
-<p>La plantilla para una expresi&oacute;n <code>while</code> se ve as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while <var>test-verdadero-o-falso</var>
- <var>cuerpo</var>&hellip;)
-</pre></div>
-
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Bucles-while">Bucles con <code>while</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Repetir tantas veces como el test devuelva
- verdadero.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejemplo-de-bucle">11.1.1 Un bucle <code>while</code> y una lista</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un bucle <code>while</code> que usa una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#print_002delements_002dof_002dlist">11.1.2 Un ejemplo: <code>imprimir-elementos-de-la-lista</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usos <code>while</code>, <code>car</code>, <code>cdr</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Incrementando-el-Bucle">11.1.3 Un bucle con un contaje incremental</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un bucle con un contador de incremento.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Incrementando-los-detalles-de-los-bucles">Detalles de un bucle que se incrementa</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Incrementando los detalles de
- los bucles
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Bucle-que-se-decrementa">11.1.4 Bucle que decrementa</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un bucle con un decrementando contador.
-</td></tr>
-</table>
-
-<hr>
-<a name="Bucles-while"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#while" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#while" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-de-bucle" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Bucles-con-while"></a>
-<h3 class="unnumberedsubsec">Bucles con <code>while</code></h3>
-
-<p>En el momento en el que el true-or-false-test de la expresi&oacute;n
-<code>while</code> devuelve un valor cierto cuando eso se eval&uacute;a, el
-cuerpo es repetidamente evaluado. Este proceso se llama bucle puesto
-que el int&eacute;rprete Lisp repite la misma cosa una y otra vez, como un
-avi&oacute;n haciendo un loop. Cuando el resultado de evaluar el
-true-or-false-test es falso, el int&eacute;rprete Lisp no eval&uacute;a el resto
-de la expresi&oacute;n <code>while</code> y &lsquo;existe el bucle&rsquo;.
-</p>
-<p>Claramente, si el valor devuelto evaluando el primer argumento para
-<code>while</code> es siempre cierto, el cuerpo siguiente ser&aacute; evaluado
-una y otra vez &hellip; y &hellip; para
-siempre. Rec&iacute;procamente, si el valor devuelto nunca es
-cierto, las expresiones en el cuerpo nunca ser&aacute;n evaluadas. La
-fortaleza de escribir un bucle <code>while</code> consiste de elegir un
-mecanismo tal que el true-or-false-test devuelva cierto solo el
-n&uacute;mero de veces que requieren las subsiguientes expresiones para
-ser evaluadas, y entonces tener el test devuelto a falso.
-</p>
-<p>El valor devuelto evaluando <code>while</code> es el valor del
-true-or-false-test. Una consecuencia interesante de esto es que un
-bucle <code>while</code> que eval&uacute;a sin errores devolver&aacute; <code>nil</code> o
-falso sin dignidad de si eso ha girado 1 o 100 veces o
-ninguna. &iexcl;Una expresi&oacute;n <code>while</code> que se eval&uacute;a de
-manera exitosa nunca devuelve un valor cierto! Lo que esto significa
-es que <code>while</code> es siempre evaluado por sus efectos laterales, que
-es decir, las consecuencias de evaluar las expresiones con el cuerpo
-del bucle <code>while</code>. Esto tiene sentido. Eso no es el mero acto del
-bucle que es deseado, pero las consecuencias de lo que ocurre cuando
-las expresiones en el bucle son repetidamente evaluadas.
-</p>
-<hr>
-<a name="Ejemplo-de-bucle"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-while" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#while" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002delements_002dof_002dlist" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Un-bucle-while-y-una-lista"></a>
-<h3 class="subsection">11.1.1 Un bucle <code>while</code> y una lista</h3>
-
-<p>Un camino com&uacute;n para controlar un bucle <code>while</code> es chequear si
-una lista tiene cualquier elemento. Si eso se hace, el bucle se
-repite; pero si no, la repetici&oacute;n se finaliza. Puesto que esto es
-una t&eacute;cnica importante, se crear&aacute; un breve ejemplo para
-ilustrarlo.
-</p>
-<p>Un camino simple para chequear si una lista tiene elementos es evaluar
-la lista: si eso no tiene elementos, si es una lista
-vac&iacute;a y devuelve la lista vac&iacute;a,
-<code>()</code>, que es un sin&oacute;nimo para <code>nil</code> o falso. Por otro
-lado, una lista con elementos devolver&aacute; estos elementos cuando eso
-se eval&uacute;a. Puesto que Emacs Lisp considera como cierto cualquier
-valor que no es <code>nil</code>, una lista que devuelve elementos
-chequear&aacute; cierto en un bucle <code>while</code>.
-</p>
-<p>Por ejemplo, se puede asignar la variable <code>empty-list</code> a
-<code>nil</code> para evaluar la siguiente expresi&oacute;n <code>setq</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq lista-vacia ())
-</pre></div>
-
-<p>Despu&eacute;s de evaluar la expresi&oacute;n <code>setq</code>, se puede evaluar la
-variable <code>lista-vacia</code> es el camino normal, posicionando el cursor
-despu&eacute;s del s&iacute;mbolo y escribiendo <kbd>C-x C-e</kbd>;
-<code>nil</code> aparecer&aacute; en tu &aacute;rea echo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">lista-vacia
-</pre></div>
-
-<p>Por otro lado, si se asigna una variable para ser una lista con
-elementos, la lista aparecer&aacute; cuando se eval&uacute;e la variable, como
-se puede ver evaluando las siguientes dos expresiones:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq animales '(gacela jirafa leon tigre))
-
-animales
-</pre></div>
-
-<p>De este modo, para un bucle <code>while</code> que chequea si hay cualquier
-&iacute;tem en la lista <code>animales</code>, la primera parte del
-bucle ser&aacute; escrito as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while animales
- &hellip;
-</pre></div>
-
-<p>Cuando el <code>while</code> chequea su primer argumento, la variable
-<code>animales</code> se eval&uacute;a. Eso devuelve una lista. Mientras la
-lista tiene elementos, el <code>while</code> considera los resultados del
-test para ser verdadero; pero cuando la lista es vac&iacute;a,
-eso considera los resultados del test para ser falso.
-</p>
-<p>Para prevenir que el bucle <code>while</code> se ejecute siempre, se
-necesita proporcionar alg&uacute;n mecanismo. Una t&eacute;cnica usada con
-frecuencia es tener una de las subsiguientes formas en la expresi&oacute;n
-<code>while</code> que asigna el valor de la lista para ser el <small>CDR</small> de
-la lista. Cada vez que la funci&oacute;n <code>cdr</code> se eval&uacute;a, se va
-reduciendo, hasta que finalmente solo queda la lista
-vac&iacute;a. En este punto, el test del bucle <code>while</code>
-devolver&aacute; falso, y los argumentos para el <code>while</code> no se
-evaluar&aacute;n.
-</p>
-<p>Por ejemplo, la lista de animales asociada a la variable
-<code>animals</code> se puede asignar a ser el <small>CDR</small> de la lista original
-con la siguiente expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq animals (cdr animals))
-</pre></div>
-
-<p>Si se han evaluado las expresiones previas y entonces se eval&uacute;a esta
-expresi&oacute;n, se ver&aacute; <code>(jirafa leon tigre)</code> que aparecer&aacute; en
-el &aacute;rea echo. Si se eval&uacute;a la expresi&#324; de nuevo, <code>(leon
-tigre)</code> aparecer&aacute; en el &aacute;rea echo. Si se eval&uacute;a de nuevo,
-<code>(tigre)</code> y todav&iacute;a de nuevo aparecer&aacute; la lista
-vac&iacute;a y se mostrar&aacute; como <code>nil</code>.
-</p>
-<p>Una plantilla para un bucle <code>while</code> usa la funci&oacute;n <code>cdr</code>
-repetidamente para causar el true-or-false-test finalmente para
-chequear la veracidad y se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while <var>test-whether-list-is-empty</var>
- <var>body</var>&hellip;
- <var>set-list-to-cdr-of-list</var>)
-</pre></div>
-
-<p>Este chequeo y uso de <code>cdr</code> puede ser puesto junto a una
-funci&oacute;n que va a trav&eacute;s de una lista e imprime cada elemento de la
-lista en una l&iacute;nea de s&iacute; misma.
-</p>
-<hr>
-<a name="print_002delements_002dof_002dlist"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-de-bucle" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#while" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Incrementando-el-Bucle" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Un-ejemplo_003a-imprimir_002delementos_002dde_002dla_002dlista"></a>
-<h3 class="subsection">11.1.2 Un ejemplo: <code>imprimir-elementos-de-la-lista</code></h3>
-<a name="index-print_002delements_002dof_002dlist"></a>
-
-<p>La funci&oacute;n <code>imprimir-elementos-de-la-lista</code> ilustra un bucle
-<code>while</code> con una lista.
-</p>
-<a name="index-_002ascratch_002a-buffer"></a>
-<p>La funci&oacute;n requiere varias l&iacute;neas por su salida. Si
-est&aacute;s leyendo esto en una instancia reciente de GNU Emacs, se puede
-evaluar la siguiente expresi&oacute;n dentro de Info, de normal.
-</p>
-<p>Si se est&aacute; usando una versi&oacute;n antigua de Emacs, es necesario
-copiar las expresiones necesarias para el b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; y
-evaluarlas all&iacute;. Esto es porque el &aacute;rea echo
-ten&iacute;a solo una l&iacute;nea en las versiones
-antiguas.
-</p>
-<p>Se pueden copiar las expresiones marcando el principio de la regi&oacute;n
-con <kbd>C-&lt;SPC&gt;</kbd> (<code>set-mark-command</code>), moviendo el cursor al
-fin de la regi&oacute;n y entonces copiando la regi&oacute;n usando <kbd>M-w</kbd>
-(<code>kill-ring-save</code>, que llama a <code>copy-region-as-kill</code> y
-entonces provee realimentaci&oacute;n visual). En el b&uacute;ffer
-&lsquo;<tt>*scratch*</tt>&rsquo;, se pueden copiar las expresiones escribiendo
-<kbd>C-y</kbd> (<code>yank</code>).
-</p>
-<p>Despu&eacute;s de haber copiado las expresiones al b&uacute;ffer
-&lsquo;<tt>*scratch*</tt>&rsquo;, se eval&uacute;a cada expresi&oacute;n en orden. Aseg&uacute;rese
-de evaluar la &uacute;ltima expresi&oacute;n, <code>(imprimir-elementos-de-la-lista
-animales)</code>, escribiendo <kbd>C-u C-x C-e</kbd>, que es, dando un argumento
-para <code>eval-last-sexp</code>. Esto causar&aacute; el resultado de la
-evaluaci&oacute;n para ser impreso en el b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; en vez
-de siendo impreso en el &aacute;rea echo. (De otro modo se ver&aacute; alguna
-cosa como esto en tu &aacute;rea echo:
-<code>^Jgacela^J^Jjirafa^J^Jleon^J^Jtigre^Jnulo</code>, en cada &lsquo;<samp>^J</samp>&rsquo; se
-estructura una &lsquo;nueva l&iacute;nea&rsquo;.)
-</p>
-<p>En una instancia de GNU Emacs reciente, se pueden evaluar estas
-expresiones directamente en el b&uacute;ffer Info, y el &aacute;rea echo crecer&aacute;
-para mostrar los resultados.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq animales '(gacela jirafa leon tigre))
-
-(defun imprimir-elementos-de-la-lista (list)
- &quot;Imprime cada elemento de LIST en una l&iacute;nea.&quot;
- (while list
- (print (car list))
- (setq list (cdr list))))
-
-(imprimir-elementos-de-la-lista animales)
-</pre></div>
-
-<p>Cuando se eval&uacute;an las tres expresiones en secuencia, se ver&aacute; esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">gacela
-
-jirafa
-
-leon
-
-tigre
-nil
-</pre></div>
-
-<p>Cada elemento de la lista se imprime en una l&iacute;nea en
-s&iacute; (que es lo que la funci&oacute;n <code>print</code> hace) y
-entonces el valor devuelto por la funci&oacute;n se imprime. Desde que la
-&uacute;ltima expresi&oacute;n en la funci&oacute;n es el bucle <code>while</code>, y
-desde que el bucle <code>while</code> siempre devuelve <code>nil</code>, un
-<code>nil</code> se imprime despu&eacute;s del &uacute;ltimo elemento de la lista.
-</p>
-<hr>
-<a name="Incrementando-el-Bucle"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002delements_002dof_002dlist" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#while" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Incrementando-los-detalles-de-los-bucles" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Un-bucle-con-un-contaje-incremental"></a>
-<h3 class="subsection">11.1.3 Un bucle con un contaje incremental</h3>
-
-<p>Un bucle no es &uacute;til a menos que pare cuando debe. Bajo el control de
-un bucle con una lista, un camino com&uacute;n de parar un bucle es
-escribir el primer argumento como un test que devuelve falso cuando el
-n&uacute;mero correcto de repeticiones es completo. Esto significa que el
-bucle debe tener un contador &mdash; una expresi&oacute;n que cuenta cu&aacute;ntas
-veces el bucle se repite a s&iacute; mismo.
-</p>
-<hr>
-<a name="Incrementando-los-detalles-de-los-bucles"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Incrementando-el-Bucle" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#while" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-de-Incremento" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Detalles-de-un-bucle-que-se-incrementa"></a>
-<h3 class="unnumberedsubsec">Detalles de un bucle que se incrementa</h3>
-
-<p>El test para un bucle con un contador de incremento puede ser una
-expresi&oacute;n tal como <code>(&lt; contador numero-deseado)</code> que devuelve
-<code>t</code> para verdad si el valor de <code>contador</code> es menor que el
-<code>numero-deseado</code> de repeticiones y <code>nil</code> para falso si el
-valor de <code>contador</code> es igual a o es mayor que el
-<code>numero-deseado</code>. La expresi&oacute;n que incrementa el contador puede
-ser un simple <code>setq</code> tal como <code>(setq contador (1+ contador))</code>,
-donde <code>1+</code> es una funci&oacute;n construida en Emacs Lisp que a&ntilde;ade
-1 a su argumento. (La expresi&oacute;n <code>(1+&nbsp;contador)</code> tiene el mismo
-resultado que <code>(+&nbsp;contador&nbsp;1)</code>, que es f&aacute;cil de leer para un
-humano.)
-</p>
-<p>La plantilla para un bucle <code>while</code> controlado por un contador
-que se incrementa se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample"><var>asignar-contador-al-valor-inicial</var>
-(while (&lt; contador numero-deseado) ; <span class="roman">true-or-false-test</span>
- <var>body</var>&hellip;
- (setq contador (1+ contador))) ; <span class="roman">incremento</span>
-</pre></div>
-
-<p>Note que se necesita asignar el valor inicial de <code>contador</code>;
-normalmente asignado a 1.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Ejemplo-de-Incremento">Ejemplo con contador incremental</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Contando esquinas en un tri&aacute;ngulo.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Partes-Inc-de-Ejemplo">Las partes de la definici&oacute;n de funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Ejemplo-Inc-junto">Poniendo la definici&oacute;n de la funci&oacute;n junta</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Poniendo la definici&oacute;n de funci&oacute;n junta.
-</td></tr>
-</table>
-
-<hr>
-<a name="Ejemplo-de-Incremento"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Incrementando-los-detalles-de-los-bucles" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Incrementando-los-detalles-de-los-bucles" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Partes-Inc-de-Ejemplo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejemplo-con-contador-incremental"></a>
-<h4 class="unnumberedsubsubsec">Ejemplo con contador incremental</h4>
-
-<p>Sup&oacute;n que est&aacute;s jugando en la playa y decides crear un tri&aacute;ngulo
-de asteriscos, poniendo un asterisco en la primera fila, dos en la
-segunda fila, tres en la tercera fila y as&iacute;:
-</p>
-<br>
-<div class="smallexample">
-<pre class="smallexample"> *
- * *
- * * *
- * * * *
-</pre></div>
-<br>
-
-<p>(Hace 2500 a&ntilde;os, Pit&aacute;goras y otras desarrollaron los principios de
-la teor&iacute;a de n&uacute;meros considerando preguntas como esta.)
-</p>
-<p>Sup&oacute;n que quieres saber cu&aacute;ntos asteriscos necesitar&aacute;s crear para un
-tri&aacute;ngulo con 7 filas
-</p>
-<p>Claramente, lo que necesitas hacer es a&ntilde;adir los n&uacute;meros de 1 a
-7. Hay dos caminos para hacer esto; se puede comenzar con los
-n&uacute;meros m&aacute;s peque&ntilde;os, uno, y a&ntilde;adir la lista en secuencia, 1,
-2, 3, 4 y as&iacute;; o empieza con el n&uacute;mero m&aacute;s largo y
-a&ntilde;ade la lista bajando: 7, 6, 5, 4 y as&iacute;. Porque ambos
-mecanismos ilustran caminos comunes de escribir el bucle <code>while</code>,
-crearemos dos ejemplos, uno contando hacia arriba y el otro contando
-hacia abajo. En este primer ejemplo, empezaremos con 1 y a&ntilde;adimos 2,
-3, 4 y as&iacute;.
-</p>
-<p>Si se quiere sumar toda una lista de n&uacute;meros, el camino m&aacute;s
-f&aacute;cil para hacer eso es sumar todos los n&uacute;meros a la vez. Sin
-embargo, si no se sabe cu&aacute;ntos n&uacute;meros tendr&aacute; la lista, o si se
-requiere estar preparado para una lista muy larga, entonces se
-necesita dise&ntilde;ar la adici&oacute;n, esto es, repetir un proceso simple
-muchas veces en vez de hacer un proceso m&aacute;s complejo.
-</p>
-<p>Por ejemplo, en vez de a&ntilde;adir todos los asteriscos a la vez, lo que
-se puede hacer es a&ntilde;adir el n&uacute;mero de asteriscos en la primera
-fila, 1, para el n&uacute;mero en la segunda fila, 2, y entonces a&ntilde;adir
-el total de estas dos filas a la tercera fila, 3. Entonces se puede
-a&ntilde;adir el n&uacute;mero en la cuarta fila, 4, al total de las primeras
-tres filas; y as&iacute;.
-</p>
-<p>La caracter&iacute;stica cr&iacute;tica del proceso es
-que cada acci&oacute;n repetitiva sea simple. En este caso, en cada paso
-nosotros a&ntilde;adimos solo dos n&uacute;meros, el n&uacute;mero de asteriscos en
-la fila y el total ya encontrado. Este proceso de a&ntilde;adir dos
-n&uacute;meros es repetido de nuevo y de nuevo hasta la &uacute;ltima fila que
-ha sido a&ntilde;adida al total de todas las filas precedentes. En un
-bucle m&aacute;s complejo la acci&oacute;n repetitiva podr&iacute;a no
-ser tan simple, pero ser&aacute; tan simple como hacer todo a la vez.
-</p>
-<hr>
-<a name="Partes-Inc-de-Ejemplo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-de-Incremento" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Incrementando-los-detalles-de-los-bucles" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-Inc-junto" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Las-partes-de-la-definicion-de-funcion"></a>
-<h4 class="unnumberedsubsubsec">Las partes de la definici&oacute;n de funci&oacute;n</h4>
-
-<p>El an&aacute;lisis precedente nos da los bonos de nuestra definici&oacute;n de
-funci&oacute;n: primero, necesitaremos una variable que podemos llamar
-<code>total</code> que ser&aacute; el n&uacute;mero total de asteriscos. Esto ser&aacute;
-el valor devuelto por la funci&oacute;n.
-</p>
-<p>Segundo, sabemos que la funci&oacute;n requerir&aacute; un argumento: este
-argumento ser&aacute; el n&uacute;mero de filas en el tri&aacute;ngulo. Eso puede
-llamarse <code>number-of-rows</code>.
-</p>
-<p>Finalmente, se necesita una variable para usarse como contador. Se
-podr&iacute;a llamar a esta variable <code>counter</code>, pero un
-nombre mejor es <code>row-number</code>. Debido a que lo que el contador hace
-en esta funci&oacute;n es contar filas, y un programa deber&iacute;a
-escribirse para ser comprendido en la medida de lo posible.
-</p>
-<p>Cuando el int&eacute;rprete Lisp primero empieza evaluando las expresiones
-de la funci&oacute;n, el valor de <code>total</code> estar&iacute;a
-asignado a cero, ya que no hemos a&ntilde;adido cualquier cosa a
-eso. Entonces la funci&oacute;n a&ntilde;adir&iacute;a el n&uacute;mero de
-asteriscos en la primera fila al total, y entonces a&ntilde;ade el n&uacute;mero
-de asteriscos en la segunda al total, y entonces a&ntilde;ade el n&uacute;mero
-de asteriscos a la tercera fila al total, y as&iacute;, hasta
-que no hay m&aacute;s filas a la izquierda para a&ntilde;adir.
-</p>
-<p>Ambos <code>total</code> y <code>row-number</code> se usan solo dentro de la
-funci&oacute;n, as&iacute; ellos pueden ser declarados como
-variables locales con <code>let</code> y valores iniciales
-dados. Claramente, el valor inicial para total ser&iacute;a
-0. El valor inicial de <code>row-number</code> ser&iacute;a 1, desde
-que se comienza con la primera fila. Esto significa que la frase
-<code>let</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (let ((total 0)
- (row-number 1))
- <var>body</var>&hellip;)
-</pre></div>
-
-<p>Despu&eacute;s de que las variables internas se declaran y se asignan a
-sus valores iniciales se podr&iacute;a empezar el bucle
-<code>while</code>. La expresi&oacute;n que sirve como el test
-devolver&iacute;a un valor de <code>t</code> para la verdad tan
-grande como el <code>row-number</code> que es menor o igual al
-<code>number-of-rows</code>. (La expresi&oacute;n devuelve cierto solo si el
-n&uacute;mero de fila es menor que el n&uacute;mero de filas en el tri&aacute;ngulo,
-la &uacute;ltima fila nunca ser&aacute; a&ntilde;adida al total; aqu&iacute;
-el n&uacute;mero de fila tiene que ser menor o igual el n&uacute;mero de
-filas.))
-</p>
-<a name="index-_003c_003d-_0028menos-que-igual_0029"></a>
-<p>Lisp provee la funci&oacute;n <code>&lt;=</code> que devuelve cierto si el valor de
-su primer argumento es menor o igual al valor de su segundo argumento
-y falso de otro modo. As&iacute; la expresi&oacute;n que el
-<code>while</code> evaluar&aacute; como si su test se ver&iacute;a como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&lt;= row-number number-of-rows)
-</pre></div>
-
-<p>El n&uacute;mero de asteriscos puede encontrarse repetidamente a&ntilde;adiendo
-el n&uacute;mero de asteriscos en una fila al total ya encontrado. Puesto
-que el n&uacute;mero de asteriscos en la fila es igual al n&uacute;mero de la
-fila, el total puede encontrarse a&ntilde;adiendo el n&uacute;mero de filas
-al total. (Claramente, en una situaci&oacute;n m&aacute;s compleja, el n&uacute;mero
-de asteriscos en la fila podr&iacute;a ser relacionada al
-n&uacute;mero de la fila en un camino m&aacute;s complicado; si este fuera el
-caso, el n&uacute;mero de fila ser&iacute;a reemplazado por la
-expresi&oacute;n apropiada.)
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq total (+ total row-number))
-</pre></div>
-
-<p>Lo que esto hace es asignar el nuevo valor de <code>total</code> a ser igual a
-la suma de a&ntilde;adiendo el n&uacute;mero de asteriscos en la fila al total previo.
-</p>
-<p>Despu&eacute;s de configurar el valor de <code>total</code>, las condiciones
-deben ser establecidas para la siguiente repetici&oacute;n del bucle,
-si hay alguna. Esto se hace incrementando el valor de la variable
-<code>row-number</code>, que sirve como un contador. Despu&eacute;s que la
-variable <code>row-number</code> ha sido incrementada, el true-or-false-test
-al principio del bucle <code>while</code> chequea si su valor es
-todav&iacute;a menor o igual al valor del <code>number-of-rows</code>
-y si eso es, a&ntilde;ade el nuevo valor de la variable <code>row-number</code>
-al <code>total</code> de la repetici&oacute;n del bucle.
-</p>
-<p>La funci&oacute;n construida en Emacs Lisp <code>1+</code> a&ntilde;ade 1 a un
-n&uacute;mero, as&iacute; la variable <code>row-number</code> puede ser
-incrementado con esta expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq row-number (1+ row-number))
-</pre></div>
-
-<hr>
-<a name="Ejemplo-Inc-junto"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Partes-Inc-de-Ejemplo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Incrementando-los-detalles-de-los-bucles" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucle-que-se-decrementa" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Poniendo-la-definicion-de-la-funcion-junta"></a>
-<h4 class="unnumberedsubsubsec">Poniendo la definici&oacute;n de la funci&oacute;n junta</h4>
-
-<p>Nosotros hemos creado las partes para la definici&oacute;n de la funci&oacute;n;
-ahora necesitamos ponerlas juntas.
-</p>
-<p>Primero, los contenidos de la expresi&oacute;n <code>while</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while (&lt;= row-number number-of-rows) ; <span class="roman">true-or-false-test</span>
- (setq total (+ total row-number))
- (setq row-number (1+ row-number))) ; <span class="roman">incremento</span>
-</pre></div>
-
-<p>Tener la expresi&oacute;n <code>let</code> de varlist, se acerca a completar el
-cuerpo de la definici&oacute;n de funci&oacute;n. Sin embargo, eso requiere un
-elemento final, la necesidad para la que es alguna cosa peque&ntilde;a.
-</p>
-<p>El toque final es emplazar la variable <code>total</code> en una
-l&iacute;nea por s&iacute; misma despu&eacute;s de la
-expresi&oacute;n <code>while</code>. De otro modo, el valor devuelto por la
-funci&oacute;n completa es el valor de la &uacute;ltima expresi&oacute;n que es
-evaluada en el cuerpo del <code>let</code>, y este es el valor devuelto por
-el <code>while</code> que es siempre <code>nil</code>.
-</p>
-<p>Esto puede no ser evidente a primera vista. Eso casi se ve como si la
-expresi&oacute;n de incremento es la &uacute;ltima expresi&oacute;n de la funci&oacute;n
-completa. Pero esta expresi&oacute;n es parte del cuerpo del <code>while</code>;
-eso es el &uacute;ltimo elemento de la lista que empieza con el
-s&iacute;mbolo <code>while</code>. M&aacute;s all&aacute;, el bucle
-<code>while</code> completo es una lista con el cuerpo del <code>let</code>.
-</p>
-<p>En l&iacute;nea (<em>outline</em>), la funci&oacute;n se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun <var>name-of-function</var> (<var>argument-list</var>)
- &quot;<var>documentation</var>&hellip;&quot;
- (let (<var>varlist</var>)
- (while (<var>true-or-false-test</var>)
- <var>body-of-while</var>&hellip; )
- &hellip; )) ; <span class="roman">Necesita la expresi&oacute;n final aqu&iacute;.</span>
-</pre></div>
-
-<p>El resultado de evaluar el <code>let</code> es que lo que est&aacute; yendo para
-devolver el <code>defun</code> desde el <code>let</code> que no est&aacute; embebido
-con cualquier lista que contiene, excepto para la <code>defun</code> como un
-todo. Sin embargo, si el <code>while</code> es el &uacute;ltimo elemento de la
-expresi&oacute;n <code>let</code>, la funci&oacute;n siempre devolver&aacute;
-<code>nil</code>. &iexcl;Esto no es lo que quiero! En vez de eso, lo
-que queremos es el valor de la variable <code>total</code>. Eso devuelve
-simplemente emplazando el s&iacute;mbolo como el &uacute;ltimo
-elemento de la lista empezando con <code>let</code>. Eso se eval&uacute;a
-despu&eacute;s de los elementos precedentes de la lista evaluada, que
-significa que eso se evalu&oacute; despu&eacute;s de haber sido asignado el
-valor correcto para el total.
-</p>
-<p>Eso puede ser f&aacute;cil de ver imprimiendo la lista empezando con
-<code>let</code> todo en una l&iacute;nea. Este formato hace evidente
-que las expresiones <var>varlist</var> y <code>while</code> son el segundo el
-tercer elementos de la lista empezando con <code>let</code>, y el
-<code>total</code> es el &uacute;ltimo elemento:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let (<var>varlist</var>) (while (<var>true-or-false-test</var>)
-<var>body-of-while</var>&hellip; ) total)
-</pre></div>
-
-<p>Poniendo cualquier cosa junta, la definici&oacute;n de funci&oacute;n
-<code>triangle</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun triangle (number-of-rows) ; <span class="roman">Versi&oacute;n con</span>
- ; <span class="roman"> contador de incremento.</span>
- &quot;A&ntilde;ade el n&uacute;mero de asteriscos en un tri&aacute;ngulo.
-La primera fila tiene un asterisco, la segunda fila dos asteriscos,
-la tercera fila tres asteriscos, y as&iacute;.
-El argumento es NUMBER-OF-ROWS.&quot;
-</pre><pre class="smallexample"> (let ((total 0)
- (row-number 1))
- (while (&lt;= row-number number-of-rows)
- (setq total (+ total row-number))
- (setq row-number (1+ row-number)))
- total))
-</pre></div>
-
-<p>Despu&eacute;s de haber instalado <code>triangle</code> para evaluar la funci&oacute;n,
-se puede probar. Aqu&iacute; hay dos ejemplos:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(triangle 4)
-
-(triangle 7)
-</pre></div>
-
-<p>La suma del primero de cuatro n&uacute;meros es 10 y la suma de los primeros
-siete n&uacute;meros es 28.
-</p>
-<hr>
-<a name="Bucle-que-se-decrementa"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-Inc-junto" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#while" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-de-Decremento" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Bucle-que-decrementa"></a>
-<h3 class="subsection">11.1.4 Bucle que decrementa</h3>
-
-<p>Otro camino com&uacute;n para escribir un bucle <code>while</code> es escribir el
-test as&iacute; que determina si un contador es mayor que
-cero. As&iacute; tan largo es el contador mayor que cero, el
-bucle se repite. Pero cuando el contador es igual o menor que cero,
-el bucle se para. Para este trabajo, el contador tiene que empezar
-mayor que cero y entonces se hace m&aacute;s peque&ntilde;o y peque&ntilde;o por una
-forma que es evaluada repetidamente.
-</p>
-<p>El test ser&aacute; una expresi&oacute;n tal como <code>(&gt; counter 0)</code> que
-devuelve <code>t</code> <em>cierto</em> si el valor de <code>counter</code> es mayor
-que cero, y <code>nil</code> <em>falso</em> si el valor de <code>counter</code> es
-igual a o menor que cero. La expresi&oacute;n hace que el n&uacute;mero menor y
-menor puede ser un simple <code>setq</code> tal como <code>(setq counter (1-
-counter)</code>, donde <code>1-</code> es una funci&oacute;n construida en Emacs Lisp
-que sustrae 1 de su argumento.
-</p>
-<p>La plantilla para decrementar el bucle <code>while</code> se ve
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while (&gt; counter 0) ; <span class="roman">test-verdadero-o-falso</span>
- <var>body</var>&hellip;
- (setq counter (1- counter))) ; <span class="roman">decremento</span>
-</pre></div>
-
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Ejemplo-de-Decremento">Ejemplo con el contador que se decrementa</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> M&aacute;s piedras en la playa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Partes-de-Ejemplo-Dec">Las partes de la definici&oacute;n de funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Ejemplo-Dec-junto">Poniendo la definici&oacute;n de la funci&oacute;n junta</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Poniendo la definici&oacute;n de funci&oacute;n junta.
-</td></tr>
-</table>
-
-<hr>
-<a name="Ejemplo-de-Decremento"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucle-que-se-decrementa" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucle-que-se-decrementa" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Partes-de-Ejemplo-Dec" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejemplo-con-el-contador-que-se-decrementa"></a>
-<h4 class="unnumberedsubsubsec">Ejemplo con el contador que se decrementa</h4>
-
-<p>Para ilustrar un bucle con un contador de decremento, reescribir&aacute; la
-funci&oacute;n <code>triangle</code> as&iacute; como el contador se
-decrementa a cero.
-</p>
-<p>Esto es lo inverso de la versi&oacute;n temprana de la funci&oacute;n. En este
-caso, para encontrar cu&aacute;ntos asteriscos son necesarios para crear un
-tri&aacute;ngulo con 3 filas, a&ntilde;ade el n&uacute;mero de asteriscos en la
-tercera fila, 3, para el n&uacute;mero en la fila precedente, 2, y entonces
-a&ntilde;ade el total de estas dos filas a la fila que lo precede, 1.
-</p>
-<p>M&aacute;s all&aacute;, para encontrar el n&uacute;mero de asteriscos en un
-tri&aacute;ngulo con 7 filas, a&ntilde;ade el n&uacute;mero de asteriscos en la fila
-siete, 7, al n&uacute;mero en la fila precedente, que es 6, y entonces
-a&ntilde;ade el total de estas dos filas a la fila esta que lo precede,
-que es 5, y as&iacute;. Como en el ejemplo previo, cada
-adici&oacute;n solo involucra la adici&oacute;n de dos n&uacute;meros, el total de
-las filas ya se a&ntilde;adi&oacute; y el n&uacute;mero de asteriscos en la fila que
-est&aacute; siendo a&ntilde;adida al total. Este proceso de a&ntilde;adir dos
-n&uacute;meros se repite de nuevo y de nuevo hasta que no haya m&aacute;s
-asteriscos que a&ntilde;adir.
-</p>
-<p>Sabemos con cu&aacute;ntos asteriscos empezar: el n&uacute;mero de asteriscos en
-la &uacute;ltima fila es igual al n&uacute;mero de filas. Si el tri&aacute;ngulo
-tiene siete filas, el n&uacute;mero de asteriscos en la &uacute;ltima fila es
-7. M&aacute;s all&aacute;, sabemos cu&aacute;ntos asteriscos est&aacute;n en la fila
-precedente: eso es uno menos que el n&uacute;mero en la fila.
-</p>
-<hr>
-<a name="Partes-de-Ejemplo-Dec"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-de-Decremento" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucle-que-se-decrementa" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-Dec-junto" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Las-partes-de-la-definicion-de-funcion-1"></a>
-<h4 class="unnumberedsubsubsec">Las partes de la definici&oacute;n de funci&oacute;n</h4>
-
-<p>Empezamos con tres variables: el n&uacute;mero total de filas en el
-tri&aacute;ngulo; el n&uacute;mero de asteriscos en una fila; y el n&uacute;mero
-total de asteriscos, que es lo que queremos calcular. Estas variables
-pueden llamarse <code>number-of-rows</code>,
-<code>number-of-pebbles-in-row</code>, y <code>total</code>, respectivamente.
-</p>
-<p>Ambos <code>total</code> y <code>number-of-pebbles-in-row</code> se usan solo
-dentro de la funci&oacute;n y se declaran con <code>let</code>. El valor
-inicial de <code>total</code> ser&iacute;a cero. Sin embargo, el
-valor inicial de <code>number-of-pebbles-in-row</code> ser&iacute;a
-igual al n&uacute;mero de filas en el tri&aacute;ngulo, desde la adici&oacute;n
-empezar&aacute; con la fila m&aacute;s larga.
-</p>
-<p>Esto significa que el principio de la expresi&oacute;n <code>let</code> se ver&aacute;
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let ((total 0)
- (number-of-pebbles-in-row number-of-rows))
- <var>body</var>&hellip;)
-</pre></div>
-
-<p>El n&uacute;mero total de asteriscos puede encontrarse repetidamente
-a&ntilde;adiendo el n&uacute;mero de asteriscos en una fila para el total ya
-encontrado, que, se eval&uacute;a repetidamente en la siguiente
-expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq total (+ total number-of-pebbles-in-row))
-</pre></div>
-
-<p>Despu&eacute;s el <code>number-of-pebbles-in-row</code> se a&ntilde;ade al
-<code>total</code>, el <code>number-of-pebbles-in-row</code> ser&iacute;a
-decrementado por uno, desde que la siguiente vez el bucle repite, la
-fila precedente ser&aacute; a&ntilde;adida al total.
-</p>
-<p>El n&uacute;mero de asteriscos en una fila precedente es uno menos que el
-n&uacute;mero de asteriscos en una fila, as&iacute; la funci&oacute;n
-Emacs Lisp construida <code>1-</code> puede usarse para computar el n&uacute;mero
-de asteriscos de la fila precedente. Esto puede ser hecho con la
-siguiente expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq number-of-pebbles-in-row
- (1- number-of-pebbles-in-row))
-</pre></div>
-
-<p>Finalmente, sabemos que el bucle <code>while</code> parar&iacute;a
-creando repetidas adiciones cuando no hay asteriscos en una
-fila. As&iacute; el test para el bucle <code>while</code> es simple:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while (&gt; number-of-pebbles-in-row 0)
-</pre></div>
-
-<hr>
-<a name="Ejemplo-Dec-junto"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Partes-de-Ejemplo-Dec" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucle-que-se-decrementa" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Dolist-y-dotimes" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Poniendo-la-definicion-de-la-funcion-junta-1"></a>
-<h4 class="unnumberedsubsubsec">Poniendo la definici&oacute;n de la funci&oacute;n junta</h4>
-
-<p>Se pueden poner estas expresiones juntas para crear una definici&oacute;n de
-funci&oacute;n que funcione. Sin embargo, al examinarlas, encontraremos que
-una de la variables locales &iexcl;es innecesaria!
-</p>
-<p>La definici&oacute;n de funci&oacute;n se ve como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; <span class="roman">Primero la versi&oacute;n substractiva.</span>
-(defun triangle (number-of-rows)
- &quot;A&ntilde;ade el n&uacute;mero de asteriscos en un tri&aacute;ngulo.&quot;
- (let ((total 0)
- (number-of-pebbles-in-row number-of-rows))
- (while (&gt; number-of-pebbles-in-row 0)
- (setq total (+ total number-of-pebbles-in-row))
- (setq number-of-pebbles-in-row
- (1- number-of-pebbles-in-row)))
- total))
-</pre></div>
-
-<p>Como se dijo, esta funci&oacute;n funciona.
-</p>
-<p>Sin embargo, no se necesita <code>number-of-pebbles-in-row</code>.
-</p>
-<a name="index-Argumento-como-variable-local"></a>
-<p>Cuando la funci&oacute;n <code>triangle</code> se eval&uacute;a, el
-s&iacute;mbolo <code>number-of-rows</code> ser&aacute; asociado al
-n&uacute;mero, dando un valor inicial. Este n&uacute;mero puede ser cambiado en
-el cuerpo de la funci&oacute;n si hubiera una variable local, sin miedo
-de que tal cambio se efectuar&aacute; el valor de la variable fuera de la
-funci&oacute;n. Esto es una caracter&iacute;stica muy &uacute;til de Lisp;
-eso significa que la variable <code>number-of-rows</code> puede ser usada en
-cualquier lugar en la funci&oacute;n donde <code>number-of-pebbles-in-row</code>
-se usa.
-</p>
-<p>Aqu&iacute; hay una segunda versi&oacute;n de la funci&oacute;n escrita un
-poco m&aacute;s limpiamente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun triangle (number) ; <span class="roman">Segunda versi&oacute;n.</span>
- &quot;Devuelve la suma de n&uacute;meros 1 a trav&eacute;s de NUMBER inclusive.&quot;
- (let ((total 0))
- (while (&gt; number 0)
- (setq total (+ total number))
- (setq number (1- number)))
- total))
-</pre></div>
-
-<p>En breve, un bucle <code>while</code> apropiadamente escrito consistir&aacute; de
-tres partes:
-</p>
-<ol>
-<li>
-Un test que devuelva falso despu&eacute;s de que el bucle ha repetido por
-s&iacute; mismo el n&uacute;mero de veces correcto.
-
-</li><li>
-Una expresi&oacute;n de la evaluaci&oacute;n de que devolver&aacute; el valor deseado
-despu&eacute;s de ser repetidamente evaluado.
-
-</li><li>
-Una expresi&oacute;n para cambiar el valor pasado al true-or-false-test
-as&iacute; el test devuelve falso despu&eacute;s de que el bucle
-se ha repetido por s&iacute; mismo el n&uacute;mero de veces
-correcto.
-</li></ol>
-
-<hr>
-<a name="Dolist-y-dotimes"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-Dec-junto" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#dolist" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ahorra-tiempo_003a-dolist-y-dotimes"></a>
-<h2 class="section">11.2 Ahorra tiempo: <code>dolist</code> y <code>dotimes</code></h2>
-
-<p>Adem&aacute;s de <code>while</code>, tanto <code>dolist</code> como <code>dotimes</code>
-proveen un bucle. Algunas veces estos son r&aacute;pidos para escribir
-el bucle equivalente <code>while</code>. Ambos son macros
-Lisp. (See <a href="elisp.html#Macros">Macros</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>.)
-</p>
-<p><code>dolist</code> funciona como un bucle <code>while</code> con &lsquo;<small>CDR</small>s que
-bajan la lista&rsquo;: <code>dolist</code> autom&aacute;ticamente ordena la lista cada
-vez que la lista hace bucles &mdash; toma la <small>CDR</small> de la lista &mdash; y
-asocia el <small>CAR</small> de cada versi&oacute;n ordenada de la lista al primero
-de sus argumentos.
-</p>
-<p><code>dotimes</code> repite el bucle un n&uacute;mero espec&iacute;fico de
-veces: tu especificas el n&uacute;mero.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#dolist">La macro <code>dolist</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> dolist
-</td></tr>
-<tr><td align="left" valign="top"><a href="#dotimes">La macro <code>dotimes</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> dotimes
-</td></tr>
-</table>
-
-<hr>
-<a name="dolist"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Dolist-y-dotimes" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Dolist-y-dotimes" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#dotimes" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-macro-dolist"></a>
-<h3 class="unnumberedsubsec">La macro <code>dolist</code></h3>
-<a name="index-dolist"></a>
-
-<p>Sup&oacute;n, por ejemplo, que quieres invertir una lista,
-as&iacute; que &ldquo;primero&rdquo;, &ldquo;segundo&rdquo;, &ldquo;tercero&rdquo; llega a
-ser &ldquo;tercero&rdquo;, &ldquo;segundo&rdquo;, &ldquo;primero&rdquo;.
-</p>
-<p>En la pr&aacute;ctica, usar&iacute;as la funci&oacute;n <code>reverse</code>,
-como esta:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq animales '(gacela jirafa leon tigre))
-
-(reverse animales)
-</pre></div>
-
-<p>Aqu&iacute; se ve c&oacute;mo se podr&iacute;a invertir la
-lista usando un bucle <code>while</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq animales '(gacela jirafa leon tigre))
-
-(defun reverse-list-with-while (list)
- &quot;Usando while, invierte el orden de LIST.&quot;
- (let (value) ; asegura que la lista comienza vac&iacute;a
- (while list
- (setq value (cons (car list) value))
- (setq list (cdr list)))
- value))
-
-(reverse-list-with-while animales)
-</pre></div>
-
-<p>Y aqu&iacute; se ve c&oacute;mo podr&iacute;a usarse la macro
-<code>dolist</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq animales '(gacela jirafa leon tigre))
-
-(defun reverse-list-with-dolist (list)
- &quot;Usando dolist, reverse, la orden de la LISTA.&quot;
- (let (value) ; asegura que la lista empieza vac&iacute;a
- (dolist (element list value)
- (setq value (cons element value)))))
-
-(reverse-list-with-dolist animals)
-</pre></div>
-
-<p>En Info, se puede localizar su cursor despu&eacute;s de cerrar par&eacute;ntesis
-de cada expresi&oacute;n y escribir <kbd>C-x C-e</kbd>; en cada caso, se
-ver&iacute;a
-</p>
-<div class="smallexample">
-<pre class="smallexample">(tigre leon jirafa gacela)
-</pre></div>
-
-<p>en el &aacute;rea echo.
-</p>
-<p>Para este ejemplo, la funci&oacute;n <code>reverse</code> existente es obviamente
-la mejor. El bucle <code>while</code> es solo como nuestro primer ejemplo
-(v&eacute;ase la secci&oacute;n <a href="#Ejemplo-de-bucle">Un bucle <code>while</code> y una lista</a>). El
-<code>while</code> primero chequea si la lista tiene elementos; si es
-as&iacute;, eso construye una nueva lista a&ntilde;adiendo el primer
-elemento de la lista a la lista existente (que en la primera
-iteraci&oacute;n del bucle es <code>nil</code>). Puesto que el segundo elemento
-est&aacute; asignado en frente del segundo elemento, la lista es inversa.
-</p>
-<p>En la expresi&oacute;n que usa el bucle <code>while</code>, la expresi&oacute;n
-<code>(setq&nbsp;list&nbsp;(cdr&nbsp;list))</code> ordena la lista, as&iacute;
-el bucle <code>while</code> finalmente para. Adem&aacute;s, se proporciona la
-expresi&oacute;n <code>cons</code> con un nuevo primer elemento creando una nueva
-lista y se ordena en cada repetici&oacute;n del bucle.
-</p>
-<p>La expresi&oacute;n <code>dolist</code> hace lo mismo que la expresi&oacute;n
-<code>while</code>, excepto que la macro <code>dolist</code> hace algo del trabajo
-que se tiene que hacer cuando se escribe una expresi&oacute;n <code>while</code>.
-</p>
-<p>Al igual que el bucle <code>while</code>, tenemos el bucle <code>dolist</code>. Lo
-que es diferente es que autom&aacute;ticamente ordena la lista cada vez que
-se repite &mdash; eso es &lsquo;recorrer los <small>CDR</small>s de la lista&rsquo; en
-s&iacute; &mdash; y eso autom&aacute;ticamente asocia el <small>CAR</small> de
-cada versi&oacute;n ordenada de la lista al primero de sus argumentos.
-</p>
-<p>En el ejemplo, el <small>CAR</small> de cada versi&oacute;n ordenada de la lista se
-refiere a usar el s&iacute;mbolo &lsquo;<samp>element</samp>&rsquo;, la lista en
-s&iacute; se llama &lsquo;<samp>list</samp>&rsquo;, y el valor devuelto se llama
-&lsquo;<samp>value</samp>&rsquo;. El resto de la expresi&oacute;n <code>dolist</code> es el cuerpo.
-</p>
-<p>La expresi&oacute;n <code>dolist</code> asocia el <small>CAR</small> de cada versi&oacute;n
-ordenada de la lista al <code>element</code> y entonces eval&uacute;a el cuerpo
-de la expresi&oacute;n y repite el bucle. El resultado es devuelto en
-<code>value</code>.
-</p>
-<hr>
-<a name="dotimes"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#dolist" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Dolist-y-dotimes" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-macro-dotimes"></a>
-<h3 class="unnumberedsubsec">La macro <code>dotimes</code></h3>
-<a name="index-dotimes"></a>
-
-<p>La macro <code>dotimes</code> es similar a <code>dolist</code>, excepto que el
-bucle se repite un n&uacute;mero espec&iacute;fico de veces.
-</p>
-<p>El primer argumento <code>dotimes</code> se asigna a los n&uacute;meros 0, 1, 2 y
-as&iacute; vuelve al bucle, y el valor del tercer argumento se
-devuelve. Se necesita proveer el valor del segundo argumento, que es
-cu&aacute;ntas veces la macro hace el bucle.
-</p>
-<p>Por ejemplo, lo siguiente asocia los n&uacute;meros de 0 en adelante, pero
-no incluyendo, el n&uacute;mero 3 al primer argumento, <var>n&uacute;mero</var>, y
-entonces construye una lista de los tres n&uacute;meros. (El primer
-n&uacute;mero es 0, el segundo n&uacute;mero es 1, y el tercer n&uacute;mero es 2;
-esto crea un total de tres n&uacute;meros en todo, empezando con cero como
-el primer n&uacute;mero.)
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let (value) ; de otro modo un valor es una variable vac&iacute;a
- (dotimes (number 3 value)
- (setq value (cons number value))))
-
-&rArr; (2 1 0)
-</pre></div>
-
-<p><code>dotimes</code> devuelve <code>value</code>, as&iacute; el camino para
-usar <code>dotimes</code> es para operar en alguna expresi&oacute;n el n&uacute;mero
-de veces <var>number</var> y entonces devolver el resultado, como una lista
-o un &aacute;tomo.
-</p>
-<p>Aqu&iacute; hay un ejemplo de una <code>defun</code> que usa
-<code>dotimes</code> para a&ntilde;adir el n&uacute;mero de asteriscos en un tri&aacute;ngulo.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun triangle-using-dotimes (number-of-rows)
- &quot;Usando dotimes, a&ntilde;ade el n&uacute;mero de asteriscos en un tri&aacute;ngulo.&quot;
-(let ((total 0)) ; de otro modo un total es una variable vac&iacute;a
- (dotimes (number number-of-rows total)
- (setq total (+ total (1+ number))))))
-
-(triangle-using-dotimes 4)
-</pre></div>
-
-<hr>
-<a name="Recursi_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#dotimes" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Construyendo-robots" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Recursion"></a>
-<h2 class="section">11.3 Recursi&oacute;n</h2>
-<a name="index-Recursion"></a>
-
-<p>Una funci&oacute;n recursiva contiene c&oacute;digo que hace que el int&eacute;rprete
-Lisp llame a un programa que ejecute el c&oacute;digo en s&iacute;,
-pero con argumentos ligeramente diferentes. El c&oacute;digo ejecuta
-exactamente lo mismo porque eso tiene el mismo nombre. Sin embargo,
-incluso aunque el programa tenga el mismo nombre, no es la misma
-entidad. Eso es diferente. En la jerga, se dice es una &lsquo;instancia&rsquo;
-diferente.
-</p>
-<p>Finalmente, si el programa se escribe correctamente, los &lsquo;argumentos
-ligeramente diferentes&rsquo; llegan a ser suficientemente diferentes puesto
-que los primeros argumentos de la instancia final se parar&aacute;n.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Construyendo-robots">11.3.1 Construyendo robots: Extendiendo la met&aacute;fora</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Mismo modelo, diferente n&uacute;mero serie ...
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Partes-de-definici_00f3n-recursiva">11.3.2 Las partes de una definici&oacute;n recursiva</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Paseo hasta que tu pares ...
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Recursi_00f3n-con-lista">11.3.3 Recursi&oacute;n con una lista</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usando una lista con el test si para recurso.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Funci_00f3n-recursiva-tri_00e1ngulo">11.3.4 Recursi&oacute;n en lugar de un contador</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Funci&oacute;n recursiva tri&aacute;ngulo
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Recursi_00f3n-con-cond">11.3.5 Ejemplo de recursi&oacute;n usando <code>cond</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Recursi&oacute;n con cond
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Patrones-recursivos">11.3.6 Patrones recursivos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Plantillas usadas con frecuencia.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Sin-Aplazar">11.3.7 Recursi&oacute;n sin diferir</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> No almacenar trabajo ...
-</td></tr>
-<tr><td align="left" valign="top"><a href="#No-aplazar-la-soluci_00f3n">11.3.8 No hay soluci&oacute;n pospuesta</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> No aplazar la soluci&oacute;n
-</td></tr>
-</table>
-
-<hr>
-<a name="Construyendo-robots"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Partes-de-definici_00f3n-recursiva" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Construyendo-robots_003a-Extendiendo-la-metafora"></a>
-<h3 class="subsection">11.3.1 Construyendo robots: Extendiendo la met&aacute;fora</h3>
-<a name="index-Construyendo-robots"></a>
-<a name="index-Robots_002c-construyendo"></a>
-
-<p>Algunas veces es &uacute;til pensar en un programa en ejecuci&oacute;n como un
-robot que hace un trabajo. Haciendo su trabajo, una funci&oacute;n
-recursiva llama a un segundo robot para que le ayude. El segundo robot es
-id&eacute;ntico al primero en cada paso, excepto que el segundo robot
-ayuda al primero y se han pasado diferentes argumentos en vez del primero.
-</p>
-<p>En una funci&oacute;n recursiva, el segundo robot puede llamar a un
-tercero; y el tercero puede llamar a un cuarto, y
-as&iacute;. Cada una de estos es una entidad diferente; pero
-todos son clones.
-</p>
-<p>Desde que cada robot tiene instrucciones ligeramente diferentes &mdash;
-los argumentos diferir&aacute;n desde un robot al siguiente &mdash; el &uacute;ltimo
-robot conocer&iacute;a cuando pare.
-</p>
-<p>Permite expandir la met&aacute;fora en el que un programa de ordenador
-es un robot.
-</p>
-<p>Una definici&oacute;n de funci&oacute;n provee impresiones para un robot. Cuando
-se instala una definici&oacute;n de funci&oacute;n, que es, cuando se eval&uacute;a
-una forma especial <code>defun</code>, se instala el equipamiento para
-construir robots. Eso es como si tu estuvieras en una f&aacute;brica,
-configurando una l&iacute;nea de ensamblaje. Los robots con el
-mismo nombre son construidos de acuerdo a las mismas
-impresiones. As&iacute; ellos tienen, como estaban, el mismo
-&lsquo;n&uacute;mero de modelo&rsquo;, pero un diferente &lsquo;n&uacute;mero de serie&rsquo;.
-</p>
-<p>Nosotros con frecuencia decimos que una funci&oacute;n recursiva &lsquo;se llama
-as&iacute; misma&rsquo;. Esto significa que las instrucciones en una
-funci&oacute;n recursiva causa que el int&eacute;rprete de Lisp ejecute una
-funci&oacute;n diferente que tiene el mismo nombre y hace el mismo trabajo
-que el primero, pero con diferentes argumentos.
-</p>
-<p>Es importante que los argumentos difieran desde una instancia a la
-siguiente; de otro modo, el proceso nunca parar&aacute;.
-</p>
-<hr>
-<a name="Partes-de-definici_00f3n-recursiva"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Construyendo-robots" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n-con-lista" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Las-partes-de-una-definicion-recursiva"></a>
-<h3 class="subsection">11.3.2 Las partes de una definici&oacute;n recursiva</h3>
-<a name="index-Partes-de-una-Definicion-Recursiva"></a>
-<a name="index-Partes-de-definicion-recursiva"></a>
-
-<p>Una funci&oacute;n recursiva t&iacute;picamente contiene una
-expresi&oacute;n condicional que tiene tres partes:
-</p>
-<ol>
-<li>
-Un true-or-false-test que determina si la funci&oacute;n se llama de
-nuevo, aqu&iacute; se llama el <em>do-again-test</em>.
-
-</li><li>
-El nombre de la funci&oacute;n. Cuando este nombre se llama, es una nueva
-instancia de la funci&oacute;n &mdash; un nuevo robot, as&iacute; &mdash; se
-crea y se dice qu&eacute; hacer.
-
-</li><li>
-Una expresi&oacute;n que devuelve un valor diferente cada vez que la
-funci&oacute;n se llama, aqu&iacute; llamada la
-<em>next-step-expression</em>. Consecuentemente, el argumento (o
-argumentos) pasados a la nueva instancia de la funci&oacute;n ser&aacute;n
-diferentes puesto que se pasa a la instancia previa. Esto causa la
-expresi&oacute;n condicional, que el <em>do-again-test</em>, devuelva
-falso despu&eacute;s del n&uacute;mero correcto de repeticiones.
-</li></ol>
-
-<p>Las funciones recursivas pueden ser m&aacute;s simples que cualquier otro
-tipo de funciones. De manera profunda, cuando la gente empieza a
-usarlas, con frecuencia se miran as&iacute; misteriosamente
-de manera tan simple como incompresible. Como montar en bicicleta, leer una
-funci&oacute;n recursiva es duro al principio, pero despu&eacute;s es simple.
-</p>
-<p>Hay varios patrones recursivos diferentes. Un patr&oacute;n muy simple se
-parece a:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun <var>name-of-recursive-function</var> (<var>argument-list</var>)
- &quot;<var>documentation</var>&hellip;&quot;
- (if <var>do-again-test</var>
- <var>body</var>&hellip;
- (<var>name-of-recursive-function</var>
- <var>next-step-expression</var>)))
-</pre></div>
-
-<p>Cada vez que una funci&oacute;n recursiva es evaluada, una nueva instancia
-se crea y se dice qu&eacute; hacer. Los argumentos le dicen a la instancia
-qu&eacute; hacer.
-</p>
-<p>Un argumento se empareja al valor de la next-step-expresion. Cada
-instancia se ejecuta con un valor diferente de la next-step-expression.
-</p>
-<p>El valor en la next-step-expression es usado en la do-again-test.
-</p>
-<p>El valor devuelto por la next-step-expression es pasada a las nuevas
-instancias de la funci&oacute;n, que lo eval&uacute;a (o alguna transformaci&oacute;n
-de eso) para determinar si continuar o parar. El next-step-expression
-est&aacute; dise&ntilde;ado as&iacute; que el do-again-test devuelve
-falso cuando la funci&oacute;n no se repetir&iacute;a mucho.
-</p>
-<p>El do-again-test es algunas veces llamado la <em>condici&oacute;n de
-parar</em>, puesto que sirve para parar las repeticiones cuando se devuelve
-falso.
-</p>
-<hr>
-<a name="Recursi_00f3n-con-lista"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Partes-de-definici_00f3n-recursiva" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Funci_00f3n-recursiva-tri_00e1ngulo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Recursion-con-una-lista"></a>
-<h3 class="subsection">11.3.3 Recursi&oacute;n con una lista</h3>
-
-<p>El ejemplo de un bucle <code>while</code> que imprimi&oacute; los elementos de
-una lista de n&uacute;meros puede ser escrito
-recursivamente. Aqu&iacute; est&aacute; el c&oacute;digo, incluyendo una
-expresi&oacute;n para asignar el valor de la variable <code>animales</code> a una
-lista.
-</p>
-<p>Si est&aacute; leyendo esto en el Info de Emacs, se puede evaluar esta
-expresi&oacute;n directamente en Info. De otro modo, se debe copiar el
-ejemplo al b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; y eval&uacute;a cada expresi&oacute;n
-aqu&iacute;. Usa <kbd>C-u C-x C-e</kbd> para evaluar la expresi&oacute;n
-<code>(print-elements-recursively animals)</code> as&iacute; que los
-resultado se imprimen en el b&uacute;ffer; de otro modo el int&eacute;rprete
-Lisp intentar&aacute; presionar los resultados dentro de una
-l&iacute;nea del &aacute;rea echo.
-</p>
-<p>Tambi&eacute;n, posiciona tu cursor inmediatamente despu&eacute;s del &uacute;ltimo
-par&eacute;ntesis que cierra la funci&oacute;n
-<code>print-elements-recursively</code>, antes del comentario. De otro modo,
-el int&eacute;rprete Lisp intentar&aacute; evaluar el comentario.
-</p>
-<a name="index-print_002delements_002drecursively"></a>
-<div class="smallexample">
-<pre class="smallexample">(setq animales '(gacela jirafa leon tigre))
-
-(defun print-elements-recursively (list)
- &quot;Imprime cada elemento de la LISTA de la l&iacute;nea en
- s&iacute;. Usa recursi&oacute;n.&quot;
- (when list ; <span class="roman">do-again-test</span>
- (print (car list)) ; <span class="roman">body</span>
- (print-elements-recursively ; <span class="roman">recursive call</span>
- (cdr list)))) ; <span class="roman">next-step-expression</span>
-
-(print-elements-recursively animales)
-</pre></div>
-
-<p>La funci&oacute;n <code>print-elements-recursively</code> primero chequea si hay
-cualquier contenido en la lista; si lo hay, la funci&oacute;n imprime el
-primer elemento de la lista, el <small>CAR</small> de la lista. Entonces la
-funci&oacute;n se &lsquo;invoca en s&iacute;&rsquo;, pero da a s&iacute;
-mismo como su argumento, no la lista completa, pero el segundo y
-subsiguientes elementos de la lista, el <small>CDR</small> de la lista.
-</p>
-<p>Pon otro camino, si la lista no est&aacute; vac&iacute;a, la
-funci&oacute;n invoca otra instancia de c&oacute;digo que es similar al c&oacute;digo
-inicial, pero es un hilo diferente de ejecuci&oacute;n, con diferentes
-argumentos a la primera instancia.
-</p>
-<p>Veamos una manera m&aacute;s, si la lista no est&aacute; vac&iacute;a, el
-primer robot ensambla un segundo robot que cuenta qu&eacute; hacer; el
-segundo robot es un individuo diferente desde el principio, pero es el
-mismo modelo.
-</p>
-<p>Cuando la segunda evaluaci&oacute;n ocurre, la expresi&oacute;n <code>when</code> se
-eval&uacute;a y si es verdad, se imprime el primer elemento de la lista que
-recibe como su argumento (que es el segundo elemento de la lista
-original). Entonces la funci&oacute;n &lsquo;llamarse a s&iacute; mismo&rsquo;
-con la <small>CDR</small> del <small>CDR</small> de la lista original.
-</p>
-<p>Note que aunque nosotros decimos que la funci&oacute;n &lsquo;se llama a
-s&iacute; misma&rsquo;, lo que significa es que el int&eacute;rprete Lisp
-ensambla e instruye una nueva instancia del programa. La nueva
-instancia es un clon del primero, pero es un individuo separado.
-</p>
-<p>Cada vez que la funci&oacute;n &lsquo;se invoca a s&iacute; misma&rsquo;, se
-invoca a s&iacute; misma en una versi&oacute;n de la lista
-original. Eso crea una nueva instancia que funciona como una lista
-ordenada.
-</p>
-<p>Finalmente, la funci&oacute;n se invoca a s&iacute; misma en una
-lista vac&iacute;a. Eso crea una nueva instancia cuyo argumento
-es <code>nil</code>. La expresi&oacute;n condicional chequea el valor de
-<code>lista</code>. Desde el valor de <code>lista</code> a <code>nil</code>, la
-expresi&oacute;n <code>when</code> devuelve falso as&iacute; la then-part
-no est&aacute; evaluada. La funci&oacute;n es como un todo que entonces devuelve
-<code>nil</code>.
-</p>
-<p>Cuando se eval&uacute;a la expresi&oacute;n <code>(print-elements-recursively
-animals)</code> en el b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo;, se ver&aacute; este resultado:
-</p>
-<div class="smallexample">
-<pre class="smallexample">gacela
-
-jirafa
-
-leon
-
-tigre
-nil
-</pre></div>
-
-<hr>
-<a name="Funci_00f3n-recursiva-tri_00e1ngulo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n-con-lista" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-recursivo-y-argumento-con-valor-1-o-2" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Recursion-en-lugar-de-un-contador"></a>
-<h3 class="subsection">11.3.4 Recursi&oacute;n en lugar de un contador</h3>
-<a name="index-triangle_002drecursively"></a>
-
-<p>La funci&oacute;n <code>triangle</code> describe en una secci&oacute;n previa si puede
-ser escrita recursivamente. Se ve as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun triangle-recursively (number)
- &quot;Return the sum of the numbers 1 through NUMBER inclusive.
-Uses recursion.&quot;
- (if (= number 1) ; <span class="roman">do-again-test</span>
- 1 ; <span class="roman">then-part</span>
- (+ number ; <span class="roman">else-part</span>
- (triangle-recursively ; <span class="roman">recursive call</span>
- (1- number))))) ; <span class="roman">next-step-expression</span>
-
-(triangle-recursively 7)
-</pre></div>
-
-<p>Se puede instalar esta funci&oacute;n evaluando y entonces se intenta
-evaluar <code>(triangle-recursively 7)</code>. (Recuerda poner tu cursor
-inmediatamente despu&eacute;s de los &uacute;ltimos par&eacute;ntesis de la
-definici&oacute;n de la funci&oacute;n, antes del comentario.) La funci&oacute;n
-se eval&uacute;a a 28.
-</p>
-<p>Para comprender c&oacute;mo funciona la funci&oacute;n, hay que considerar qu&eacute;
-ocurre en varios casos cuando la funci&oacute;n se le pasa 1, 2, 3, o 4
-como el valor a su argumento.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Ejemplo-recursivo-y-argumento-con-valor-1-o-2">Un argumento de 1 o 2</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo recursivo y
- argumento con valor 1 o 2
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejemplo-Recursivo-de-3-o-4-argumentos">Un argumento de 3 o 4</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo Recursivo de 3 o 4
- argumentos
-</td></tr>
-</table>
-
-<hr>
-<a name="Ejemplo-recursivo-y-argumento-con-valor-1-o-2"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Funci_00f3n-recursiva-tri_00e1ngulo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Funci_00f3n-recursiva-tri_00e1ngulo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-Recursivo-de-3-o-4-argumentos" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Un-argumento-de-1-o-2"></a>
-<h4 class="unnumberedsubsubsec">Un argumento de 1 o 2</h4>
-
-<p>Primero, veamos qu&eacute; ocurre si el valor del argumento es 1.
-</p>
-<p>La funci&oacute;n tiene una expresi&oacute;n <code>if</code> despu&eacute;s de la cadena de
-documentaci&oacute;n. Esto chequea si el valor de <code>number</code> es igual a
-1; si es as&iacute;, Emacs eval&uacute;a la then-part de la
-expresi&oacute;n <code>if</code>, que devuelve el n&uacute;mero 1 como el valor de la
-funci&oacute;n. (Un tri&aacute;ngulo con una fila tiene un asterisco dentro.)
-</p>
-<p>Sup&oacute;n, sin embargo, que el valor del argumento es 2. En este caso,
-Emacs eval&uacute;a la parte else de la expresi&oacute;n <code>if</code>.
-</p>
-<p>La parte else consiste de una adici&oacute;n, la llamada recursiva para
-<code>triangle-recursively</code> y una acci&oacute;n de decremento; y se ve
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ number (triangle-recursively (1- number)))
-</pre></div>
-
-<p>Cuando Emacs eval&uacute;a esta expresi&oacute;n, la expresi&oacute;n interna es
-evaluada primero; entonces las otras partes en
-secuencia. Aqu&iacute; est&aacute;n los pasos en detalle:
-</p>
-<dl compact="compact">
-<dt><i>Paso 1 &nbsp; Eval&uacute;a la expresi&oacute;n interna.</i></dt>
-<dd>
-<p>La expresi&oacute;n interna es <code>(1- number)</code> as&iacute; Emacs
-decrementa el valor de <code>number</code> desde 2 a 1.
-</p>
-</dd>
-<dt><i>Paso 2 &nbsp; Eval&uacute;a la funci&oacute;n <code>triangle-recursively</code>.</i></dt>
-<dd>
-<p>El int&eacute;rprete Lisp crea una instancia individual de
-<code>triangle-recursively</code>. Eso no importa que esta funci&oacute;n est&aacute;
-contenida con s&iacute; misma. Emacs pasa el resultado Paso 1
-como el argumento usado por esta instancia de la funci&oacute;n
-<code>triangle-recursively</code>
-</p>
-<p>En este caso, Emacs eval&uacute;a <code>triangle-recursively</code> con un
-argumento de 1. Esto significa que esta evaluaci&oacute;n de
-<code>triangle-recursively</code> devuelve 1.
-</p>
-</dd>
-<dt><i>Paso 3 &nbsp; Eval&uacute;a el valor de <code>number</code>.</i></dt>
-<dd>
-<p>La variable <code>number</code> es el segundo elemento de la lista que
-empieza con <code>+</code>; su valor es 2.
-</p>
-</dd>
-<dt><i>Paso 4 &nbsp;&nbsp; Eval&uacute;a la expresi&oacute;n <code>+</code>.</i></dt>
-<dd>
-<p>La expresi&oacute;n <code>+</code> recibe dos argumentos, el primero desde la
-evaluaci&oacute;n de <code>number</code> (Paso 3) y el segundo desde la
-evaluaci&oacute;n de <code>triangle-recursively</code> (Paso 2).
-</p>
-<p>El resultado de la adici&oacute;n es la suma de 2 + 1, y el n&uacute;mero 3 es
-devuelto, que es correcto. Un tri&aacute;ngulo con dos filas tiene tres
-asteriscos ah&iacute;.
-</p></dd>
-</dl>
-
-<hr>
-<a name="Ejemplo-Recursivo-de-3-o-4-argumentos"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-recursivo-y-argumento-con-valor-1-o-2" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Funci_00f3n-recursiva-tri_00e1ngulo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n-con-cond" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Un-argumento-de-3-o-4"></a>
-<h4 class="unnumberedsubsubsec">Un argumento de 3 o 4</h4>
-
-<p>Sup&oacute;n que <code>triangle-recursively</code> es llamado con un argumento de
-3.
-</p>
-<dl compact="compact">
-<dt><i>Paso 1 &nbsp; Eval&uacute;a la do-again-test.</i></dt>
-<dd>
-<p>La expresi&oacute;n <code>if</code> se eval&uacute;a primero. Esto es el test do-again
-y devuelve falso, as&iacute; la parte else de la expresi&oacute;n
-<code>if</code> es evaluada. (Note que en este ejemplo, el do-again-test
-causa la funci&oacute;n para llamarse a s&iacute; misma cuando eso
-se chequea como falso, no cuando eso se chequea como verdadero.)
-</p>
-</dd>
-<dt><i>Paso 2 &nbsp; Eval&uacute;a la expresi&oacute;n propia de la parte else.</i></dt>
-<dd>
-<p>La expresi&oacute;n propia de la parte que es evaluada, decrementa 3 a
-2. Esta la next-step-expression.
-</p>
-</dd>
-<dt><i>Paso 3 &nbsp; Eval&uacute;a la funci&oacute;n <code>triangle-recursively</code>.</i></dt>
-<dd>
-<p>El n&uacute;mero 2 es pasado a la funci&oacute;n <code>triangle-recursively</code>.
-</p>
-<p>Nosotros ya sabemos qu&eacute; ocurre cuando Emacs eval&uacute;a
-<code>triangle-recursively</code> con un argumento de 2. Despu&eacute;s de ir a
-trav&eacute;s de la secuencia de acciones descritas temprano, eso devuelve
-un valor de 3. As&iacute; que es lo que ocurrir&aacute;
-aqu&iacute;.
-</p>
-</dd>
-<dt><i>Paso 4 &nbsp; Eval&uacute;a la adici&oacute;n.</i></dt>
-<dd>
-<p>3 ser&aacute; pasado como un argumento para la adici&oacute;n y ser&aacute; a&ntilde;adido
-al n&uacute;mero con el que la funci&oacute;n se llam&oacute;, que es 3.
-</p></dd>
-</dl>
-
-<p>El valor devuelto por la funci&oacute;n como un todo ser&aacute; 6.
-</p>
-<p>Ahora que sabemos qu&eacute; ocurrir&aacute; cuando <code>triangle-recursively</code>
-llama con un argumento 3, es evidente lo que ocurrir&aacute; si se llama
-con el argumento 4:
-</p>
-<blockquote>
-<p>En la llamada recursiva, la evaluaci&oacute;n de
-</p>
-<div class="smallexample">
-<pre class="smallexample">(triangle-recursively (1- 4))
-</pre></div>
-
-<p>devuelve el valor de evaluar
-</p>
-<div class="smallexample">
-<pre class="smallexample">(triangle-recursively 3)
-</pre></div>
-
-<p>que es 6 este valor ser&aacute; a&ntilde;adido a 4 por la adici&oacute;n en la
-tercera l&iacute;nea.
-</p></blockquote>
-
-<p>El valor devuelto por la funci&oacute;n como un todo ser&aacute; 10.
-</p>
-<p>Cada vez que <code>triangle-recursively</code> se eval&uacute;a, se interpreta
-una versi&oacute;n de s&iacute; misma &mdash; una instancia diferente en
-s&iacute; &mdash; con un peque&ntilde;o argumento, hasta que el
-argumento es suficientemente peque&ntilde;o as&iacute; que no se
-eval&uacute;a en s&iacute;.
-</p>
-<p>Note que este particular dise&ntilde;o para una funci&oacute;n recursiva
-requiere que las operaciones sean diferidas.
-</p>
-<p>Antes de que <code>(triangle-recursively 7)</code> pueda calcular su
-respuesta, debe llamarse a <code>(triangle-recursively 6)</code>; y antes a
-<code>(triangle-recursively 5)</code>; y as&iacute;. Esto es decir,
-que el c&aacute;lculo de <code>(triangle-recursively 7)</code> a crear debe ser
-diferido hasta que <code>(triangle-recursively 6)</code> haga su c&aacute;lculo;
-y <code>(triangle-recursively 5)</code> lo complete; y as&iacute;.
-</p>
-<p>Si cada una de estas instancias de <code>triangle-recursively</code> son
-pensadas como diferentes robots, el primer robot debe esperar por el
-segundo para completar su trabajo, que debe esperar hasta los terceros
-completos, y as&iacute;.
-</p>
-<p>Hay un camino alrededor de este tipo de espera, que se discutir&aacute; en
-<a href="#Sin-Aplazar">Recursi&oacute;n sin Defermentos.</a>
-</p>
-<hr>
-<a name="Recursi_00f3n-con-cond"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-Recursivo-de-3-o-4-argumentos" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Patrones-recursivos" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejemplo-de-recursion-usando-cond"></a>
-<h3 class="subsection">11.3.5 Ejemplo de recursi&oacute;n usando <code>cond</code></h3>
-<a name="index-cond"></a>
-
-<p>La versi&oacute;n de <code>triangle-recursively</code> antes descrita se escribi&oacute;
-con la forma especial <code>if</code>. Eso puede tambi&eacute;n ser escrita
-usando otra forma especial llamada <code>cond</code>. El nombre de la forma
-especial <code>cond</code> es una abreviaci&oacute;n de la palabra &lsquo;<samp>conditional</samp>&rsquo;.
-</p>
-<p>Aunque la forma especial <code>cond</code> no se usa con frecuencia en las
-fuentes de Emacs como <code>if</code>, se usa con suficiente frecuencia para
-justificarse explicando.
-</p>
-<p>La plantilla para una expresi&oacute;n <code>cond</code> se parece a:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cond
- <var>body</var>&hellip;)
-</pre></div>
-
-<p>donde el <var>body</var> es una serie de listas.
-</p>
-<p>Escrito de manera m&aacute;s completa, la plantilla se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cond
- (<var>first-true-or-false-test</var> <var>first-consequent</var>)
- (<var>second-true-or-false-test</var> <var>second-consequent</var>)
- (<var>third-true-or-false-test</var> <var>third-consequent</var>)
- &hellip;)
-</pre></div>
-
-<p>Cuando el int&eacute;rprete Lisp eval&uacute;a la expresi&oacute;n <code>cond</code>,
-eval&uacute;a el primer elemento (el <small>CAR</small> o true-or-false-test) de la
-primera expresi&oacute;n en una serie de expresiones con el cuerpo del
-<code>cond</code>.
-</p>
-<p>Si el true-or-false-test devuelve <code>nil</code> el resto de esta
-expresi&oacute;n, el consecuente, se descarta y el true-or-false-test de la
-siguiente expresi&oacute;n se eval&uacute;a. Cuando una expresi&oacute;n encuentra un
-true-or-false-test cuyo valor no es <code>nil</code>, el consecuente de esta
-expresi&oacute;n se eval&uacute;a. El consecuente puede ser una o m&aacute;s
-expresiones. Si el consecuente consiste de m&aacute;s de una expresi&oacute;n,
-las expresiones son evaluadas en secuencia y el valor del &uacute;ltimo se
-devuelve. Si la expresi&oacute;n no tiene un consecuente, se devuelve el
-valor del true-or-false-test.
-</p>
-<p>Si ninguno del test true-or-false-tests es cierto, la expresi&oacute;n
-<code>cond</code> devuelve <code>nil</code>.
-</p>
-<p>Escrito usando <code>cond</code>, la funci&oacute;n <code>triangle</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun triangle-using-cond (number)
- (cond ((&lt;= number 0) 0)
- ((= number 1) 1)
- ((&gt; number 1)
- (+ number (triangle-using-cond (1- number))))))
-</pre></div>
-
-<p>En este ejemplo, el <code>cond</code> devuelve 0 si el n&uacute;mero es menor o
-igual a 0, eso devuelve 1 si el n&uacute;mero es 1 y eso eval&uacute;a <code>(+
-number (triangle-using-cond (1- number)))</code> si el n&uacute;mero es m&aacute;s
-grandes que 1.
-</p>
-<hr>
-<a name="Patrones-recursivos"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n-con-cond" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Cada" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Patrones-recursivos-1"></a>
-<h3 class="subsection">11.3.6 Patrones recursivos</h3>
-<a name="index-Patrones-recursivos"></a>
-
-<p>Aqu&iacute; hay tres patrones recursivos. Cada uno involucra
-una lista. La recursi&oacute;n no se necesita para involucrar listas, pero
-Lisp se dise&ntilde;a para listas y esto provee un sentido de sus
-capacidades primarias.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Cada">Patr&oacute;n recursivo: <em>every</em></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cada
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Acumular">Patr&oacute;n recursivo: <em>accumulate</em></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Acumular
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Guardar">Patr&oacute;n recursivo: <em>keep</em></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Guardar
-</td></tr>
-</table>
-
-<hr>
-<a name="Cada"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Patrones-recursivos" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Patrones-recursivos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Acumular" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Patron-recursivo_003a-every"></a>
-<h4 class="unnumberedsubsubsec">Patr&oacute;n recursivo: <em>every</em></h4>
-<a name="index-Every_002c-tipo-de-patron-recursivo"></a>
-<a name="index-Patron-recursivo_003a-every"></a>
-
-<p>En el patr&oacute;n recursivo <code>every</code>, se desarrolla una acci&oacute;n por
-cada elemento de una lista.
-</p>
-<p>El patr&oacute;n b&aacute;sico es:
-</p>
-<ul>
-<li>
-Si una lista es vac&iacute;a, devuelve <code>nil</code>.
-</li><li>
-Else, act on the beginning of the list (the <small>CAR</small> of the list)
- <ul class="no-bullet">
-<li>-
- through a recursive call by the function on the rest (the <small>CDR</small>) of the
-list,
- </li><li>-
- and, optionally, combine the acted-on element, using <code>cons</code>, with the
-results of acting on the rest.
- </li></ul>
-</li></ul>
-
-<p>Aqu&iacute; est&aacute; el ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun square-each (numbers-list)
- &quot;El cuadrado de cada LISTA DE NUMEROS, recursivamente.&quot;
- (if (not numbers-list) ; test-hazlo-de-nuevo
- nil
- (cons
- (* (car numbers-list) (car numbers-list))
- (square-each (cdr numbers-list))))) ; expresion-siguiente-paso
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(square-each '(1 2 3))
- &rArr; (1 4 9)
-</pre></div>
-
-<p>Si <code>numbers-list</code> est&aacute; vac&iacute;o, no hay que hacer
-nada. Pero si tiene contenido, se construye una lista combinando el
-cuadrado del primer n&uacute;mero en la lista con el resultado de la
-llamada recursiva.
-</p>
-<p>(El ejemplo sigue el patr&oacute;n exactamente: se devuelve <code>nil</code> si
-la lista de n&uacute;meros es vac&iacute;a. En la pr&aacute;ctica, se
-escribir&iacute;a el condicional, as&iacute; se ejecuta
-la acci&oacute;n cuando la lista de n&uacute;meros no es vac&iacute;a.)
-</p>
-<p>La funci&oacute;n <code>print-elements-recursively</code> (v&eacute;ase la secci&oacute;n <a href="#Recursi_00f3n-con-lista">Recursi&oacute;n con una Lista</a>) es otro ejemplo de un patr&oacute;n
-<code>every</code>, excepto en este caso, en vez de traer los resultados
-juntos usando <code>cons</code>, se imprime cada elemento de salida.
-</p>
-<p>La funci&oacute;n <code>print-elements-recursively</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq animales '(gacela jirafa leon tigre))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(defun print-elements-recursively (list)
- &quot;Imprime cada elemento de la LISTA de la l&iacute;nea en
- s&iacute;. Usa recursi&oacute;n.&quot;
- (when list ; <span class="roman">do-again-test</span>
- (print (car list)) ; <span class="roman">body</span>
- (print-elements-recursively ; <span class="roman">recursive call</span>
- (cdr list)))) ; <span class="roman">next-step-expression</span>
-
-(print-elements-recursively animales)
-</pre></div>
-
-<p>El patr&oacute;n para <code>print-elements-recursively</code> es:
-</p>
-<ul>
-<li>
-Cuando la lista est&aacute; vac&iacute;a, no hacer nada.
-</li><li>
-But when the list has at least one element,
- <ul class="no-bullet">
-<li>-
- act on the beginning of the list (the <small>CAR</small> of the list),
- </li><li>-
- and make a recursive call on the rest (the <small>CDR</small>) of the list.
- </li></ul>
-</li></ul>
-
-<hr>
-<a name="Acumular"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cada" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Patrones-recursivos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Guardar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Patron-recursivo_003a-accumulate"></a>
-<h4 class="unnumberedsubsubsec">Patr&oacute;n recursivo: <em>accumulate</em></h4>
-<a name="index-Acumular_002c-tipo-de-patron-recursivo"></a>
-<a name="index-Patron-recursivo_003a-acumular"></a>
-
-<p>Otro patr&oacute;n recursivo es llamado el patr&oacute;n <code>accumulate</code>. En
-el patr&oacute;n recursivo <code>accumulate</code>, se realiza una acci&oacute;n en
-cada elemento de una lista y el resultado de esta acci&oacute;n se acumula
-con los resultados de desarrollar la acci&oacute;n en otros elementos.
-</p>
-<p>Esto es como &lsquo;cada&rsquo; patr&oacute;n usando <code>cons</code>, excepto que este
-<code>cons</code> no se est&eacute; usando, pero que alg&uacute;n otro combine.
-</p>
-<p>El patr&oacute;n es:
-</p>
-<ul>
-<li>
-Si una lista est&aacute; vac&iacute;a, devuelve cero o alguna otra
-constante.
-</li><li>
-Else, act on the beginning of the list (the <small>CAR</small> of the list),
- <ul class="no-bullet">
-<li>-
- and combine that acted-on element, using <code>+</code> or some other combining
-function, with
- </li><li>-
- a recursive call by the function on the rest (the <small>CDR</small>) of the list.
- </li></ul>
-</li></ul>
-
-<p>Aqu&iacute; hay un ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun add-elements (numbers-list)
- &quot;A&ntilde;ade los elementos de NUMBERS-LIST juntos.&quot;
- (if (not numbers-list)
- 0
- (+ (car numbers-list) (add-elements (cdr numbers-list)))))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(add-elements '(1 2 3 4))
- &rArr; 10
-</pre></div>
-
-<p>V&eacute;ase la secci&oacute;n <a href="#Listar-ficheros">Creando una lista de ficheros</a>, para un ejemplo
-del patr&oacute;n acumulado.
-</p>
-<hr>
-<a name="Guardar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Acumular" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Patrones-recursivos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Sin-Aplazar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Patron-recursivo_003a-keep"></a>
-<h4 class="unnumberedsubsubsec">Patr&oacute;n recursivo: <em>keep</em></h4>
-<a name="index-Keep_002c-el-tipo-de-patron-recursivo"></a>
-<a name="index-Patron-recursivo_003a-keep"></a>
-
-<p>Un tercer patr&oacute;n es llamado el patr&oacute;n <code>keep</code>. En el patr&oacute;n
-recursivo <code>keep</code>, se chequea cada elemento de una lista; se
-act&uacute;a en el elemento y los resultados se guardan solo si el elemento
-encuentra un criterio.
-</p>
-<p>De nuevo, esto se parece al patr&oacute;n &lsquo;every&rsquo;, excepto que el elemento
-se descarta a menos que se encuentre un criterio.
-</p>
-<p>El patr&oacute;n tiene tres partes:
-</p>
-<ul>
-<li>
-Si una lista es vac&iacute;a, devuelve <code>nil</code>.
-</li><li>
-Else, if the beginning of the list (the <small>CAR</small> of the list) passes a test
- <ul class="no-bullet">
-<li>-
- act on that element and combine it, using <code>cons</code> with
- </li><li>-
- a recursive call by the function on the rest (the <small>CDR</small>) of the list.
- </li></ul>
-</li><li>
-Otherwise, if the beginning of the list (the <small>CAR</small> of the list) fails the
-test
- <ul class="no-bullet">
-<li>-
- skip on that element,
- </li><li>-
- and, recursively call the function on the rest (the <small>CDR</small>) of the list.
- </li></ul>
-</li></ul>
-
-<p>Aqu&iacute; hay un ejemplo que usa <code>cond</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun manten-tres-letras (lista-palabras)
- &quot;Guarda 3 palabras en WORD-LIST.&quot;
- (cond
- ;; Primero do-again-test: stop-condition
- ((not lista-palabras) nil)
-
- ;; Segundo do-again-test: cuando actuar
- ((eq 3 (length (symbol-name (car lista-palabras))))
- ;; combina el elemento que act&uacute;a con la llamada recursiva en la
- ;; lista ordenada
- (cons (car lista-palabras) (manten-tres-letras (cdr lista-palabras))))
-
- ;; Tercero do-again-test: cuando se descarte el elemento;
- ;; llama recursivamente a la lista ordenada con la next-step expression
- (t (manten-tres-letras (cdr lista-palabras)))))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(manten-tres-letras '(uno dos tres cuatro cinco seis))
- &rArr; (uno dos)
-</pre></div>
-
-<p>Eso va sin decir que no se necesita usar <code>nil</code> como si el test
-para cuando para; y se puede, de acuerdo, combinar estos patrones.
-</p>
-<hr>
-<a name="Sin-Aplazar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Guardar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#No-aplazar-la-soluci_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Recursion-sin-diferir"></a>
-<h3 class="subsection">11.3.7 Recursi&oacute;n sin diferir</h3>
-<a name="index-Diferir-en-recursion"></a>
-<a name="index-Recursion-sin-diferir"></a>
-
-<p>Permita considerar de nuevo qu&eacute; ocurre con la funci&oacute;n
-<code>triangle-recursively</code>. Nosotros encontraremos que los c&aacute;lculos
-difieran hasta que todo pueda ser hecho.
-</p>
-<p>Aqu&iacute; est&aacute; la definici&oacute;n de funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun triangle-recursively (number)
- &quot;Devuelve la suma de los n&uacute;meros 1 a trav&eacute;s de NUMBER inclusive
-Usa recursi&oacute;n.&quot;
- (if (= number 1) ; <span class="roman">do-again-test</span>
- 1 ; <span class="roman">then-part</span>
- (+ number ; <span class="roman">else-part</span>
- (triangle-recursively ; <span class="roman">recursive call</span>
- (1- number))))) ; <span class="roman">next-step-expression</span>
-</pre></div>
-
-<p>&iquest;Qu&eacute; ocurre cuando se llama a esta funci&oacute;n con un
-argumento de 7?
-</p>
-<p>La primera instancia de la funci&oacute;n <code>triangle-recursively</code>
-a&ntilde;ade el n&uacute;mero 7 al valor devuelto por una segunda instancia de
-<code>triangle-recursively</code>, una instancia que ha pasado un argumento
-de 6. As&iacute;, el primer c&aacute;lculo es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 7 (triangle-recursively 6))
-</pre></div>
-
-<p>La primera instancia de <code>triangle-recursively</code> &mdash; se puede
-querer pensar como un peque&ntilde;o robot &mdash; no puede completar su
-trabajo. Eso debe manejar el c&aacute;lculo para
-<code>(triangle-recursively 6)</code> a una segunda instancia del programa,
-a un segundo robot. Este segundo individuo es completamente diferente
-desde el primero; eso es, en la jerga, una &lsquo;diferente
-instanciaci&oacute;n&rsquo;. O, poner otro camino, eso es un diferente robot. Eso
-es el mismo modelo como el primero; eso calcula n&uacute;meros de
-tri&aacute;ngulo recursivamente; pero eso tiene un n&uacute;mero de serie diferente.
-</p>
-<p>&iquest;Y qu&eacute; hace <code>(triangle-recursively 6)</code>
-devuelve? Eso devuelve el n&uacute;mero 6 a&ntilde;adido al valor devuelto para
-evaluar <code>triangle-recursively</code> con un argumento de 5. Usando la
-met&aacute;fora del robot, eso cuestiona todav&iacute;a otro robot
-para ayudarle.
-</p>
-<p>Ahora el total es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 7 6 (triangle-recursively 5))
-</pre></div>
-
-<p>&iquest;Y qu&eacute; ocurre despu&eacute;s?
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 7 6 5 (triangle-recursively 4))
-</pre></div>
-
-<p>Cada vez que <code>triangle-recursively</code> es llamado, excepto por la
-&uacute;ltima vez, eso crea otra instancia del programa &mdash; otro robot &mdash;
-y pregunta para crear un c&aacute;lculo.
-</p>
-<p>Finalmente, la adici&oacute;n completa es de la siguiente manera:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(+ 7 6 5 4 3 2 1)
-</pre></div>
-
-<p>Este dise&ntilde;o para la funci&oacute;n difiere el c&aacute;lculo del primer paso
-hasta el segundo puede ser hecho, y difiere esto hasta que el tercero
-puede ser hecho, y as&iacute;. Cada defermento significa el
-ordenador debe recordar que est&aacute; siendo esperado dentro. Esto no es
-un problema cuando hay solo unos pocos pasos, como en este
-ejemplo. Pero eso puede ser un problema cuando hay m&aacute;s pasos.
-</p>
-<hr>
-<a name="No-aplazar-la-soluci_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Sin-Aplazar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-de-Bucle" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="No-hay-solucion-pospuesta"></a>
-<h3 class="subsection">11.3.8 No hay soluci&oacute;n pospuesta</h3>
-<a name="index-No-aplazar-la-solucion"></a>
-<a name="index-Sin-posponer-la-solucion"></a>
-<a name="index-Solucion-no-pospuesta"></a>
-
-<p>La soluci&oacute;n al problema de operaciones pospuestas es para escribir
-en una manera que no posponga operaciones<a name="DOCF12" href="#FOOT12">(12)</a>. Esto requiere escribir a un patr&oacute;n diferente, con
-frecuencia uno que involucra escribiendo dos definiciones de
-funci&oacute;n, una funci&oacute;n de &lsquo;inicializaci&oacute;n&rsquo; y una funci&oacute;n &lsquo;ayuda&rsquo;.
-</p>
-<p>La funci&oacute;n &lsquo;inicializacion&rsquo; configura el trabajo; la funci&oacute;n
-&lsquo;ayudante&rsquo; hace el trabajo.
-</p>
-<p>Aqu&iacute; hay dos definiciones para a&ntilde;adir n&uacute;meros. Son
-as&iacute; de simple, aunque se encuentre duro de comprender.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun triangle-initialization (number)
- &quot;Devuelve la suma de los n&uacute;meros 1 a trav&eacute;s de NUMBER inclusive.
-Este es el componente de `inicializaci&oacute;n' de una funci&oacute;n d&uacute;o que
-usa recursi&oacute;n&quot;
- (triangle-recursive-helper 0 0 number))
-</pre></div>
-
-<div class="smallexample">
-<pre class="smallexample">(defun triangle-recursive-helper (sum counter number)
- &quot;Devuelve SUM, usando COUNTER, a trav&eacute;s de NUMBER inclusive.
-Este es el componente `helper' de unas dos funciones
-que usan recursi&oacute;n.&quot;
- (if (&gt; counter number)
- sum
- (triangle-recursive-helper (+ sum counter) ; <span class="roman">suma</span>
- (1+ counter) ; <span class="roman">contador</span>
- number))) ; <span class="roman">n&uacute;mero</span>
-</pre></div>
-
-<p>Instalar ambas definiciones de funci&oacute;n por evaluarlo, entonces llama
-a <code>triangle-initialization</code> con 2 filas:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(triangle-initialization 2)
- &rArr; 3
-</pre></div>
-
-<p>La funci&oacute;n &lsquo;inicializaci&oacute;n&rsquo; llama la primera instancia de la
-funci&oacute;n &lsquo;ayudante&rsquo; con tres argumentos: cero, cero, y un n&uacute;mero
-que es el n&uacute;mero de filas en el tri&aacute;ngulo.
-</p>
-<p>Los primeros dos argumentos pasaron a la funci&oacute;n &lsquo;ayuda&rsquo; son valores
-de inicializaci&oacute;n. Estos valores son cambiados cuando
-<code>triangle-recursive-helper</code> invocan nuevas
-instancias.<a name="DOCF13" href="#FOOT13">(13)</a>
-</p>
-<p>Perm&iacute;tase ver que ocurre cuando tenemos un tri&aacute;ngulo
-que tiene una fila. (&iexcl;Este tri&aacute;ngulo tendr&aacute; un
-asterisco dentro!)
-</p>
-<p><code>triangle-initialization</code> llamar&aacute; su ayudante con los
-argumentos <code>0&nbsp;0&nbsp;1</code>. Esta funci&oacute;n ejecutar&aacute; el test
-condicional si <code>(&gt; counter number)</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&gt; 0 1)
-</pre></div>
-
-<p>y encuentra que el resultado es falso, as&iacute; invocar&aacute; la
-else-part de la cla&uacute;sula <code>if</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (triangle-recursive-helper
- (+ sum counter) ; <span class="roman">sum m&aacute;s counter</span> &rArr; <span class="roman">sum</span>
- (1+ counter) ; <span class="roman">incrementa counter</span> &rArr; <span class="roman">counter</span>
- number) ; <span class="roman">number parece lo mismo</span>
-</pre></div>
-
-<p>que computar&aacute; primero:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(triangle-recursive-helper (+ 0 0) ; <span class="roman">sum</span>
- (1+ 0) ; <span class="roman">counter</span>
- 1) ; <span class="roman">number</span>
-que es:
-
-(triangle-recursive-helper 0 1 1)
-</pre></div>
-
-<p>De nuevo, <code>(&gt; counter number)</code> ser&aacute; falso, as&iacute; de
-nuevo, el int&eacute;rprete Lisp evaluar&aacute;
-<code>triangle-recursive-helper</code>, creando una nueva instancia con
-nuevos argumentos.
-</p>
-<p>Esta nueva instancia ser&aacute;;
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (triangle-recursive-helper
- (+ sum counter) ; <span class="roman">suma m&aacute;s contador</span> &rArr; <span class="roman">sum</span>
- (1+ counter) ; <span class="roman">incrementar contador</span> &rArr; <span class="roman">contador</span>
- number) ; <span class="roman">n&uacute;mero empieza lo mismo</span>
-
-que es:
-
-(triangle-recursive-helper 1 2 1)
-</pre></div>
-
-<p>En este caso, el test <code>(&gt; counter number)</code> &iexcl;ser&aacute;
-cierto! As&iacute; la instancia devolver&aacute; el valor de la
-suma, que ser&aacute; 1, como se espera.
-</p>
-<p>Ahora, permite pasar <code>triangle-initialization</code> un argumento de 2,
-para encontrar cu&aacute;ntos asterisco hay en un tri&aacute;ngulo con dos filas.
-</p>
-<p>Esta funci&oacute;n llama <code>(triangle-recursive-helper 0 0 2)</code>.
-</p>
-<p>En fases, las instancias llamadas ser&aacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> <span class="roman">suma contador n&uacute;mero</span>
-(triangle-recursive-helper 0 1 2)
-
-(triangle-recursive-helper 1 2 2)
-
-(triangle-recursive-helper 3 3 2)
-</pre></div>
-
-<p>Cuando la &uacute;ltima instancia se llama, el <code>(&gt; counter number)</code> se
-chequea si ser&aacute; cierto, as&iacute; la instancia devolver&aacute;
-el valor de <code>sum</code>, que ser&aacute; 3.
-</p>
-<p>Este tipo de patr&oacute;n ayuda cuando est&aacute;s escribiendo funciones que
-puede usar recursos en un ordenador.
-</p>
-<hr>
-<a name="Ejercicio-de-Bucle"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#No-aplazar-la-soluci_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicio-de-bucles"></a>
-<h2 class="section">11.4 Ejercicio de bucles</h2>
-
-<ul>
-<li>
-Escribe una funci&oacute;n similar a <code>triangle</code> en el que cada fila
-tiene un valor que es la ra&iacute;z del n&uacute;mero de la
-fila. Usa un bucle <code>while</code>.
-
-</li><li>
-Escribe una funci&oacute;n similar para <code>triangle</code> que multiplique en vez
-de a&ntilde;adir los valores.
-
-</li><li>
-Reescribe estas dos funciones recursivamente. Reescribe estas
-funciones usando <code>cond</code>.
-
-</li><li>
-Escribe una funci&oacute;n para el modo Texinfo que crea una entrada
-&iacute;ndice al principio de un p&aacute;rrafo para cada
-&lsquo;<samp>@dfn</samp>&rsquo; con el p&aacute;rrafo. (En un fichero Texinfo, &lsquo;<samp>@dfn</samp>&rsquo;
-marca una definici&oacute;n. El libro es escrito en Texinfo.)
-
-<p>Muchas de las funciones necesitar&aacute;n ser descritas en dos de los
-cap&iacute;tulos, <a href="#Cortando-y-almacenando-texto">Cortando y almacenando texto</a> y <a href="#Pegando">Pegando texto</a>. Si usas
-<code>forward-paragraph</code> para poner la entrada &iacute;ndice al
-principio del p&aacute;rrafo, tendr&aacute; que usar <kbd><span class="nolinebreak">C-h</span>&nbsp;f</kbd>
-(<code>describe-function</code>) para encontrar c&oacute;mo conseguir que el comando
-vaya hacia atr&aacute;s.
-</p>
-<p>Para m&aacute;s informaci&oacute;n, ver
-<a href="texinfo.html#Indicando">Indicando</a> in <cite>Manual de Texinfo</cite>, que va al
-manual Texinfo en el actual directorio. O, si est&aacute;s en Internet,
-mira <a href="http://www.gnu.org/software/texinfo/manual/texinfo/">http://www.gnu.org/software/texinfo/manual/texinfo/</a>
-</p></li></ul>
-
-<hr>
-<a name="Buscar-regexp"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Bucles-y-recursi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-de-Bucle" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#sentence_002dend" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Busquedas-de-expresiones-regulares"></a>
-<h1 class="chapter">12 B&uacute;squedas de expresiones regulares</h1>
-<a name="index-Busquedas_002c-ilustrando"></a>
-<a name="index-Busquedas-de-expresiones-regulares"></a>
-<a name="index-Patrones_002c-buscando-por"></a>
-<a name="index-Mover-frase-y-parrafo"></a>
-<a name="index-Frases_002c-movimiento-por"></a>
-<a name="index-Parrafos_002c-movimiento-por"></a>
-
-<p>Las b&uacute;squedas expresiones regulares son usadas extensivamente en GNU
-Emacs. Las dos funciones <code>forward-sentence</code> y
-<code>forward-paragraph</code>, ilustran estas b&uacute;squedas bien. Usan
-expresiones regulares para encontrar donde mover el punto. La frase
-&lsquo;expresi&oacute;n regular&rsquo; es con frecuencia escrita como &lsquo;regexp&rsquo;.
-</p>
-<p>Las b&uacute;squedas de expresiones regulares son descritas en
-<a href="emacs.html#B_00fasqueda-de-Regexp">B&uacute;squeda de Expresi&oacute;n Regular</a> in <cite>El Manual de GNU Emacs</cite>, tan bien como en <a href="elisp.html#Expresiones-Regulares">Expresiones Regulares</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>. Escribiendo
-este cap&iacute;tulo, estoy presuponiendo que tiene al menos una
-familiaridad con esto. El mayor punto para recordar es que las
-expresiones regulares te permiten buscar patrones tan bien como para
-cadenas literales de caracteres. Por ejemplo, el c&oacute;digo en
-<code>forward-sentence</code> busca para el patr&oacute;n de posibles caracteres
-que podr&iacute;an marcar el fin de una frase, y mueve el punto
-al otro lado.
-</p>
-<p>Antes de mirar en el c&oacute;digo la funci&oacute;n <code>forward-sentence</code>, es
-valorable considerar que el patr&oacute;n que marca el fin de una frase
-debe estar. El patr&oacute;n se discute en la siguiente secci&oacute;n;
-siguiendo que es una descripci&oacute;n de la expresi&oacute;n regular de
-b&uacute;squeda, <code>re-search-forward</code>. La funci&oacute;n
-<code>forward-sentence</code> es descrito en la secci&oacute;n
-siguiente. Finalmente, la funci&oacute;n <code>forward-paragraph</code> es
-descrito en la &uacute;ltima secci&oacute;n de este
-cap&iacute;tulo. <code>forward-paragraph</code> es una funci&oacute;n
-compleja que introduce varias funcionalidades.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#sentence_002dend">12.1 La expresi&oacute;n regular para <code>sentence-end</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#re_002dsearch_002dforward">12.2 La funci&oacute;n <code>re-search-forward</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Muy similar a <code>search-forward</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#forward_002dsentence">12.3 <code>forward-sentence</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un ejemplo sencillo de b&uacute;squeda con
- expresiones regulares.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#forward_002dparagraph">12.4 <code>forward-paragraph</code>: una mina de oro de funciones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Un ejemplo complejo de alguna cosa.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#etags">12.5 Crea tu propio fichero &lsquo;<tt>TAGS</tt>&rsquo;</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo crear tu propia tabla &lsquo;<tt>TAGS</tt>&rsquo;.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Revisar-regexp">12.6 Revisar</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Revisar regexp
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicios-re_002dsearch">12.7 Ejercicios con <code>re-search-forward</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicios re-search
-</td></tr>
-</table>
-
-<hr>
-<a name="sentence_002dend"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#re_002dsearch_002dforward" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-expresion-regular-para-sentence_002dend"></a>
-<h2 class="section">12.1 La expresi&oacute;n regular para <code>sentence-end</code></h2>
-<a name="index-sentence_002dend"></a>
-
-<p>El s&iacute;mbolo <code>sentence-end</code> se asocia al patr&oacute;n que
-marca el fin de una frase. &iquest;Cu&aacute;l ser&iacute;a
-esta expresi&oacute;n regular?
-</p>
-<p>Claramente, una frase puede ser finalizada por un periodo, una marca
-de inicio de interrogaci&oacute;n, o una marca de exclamaci&oacute;n. Puesto que
-viene del ingl&eacute;s, solo las cla&uacute;sulas que finalizan con uno de
-estos tres caracteres deber&iacute;an ser consideradas al fin de
-una frase. Esto significa que el patr&oacute;n incluir&iacute;a el
-conjunto de caracteres:
-</p>
-<div class="smallexample">
-<pre class="smallexample">[.?!]
-</pre></div>
-
-<p>Sin embargo, no queremos que <code>forward-sentence</code> salte a un
-periodo, una marca de pregunta, o una marca de exclamaci&oacute;n, porque
-tal car&aacute;cter podr&iacute;a ser usado en el medio de una
-frase. Un periodo, por ejemplo, se usa despu&eacute;s de
-abreviaciones. As&iacute;, otra informaci&oacute;n es necesaria.
-</p>
-<p>De acuerdo a la convenci&oacute;n, escribe dos espacios despu&eacute;s de cada
-frase, pero solo un espacio despu&eacute;s de un periodo, una marca de
-pregunta, o una marca de exclamaci&oacute;n seguida por dos espacios es un
-buen indicador de un fin de frase. Sin embargo, en un fichero, los dos
-espacios pueden ser un tabulador o el fin de una
-l&iacute;nea. Esto significa que la expresi&oacute;n regular
-incluir&iacute;a estos tres &iacute;tems como
-alternativas.
-</p>
-<p>Este grupo de alternativas se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">\\($\\| \\| \\)
- ^ ^^
- TAB SPC
-</pre></div>
-
-<p>Aqu&iacute;, &lsquo;<samp>$</samp>&rsquo; indica el fin de la l&iacute;nea, y
-yo he apuntado donde el tab y dos espacios est&aacute;n insertados en la
-expresi&oacute;n. Ambos est&aacute;n insertados poniendo los caracteres actuales
-dentro de la expresi&oacute;n.
-</p>
-<p>Dos barras invertidas, &lsquo;<samp>\\</samp>&rsquo;, se requiere antes de los
-par&eacute;ntesis y barras verticales: la primera barra invertida cita la
-siguiente barra invertida en Emacs; y el segundo indica que el
-siguiente caracter, el par&eacute;ntesis o la barra vertical, es especial.
-</p>
-<p>Tambi&eacute;n, una frase puede ser seguida por uno o m&aacute;s retornos de
-carro, como este:
-</p>
-<div class="smallexample">
-<pre class="smallexample">[
-]*
-</pre></div>
-
-<p>Como en los tabuladores y espacios, un retorno de carro se inserta
-dentro de una expresi&oacute;n regular insert&aacute;ndolo literalmente. El
-asterisco indica que el &lt;RET&gt; se repite cero o m&aacute;s veces.
-</p>
-<p>Pero una frase no consiste solo en un periodo, una marca de pregunta o
-una marca de exclamaci&oacute;n seguida por espacios apropiados: una marca
-de cerrar comillas o cerrar un par&eacute;ntesis de alg&uacute;n tipo puede
-preceder el espacio. En realidad m&aacute;s de una marca o par&eacute;ntesis
-pueden preceder el espacio. Estas requieren una expresi&oacute;n que se
-parezca a:
-</p>
-<div class="smallexample">
-<pre class="smallexample">[]\&quot;')}]*
-</pre></div>
-
-<p>En esta expresi&oacute;n, el primer &lsquo;<samp>]</samp>&rsquo; es el primer caracter en la
-expresi&oacute;n; el segundo caracter es &lsquo;<samp>&quot;</samp>&rsquo;, que est&aacute; precedido
-por un &lsquo;<samp>\</samp>&rsquo; para contar Emacs el &lsquo;<samp>&quot;</samp>&rsquo; <em>no</em> es
-especial. Los &uacute;ltimos tres caracteres son &lsquo;<samp>'</samp>&rsquo;, &lsquo;<samp>)</samp>&rsquo;, y
-&lsquo;<samp>}</samp>&rsquo;.
-</p>
-<p>Todo esto sugiere que el patr&oacute;n de la expresi&oacute;n regular para
-asociar el fin de una frase ser&iacute;a; y, profundamente, si
-se eval&uacute;a <code>sentence-end</code> y encuentra que se devuelve el valor
-siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">sentence-end
- &rArr; &quot;[.?!][]\&quot;')}]*\\($\\| \\| \\)[
-]*&quot;
-</pre></div>
-
-<p>(Bien, no en GNU Emacs 22; porque es un esfuerzo crear el proceso
-simple y manejar m&aacute;s s&iacute;mbolos y lenguajes. Cuando el
-valor de <code>sentence-end</code> es <code>nil</code>, entonces usa el valor
-definido por la funci&oacute;n <code>sentence-end</code> es <code>nil</code>, entonces
-usa el valor definido por la funci&oacute;n
-<code>sentence-end</code>. (Aqu&iacute; se usa la diferencia entre un
-valor y una funci&oacute;n en Emacs Lisp.) La funci&oacute;n devuelve un valor
-construido desde las variables <code>sentence-end-base</code>,
-<code>sentence-end-double-space</code>, <code>sentence-end-without-period</code>,
-y <code>sentence-end-without-space</code>. La variable cr&iacute;tica
-es <code>sentence-end-base</code>; su valor global es similar a uno descrito
-debajo pero tambi&eacute;n contiene marcas de cita adicionales. Estas
-tienen diferentes grados de curvas. La variable
-<code>sentence-end-without-period</code>, cuando es verdad, dice a Emacs que
-una frase puede finalizar sin un periodo tal como texto en Thai.)
-</p>
-
-<hr>
-<a name="re_002dsearch_002dforward"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#sentence_002dend" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dsentence" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-re_002dsearch_002dforward"></a>
-<h2 class="section">12.2 La funci&oacute;n <code>re-search-forward</code></h2>
-<a name="index-re_002dsearch_002dforward"></a>
-
-<p>La funci&oacute;n <code>re-search-forward</code> es similar a la funci&oacute;n
-<code>search-forward</code>. (V&eacute;ase la secci&oacute;n <a href="#search_002dforward">La Funci&oacute;n <code>search-forward</code></a>.)
-</p>
-<p><code>re-search-forward</code> busca una expresi&oacute;n regular. Si la
-b&uacute;squeda es exitosa, deja el punto inmediatamente despu&eacute;s del
-&uacute;ltimo caracter en el objetivo. Si la b&uacute;squeda es hacia atr&aacute;s,
-deja el punto antes del primer caracter en el objetivo. Se puede
-contar <code>re-search-forward</code> para devolver <code>t</code> a
-cierto. (Moviendo el punto es por ello un &lsquo;efecto lateral&rsquo;.)
-</p>
-<p>Como <code>search-forward</code>, la funci&oacute;n <code>re-search-forward</code> toma
-cuatro argumentos:
-</p>
-<ol>
-<li>
-El primer argumento es la expresi&oacute;n regular que la funci&oacute;n
-busca. La expresi&oacute;n regular ser&aacute; una cadena entre comillas.
-
-</li><li>
-El segundo argumento opcional limita c&oacute;mo la funci&oacute;n busca; es
-un emparejamiento, que se especifica como una posici&oacute;n en el
-b&uacute;ffer.
-
-</li><li>
-El tercer argumento opcional especifica c&oacute;mo la funci&oacute;n responde al
-fallo: <code>nil</code> como tercer argumento que causa la funci&oacute;n para
-se&ntilde;alar un error (e imprime un mensaje) cuando la b&uacute;squeda falla;
-cualquier otro valor causa devolver <code>nil</code> si la b&uacute;squeda falla
-y <code>t</code> si la b&uacute;squeda tiene &eacute;xito.
-
-</li><li>
-El cuarto argumento opcional es el contaje repetido. Un contaje
-negativo repetido causa <code>re-search-forward</code> para buscar hacia atr&aacute;s.
-</li></ol>
-
-<p>La plantilla para <code>re-search-forward</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(re-search-forward &quot;<var>regular-expression</var>&quot;
- <var>limit-of-search</var>
- <var>what-to-do-if-search-fails</var>
- <var>repeat-count</var>)
-</pre></div>
-
-<p>El segundo, tercer, y cuarto argumentos son opcionales. Sin embargo,
-si se quiere pasar un valor a uno o ambos de los &uacute;ltimos dos
-argumentos, se debe tambi&eacute;n pasar un valor a todos los argumentos
-precedentes. De otro modo, el int&eacute;rprete Lisp errar&aacute; a qu&eacute;
-argumento est&aacute;s pasando el valor.
-</p>
-<p>En la funci&oacute;n <code>forward-sentence</code>, la expresi&oacute;n regular ser&aacute;
-el valor de la variable <code>sentence-end</code>. En forma simple, esto es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">&quot;[.?!][]\&quot;')}]*\\($\\| \\| \\)[
-]*&quot;
-</pre></div>
-
-<p>El l&iacute;mite de la b&uacute;squeda ser&aacute; el fin del p&aacute;rrafo
-(desde una frase no puede ir bajo un p&aacute;rrafo). Si la b&uacute;squeda
-falla, la funci&oacute;n devuelve <code>nil</code>, y el contaje repite ser&aacute;
-provisto por el argumento para la funci&oacute;n <code>forward-sentence</code>.
-</p>
-<hr>
-<a name="forward_002dsentence"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#re_002dsearch_002dforward" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Completa-forward_002dsentence" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="forward_002dsentence-1"></a>
-<h2 class="section">12.3 <code>forward-sentence</code></h2>
-<a name="index-forward_002dsentence"></a>
-
-<p>El comando mueve el cursor hacia adelante una frase es una
-ilustraci&oacute;n honesta de c&oacute;mo usar b&uacute;squedas de expresiones
-regulares en Emacs Lisp. En realidad, la funci&oacute;n parece m&aacute;s larga
-y m&aacute;s complicada de lo que es; esto es porque la funci&oacute;n est&aacute;
-dise&ntilde;ada para ir hacia atr&aacute;s tan bien como hacia adelante; y,
-opcionalmente, a trav&eacute;s de una frase. La funci&oacute;n est&aacute;
-normalmente asociada al comando <kbd>M-e</kbd>.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Completa-forward_002dsentence">Completa la definici&oacute;n <code>forward-sentence</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Completa forward-sentence
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Bucles-while-fwd_002dsentence">Los bucles <code>while</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Dos bucles <code>while</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Volver-a-buscar-la-frase-en-sentido-directo">La b&uacute;squeda de expresiones regulares</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una b&uacute;squeda de
- expresi&oacute;n regular.
-</td></tr>
-</table>
-
-<hr>
-<a name="Completa-forward_002dsentence"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dsentence" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dsentence" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-while-fwd_002dsentence" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Completa-la-definicion-forward_002dsentence"></a>
-<h3 class="unnumberedsubsec">Completa la definici&oacute;n <code>forward-sentence</code></h3>
-
-<p>Aqu&iacute; est&aacute; la c&oacute;digo para <code>forward-sentence</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun forward-sentence (&amp;optional arg)
- &quot;Ve al siguiente `sentence-end'. Con el argumento, repite.
-Con el argumento negativo, mueve atr&aacute;s repetidamente a `sentence-beginning'.
-La variable `sentence-end' es una expresi&oacute;n regular que empareja el
-fin de frases. Tambi&eacute;n, cada p&aacute;rrafo asociado termina las frases
-bien.
-</pre><pre class="smallexample"> (interactive &quot;p&quot;)
- (or arg (setq arg 1))
- (let ((opoint (point))
- (sentence-end (sentence-end)))
- (while (&lt; arg 0)
- (let ((pos (point))
- (par-beg (save-excursion (start-of-paragraph-text) (point))))
- (if (and (re-search-backward sentence-end par-beg t)
- (or (&lt; (match-end 0) pos)
- (re-search-backward sentence-end par-beg t)))
- (goto-char (match-end 0))
- (goto-char par-beg)))
- (setq arg (1+ arg)))
-</pre><pre class="smallexample"> (while (&gt; arg 0)
- (let ((par-end (save-excursion (end-of-paragraph-text) (point))))
- (if (re-search-forward sentence-end par-end t)
- (skip-chars-backward &quot; \t\n&quot;)
- (goto-char par-end)))
- (setq arg (1- arg)))
- (constrain-to-field nil opoint t)))
-</pre></div>
-
-
-<p>La funci&oacute;n se ve larga a primera vista y es mejor mirar primero el
-esqueleto, y entonces su m&uacute;sculo. El camino para ver el esqueleto es
-mirar en las expresiones que empiezan las columnas m&aacute;s a la
-izquierda:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun forward-sentence (&amp;optional arg)
- &quot;<var>documentation</var>&hellip;&quot;
- (interactive &quot;p&quot;)
- (or arg (setq arg 1))
- (let ((opoint (point)) (sentence-end (sentence-end)))
- (while (&lt; arg 0)
- (let ((pos (point))
- (par-beg (save-excursion (start-of-paragraph-text) (point))))
- <var>rest-of-body-of-while-loop-when-going-backwards</var>
- (while (&gt; arg 0)
- (let ((par-end (save-excursion (end-of-paragraph-text) (point))))
- <var>rest-of-body-of-while-loop-when-going-forwards</var>
- <var>handle-forms-and-equivalent</var>
-</pre></div>
-
-<p>&iexcl;Esto parece bastante simple! La definici&oacute;n de la
-funci&oacute;n consiste de documentaci&oacute;n una expresi&oacute;n
-<code>interactive</code>, una expresi&oacute;n <code>or</code>, una expresi&oacute;n
-<code>let</code>, y bucles <code>while</code>.
-</p>
-<p>Permite mirar cada una de estas partes.
-</p>
-<p>Notamos que la documentaci&oacute;n es profunda y comprensible.
-</p>
-<p>La funci&oacute;n tiene una declaraci&oacute;n <code>interactive &quot;p&quot;</code>. Esto
-signifca que el argumento prefijo, si cualquiera es pasado a la
-funci&oacute;n como su argumento. (Esto ser&aacute; un n&uacute;mero.) Si la
-funci&oacute;n no pasa un argumento (eso es opcional) entonces el argumento
-<code>arg</code> ser&aacute; asociado a 1.
-</p>
-<p>Cuando <code>forward-sentence</code> se llama no interactivamente sin un
-argumento, <code>arg</code> est&aacute; asignado <code>nil</code>. La expresi&oacute;n
-<code>or</code> maneja esto. Lo que hace es dejar el valor de <code>arg</code>
-como eso es, pero solo si <code>arg</code> est&aacute; asignado a un valor; o eso
-asigna el valor de <code>arg</code> a 1, en el caso de <code>arg</code> est&aacute;
-asignado a <code>nil</code>.
-</p>
-<p>Lo siguiente es un <code>let</code>. Que especifica los valores de dos
-variables locales <code>point</code> y <code>sentence-end</code>. El valor local
-de punto, desde antes de la b&uacute;squeda, es usada en la funci&oacute;n
-<code>constrain-to-field</code> que maneja formularios y equivalentes. La
-variable <code>sentence-end</code> est&aacute; asignada por la funci&oacute;n
-<code>sentence-end</code>.
-</p>
-<hr>
-<a name="Bucles-while-fwd_002dsentence"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Completa-forward_002dsentence" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dsentence" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Volver-a-buscar-la-frase-en-sentido-directo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Los-bucles-while"></a>
-<h3 class="unnumberedsubsec">Los bucles <code>while</code></h3>
-
-<p>Sigue dos bucles <code>while</code>. El primer <code>while</code> tiene un
-true-or-false-test que chequea cierto si el argumento prefijo para
-<code>forward-sentence</code> es un n&uacute;mero negativo. Esto es para volver
-hacia atr&aacute;s. El cuerpo de este bucle es similar al cuerpo de la
-segunda cl&aacute;usula <code>while</code>, pero eso no es exactamente el
-mismo. Se obviar&aacute; este bucle <code>while</code> y concentra en el segundo
-bucle <code>while</code>.
-</p>
-<p>El segundo bucle <code>while</code> est&aacute; moviendo el punto hacia
-adelante. Su esqueleto se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while (&gt; arg 0) ; <span class="roman">true-or-false-test</span>
- (let <var>varlist</var>
- (if (<var>true-or-false-test</var>)
- <var>then-part</var>
- <var>else-part</var>
- (setq arg (1- arg)))) ; <code>while</code> <span class="roman">loop decrementer</span>
-</pre></div>
-
-<p>El bucle <code>while</code> es el tipo de decremento. (V&eacute;ase la secci&oacute;n <a href="#Bucle-que-se-decrementa">Un Bucle con un Contador de Decremento</a>.) Eso tiene un
-true-or-false-test que chequea cierto tan largo con el contador (en
-este caso, la variable <code>arg</code>) es mayor que cero; y eso tiene un
-decremento que elimina 1 desde el valor del contador cada vez que el
-bucle se repite.
-</p>
-<p>Si ning&uacute;n argumento prefijo es dado para <code>forward-sentece</code>, que
-es el camino m&aacute;s com&uacute;n es usado, este bucle <code>while</code>
-ejecutar&aacute; una vez, desde que el valor de <code>arg</code> ser&aacute; 1.
-</p>
-<p>El cuerpo del cuerpo <code>while</code> consite de una expresi&oacute;n
-<code>let</code>, que crea y asocia una variable local, y tiene, su cuerpo,
-una expresi&oacute;n <code>if</code>.
-</p>
-<p>El cuerpo del bucle <code>while</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let ((par-end
- (save-excursion (end-of-paragraph-text) (point))))
- (if (re-search-forward sentence-end par-end t)
- (skip-chars-backward &quot; \t\n&quot;)
- (goto-char par-end)))
-</pre></div>
-
-<p>La expresi&oacute;n <code>let</code> crea y asocia la variable local
-<code>par-end</code>. Como se ve, esta variable local est&aacute; dise&ntilde;ada para
-proporcionar una asociaci&oacute;n o l&iacute;mite para la
-b&uacute;squeda de la expresi&oacute;n regular. Si la b&uacute;squeda falla para
-encontrar una frase apropiada finalizando en el p&aacute;rrafo, eso
-se parar&aacute; logrando el fin del p&aacute;rrafo.
-</p>
-<p>Pero primero, perm&iacute;tenos examinar c&oacute;mo <code>par-end</code>
-se asocia a la variable del fin del p&aacute;rrafo. Lo que ocurre es que el
-<code>let</code> asigna el valor de <code>par-end</code> al valor devuelto cuando
-el int&eacute;rprete eval&uacute;a la expresi&oacute;n.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(save-excursion (end-of-paragraph-text) (point))
-</pre></div>
-
-<p>En esta expresi&oacute;n, <code>(end-of-paragraph-text)</code> mueve el punto al
-fin del p&aacute;rrafo, <code>(point)</code> devuelve el valor del punto, y
-entonces <code>save-excursion</code> restaura el punto a su posici&oacute;n
-original. De este modo, el <code>let</code> asocia <code>par-end</code> al valor
-devuelto por la expresi&oacute;n <code>save-excursion</code>, que es la
-posici&oacute;n del fin del p&aacute;rrafo. (La funci&oacute;n
-<code>end-of-paragraph-text</code> usa <code>forward-paragraph</code>, que se
-discutir&aacute; pronto.)
-</p>
-<p>Emacs eval&uacute;a el cuerpo del <code>let</code>, que es una expresi&oacute;n
-<code>if</code> que se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (re-search-forward sentence-end par-end t) ; <span class="roman">if-part</span>
- (skip-chars-backward &quot; \t\n&quot;) ; <span class="roman">then-part</span>
- (goto-char par-end))) ; <span class="roman">else-part</span>
-</pre></div>
-
-<p>El test <code>if</code> si su primer argumento es cierto y si
-as&iacute;, eval&uacute;a su parte then; de otro modo, el
-int&eacute;rprete Emacs Lisp eval&uacute;a la parte else. El true-or-false-test
-de la expresi&oacute;n <code>if</code> es la b&uacute;squeda de la expresi&oacute;n regular.
-</p>
-<p>Puede estar mal tener que mirar como el &lsquo;trabajo real&rsquo; de la funci&oacute;n
-<code>forward-sentence</code> es vista aqu&iacute;, pero esto es un
-camino com&uacute;n de este tipo de operaci&oacute;n traida en Lisp.
-</p>
-<hr>
-<a name="Volver-a-buscar-la-frase-en-sentido-directo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Bucles-while-fwd_002dsentence" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dsentence" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dparagraph" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-busqueda-de-expresiones-regulares"></a>
-<h3 class="unnumberedsubsec">La b&uacute;squeda de expresiones regulares</h3>
-
-<p>La funci&oacute;n <code>re-search-forward</code> busca el fin de la frase, que
-es, para el patr&oacute;n definido por la expresi&oacute;n regular
-<code>sentence-end</code>. Si el patr&oacute;n es encontrado &mdash; si el fin de la
-frase se encuentra &mdash; entonces la funci&oacute;n <code>re-search-forward</code>
-hace dos cosas:
-</p>
-<ol>
-<li>
-La funci&oacute;n <code>re-search-forward</code> trae un efecto lateral, que es
-mover el punto al final de la ocurrencia encontrada.
-
-</li><li>
-La funci&oacute;n <code>re-search-forward</code> devuelve un valor de
-verdad. Esto es el valor recibido por el <code>if</code>, y significa que la
-b&uacute;squeda fu&eacute; exitosa.
-</li></ol>
-
-<p>El efecto lateral, el movimiento del punto se completa antes de la
-funci&oacute;n <code>if</code> y es manejado por el valor devuelto por la exitosa
-conclusi&oacute;n de la b&uacute;squeda.
-</p>
-<p>Cuando la funci&oacute;n <code>if</code> recibe el valor de verdad desde una
-llamada exitosa a <code>re-search-forward</code>, el <code>if</code> eval&uacute;a la
-parte then que es la expresi&oacute;n <code>(skip-chars-backward
-&quot;\t\n&quot;)</code>. Esta expresi&oacute;n se mueve atr&aacute;s a trav&eacute;s de espacios en
-blanco, los tabuladores o retornos de carro hasta un caracter impreso
-es encontrado y entonces deja el punto correcto despu&eacute;s del caracter
-impreso cerrado de la frase, que es normalmente un periodo.
-</p>
-<p>Por otro lado, si la funci&oacute;n <code>re-search-forward</code> falla para
-encontrar un patr&oacute;n marcando el fin de la frase, la funci&oacute;n
-devuelve falso. Lo falso causa el <code>if</code> para evaluar su tercer
-argumento, que es <code>(goto-char par-end)</code>: eso mueve el punto al
-final del p&aacute;rrafo.
-</p>
-<p>(Y si el texto est&aacute; en una forma o equivalente, y apunta a que no
-puede moverse completamente entonces la funci&oacute;n
-<code>constrain-to-field</code> empieza a funcionar.)
-</p>
-<p>Las b&uacute;squedas de expresiones regulares son excepcionalmente &uacute;tiles
-y el patr&oacute;n ilustrado por <code>re-search-forward</code>, en el que la
-b&uacute;squeda es el test de una expresi&oacute;n <code>if</code>, es manejable. Se
-ver&aacute; o escribir&aacute; c&oacute;digo incorporando este patr&oacute;n con frecuencia.
-</p>
-<hr>
-<a name="forward_002dparagraph"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Volver-a-buscar-la-frase-en-sentido-directo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dparagraph-en-breve" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="forward_002dparagraph_003a-una-mina-de-oro-de-funciones"></a>
-<h2 class="section">12.4 <code>forward-paragraph</code>: una mina de oro de funciones</h2>
-<a name="index-forward_002dparagraph"></a>
-
-
-<p>La funci&oacute;n <code>forward-paragraph</code> mueve el punto al fin del
-p&aacute;rrafo. Eso est&aacute; normalmente asociado a <kbd>M-}</kbd> y hace uso de
-un n&uacute;mero de funciones que son importantes en s&iacute;,
-incluyendo <code>let*</code>, <code>match-beginning</code>, y <code>looking-at</code>.
-</p>
-<p>La definici&oacute;n de funci&oacute;n para <code>forward-paragraph</code> es
-considerablemente mayor que la definici&oacute;n de funci&oacute;n para
-<code>forward-sentence</code> porque eso funciona como un p&aacute;rrafo, cada
-l&iacute;nea puede empezar con un prefijo de relleno <em>fill
-prefix</em>.
-</p>
-<p>Un prefijo de relleno <em>fill prefix</em> consiste en una cadena de
-caracteres que se repite al principio de cada
-l&iacute;nea. Por ejemplo, en c&oacute;digo Lisp, es una
-convenci&oacute;n para empezar cada l&iacute;nea de un comentario de
-p&aacute;rrafo largo con &lsquo;<samp>;;; </samp>&rsquo;. En modo Texto, cuatro espacios en
-blanco crean otro prefijo de relleno <em>fill prefix</em> com&uacute;n,
-creando un p&aacute;rrafo indentado. (See <a href="emacs.html#Fill-Prefix">Fill Prefix</a> in <cite>The GNU Emacs Manual</cite> para m&aacute;s informaci&oacute;n acerca de prefijos de relleno
-<em>fill prefix</em>.)
-</p>
-<p>La existencia de un prefijo de relleno significa que adem&aacute;s de ser
-capaz de encontrar el fin de un p&aacute;rrafo cuyas l&iacute;neas
-empiezan m&aacute;s a la izquierda, la funci&oacute;n <code>forward-paragraph</code>
-debe ser capaz de encontrar el fin de un p&aacute;rrafo cuando todas o
-muchas de las l&iacute;neas en el b&uacute;ffer empiezan con el
-prefijo de relleno <em>fill prefix</em>.
-</p>
-<p>M&aacute;s all&aacute;, es algunas veces pr&aacute;ctico ignorar un prefijo de
-relleno <em>fill prefix</em> que existe, especialmente cuando las
-l&iacute;neas en blanco separen p&aacute;rrafos. Esto es una
-complicaci&oacute;n a&ntilde;adida.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#forward_002dparagraph-en-breve">Definici&oacute;n de funci&oacute;n <code>forward-paragraph</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Partes clave de la definici&oacute;n de la
- funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#fwd_002dpara-let">La expresi&oacute;n <code>let*</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#fwd_002dpara-while">El bucle <code>while</code> hacia adelante</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> El bucle <code>while</code> con modo hacia adelante.
-</td></tr>
-</table>
-
-<hr>
-<a name="forward_002dparagraph-en-breve"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dparagraph" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dparagraph" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#fwd_002dpara-let" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Definicion-de-funcion-forward_002dparagraph"></a>
-<h3 class="unnumberedsubsec">Definici&oacute;n de funci&oacute;n <code>forward-paragraph</code></h3>
-
-<p>En vez de imprimir toda la funci&oacute;n <code>forward-paragraph</code>,
-nosotros solo imprimiremos partes de la misma. &iexcl;Lee sin
-preparaci&oacute;n, la funci&oacute;n puede estar para desanimar!
-</p>
-<p>En esquema, la funci&oacute;n se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun forward-paragraph (&amp;optional arg)
- &quot;<var>documentation</var>&hellip;&quot;
- (interactive &quot;p&quot;)
- (or arg (setq arg 1))
- (let*
- <var>varlist</var>
- (while (and (&lt; arg 0) (not (bobp))) ; <span class="roman">backward-moving-code</span>
- &hellip;
- (while (and (&gt; arg 0) (not (eobp))) ; <span class="roman">forward-moving-code</span>
- &hellip;
-</pre></div>
-
-<p>Las primeras partes de la funci&oacute;n son rutinas: la funci&oacute;n lista
-argumentos que consisten de un argumento opcional. La documentaci&oacute;n sigue.
-</p>
-<p>La letra min&uacute;scula &lsquo;<samp>p</samp>&rsquo; en la declaraci&oacute;n <code>interactive</code>
-significa que el argumento prefijo se procesa, si se pasa a la
-funci&oacute;n. Eso ser&aacute; un n&uacute;mero, y es el contaje repetido de cu&aacute;ntos
-p&aacute;rrafos se mover&aacute;. La expresi&oacute;n <code>or</code> en la siguiente
-l&iacute;nea maneja el caso com&uacute;n cuando no hay argumentos
-que se pasan a la funci&oacute;n, esto ocurre si la funci&oacute;n se llama
-desde otro c&oacute;digo en vez de interactivamente. Este caso se describe
-pronto. (V&eacute;ase la secci&oacute;n <a href="#forward_002dsentence">La funci&oacute;n <code>forward-sentence</code></a>.) Ahora se logra el fin de la parte familiar
-de esta funci&oacute;n.
-</p>
-<hr>
-<a name="fwd_002dpara-let"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dparagraph-en-breve" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dparagraph" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#fwd_002dpara-while" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-expresion-let_002a"></a>
-<h3 class="unnumberedsubsec">La expresi&oacute;n <code>let*</code></h3>
-
-<p>La siguiente l&iacute;nea de la funci&oacute;n
-<code>forward-paragraph</code> empieza una expresi&oacute;n <code>let*</code>. Esto es
-tan diferente como <code>let</code>. El s&iacute;mbolo es <code>let*</code>
-no <code>let</code>.
-</p>
-<p>La forma especial <code>let*</code> es como <code>let</code> excepto que Emacs
-asigna cada variable en secuencia, una despu&eacute;s de otra, y las
-variables en la &uacute;ltima parte de la varlist hacen uso de los valores
-para los que Emacs asign&oacute; variable al principio la varlist.
-</p>
-
-<p>(<a href="#append-save_002dexcursion"><code>save-excursion</code> en <code>append-to-buffer</code></a>.)
-</p>
-<p>En la expresi&oacute;n <code>let*</code> en esta funci&oacute;n, Emacs asigna un total
-de siete variables: <code>opoint</code>, <code>fill-prefix-regexp</code>,
-<code>parstart</code>, <code>parsep</code>, <code>sp-parstart</code>, <code>start</code>, y
-<code>found-start</code>.
-</p>
-<p>La variable <code>parsep</code> aparece dos veces, primero, para borrar
-instancias de &lsquo;<samp>^</samp>&rsquo;, y segundo, para manejar prefijos rellenos.
-</p>
-<p>La variable <code>opoint</code> es solo el valor de <code>point</code>. Como se
-puede adivinar, eso se usa en una expresi&oacute;n
-<code>constrain-to-field</code>, solo como en <code>forward-sentence</code>.
-</p>
-<p>La variable <code>fill-prefix-regexp</code> se asigna al valor devuelto para
-evaluar la siguiente lista:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(and fill-prefix
- (not (equal fill-prefix &quot;&quot;))
- (not paragraph-ignore-fill-prefix)
- (regexp-quote fill-prefix))
-</pre></div>
-
-<p>Esta es una expresi&oacute;n cuyo primer elemento es la forma especial
-<code>and</code>.
-</p>
-<p>Como se aprendi&oacute; antes la (v&eacute;ase la secci&oacute;n <a href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code></a>), la forma especial <code>and</code> eval&uacute;a cada uno de
-sus argumentos hasta uno de los argumentos y devuelve un valor de
-<code>nil</code> en el que el caso de la expresi&oacute;n <code>and</code> devuelve
-<code>nil</code>; sin embargo, si ninguno de los argumentos devuelve un
-valor de <code>nil</code>, el valor resultante de evaluar el &uacute;ltimo
-argumento es devuelto. (Puesto que tal valor no es <code>nil</code>, eso es
-considerado verdad en Lisp.) En otras palabras, una expresi&oacute;n
-<code>and</code> devuelve un valor de verdad solo si todos sus argumentos
-son verdad.
-<a name="index-and-1"></a>
-</p>
-<p>En este caso, la variable <code>fill-prefix-regexp</code> est&aacute; asociado a
-un valor no <code>nil</code> solo si el las siguientes cuatro expresiones
-producen un valor true (por ej., un no <code>nil</code>) cuando son
-evaluados; de otro modo, <code>fill-prefix-regexp</code> est&aacute; asociado a
-<code>nil</code>.
-</p>
-<dl compact="compact">
-<dt><code>fill-prefix</code></dt>
-<dd><p>Cuando esta variable se eval&uacute;a, el valor del prefijo de relleno
-<em>fill prefix</em>, si cualquiera, est&aacute; devuelto. Si no hay prefijo
-relleno, la variable devuelve <code>nil</code>.
-</p>
-</dd>
-<dt><code>(not (equal fill-prefix &quot;&quot;)</code></dt>
-<dd><p>Esta expresi&oacute;n chequea si un prefijo lleno es una cadena
-vac&iacute;a, que es, una cadena sin caracteres en eso. Una
-cadena vac&iacute;a no es &uacute;til un prefijo relleno <em>fill
-prefix</em>.
-</p>
-</dd>
-<dt><code>(not paragraph-ignore-fill-prefix)</code></dt>
-<dd><p>Esta expresi&oacute;n devuelve <code>nil</code> si la variable
-<code>paragraph-ignore-fill-prefix</code> ha sido cambiado siendo asignado
-un valor de verdad tal como <code>t</code>.
-</p>
-</dd>
-<dt><code>(regexp-quote fill-prefix)</code></dt>
-<dd><p>Este es el &uacute;ltimo argumento para la forma especial <code>and</code>. Si
-todos los argumentos de <code>and</code> son verdaderos, el valor resultante
-de evaluar esta expresi&oacute;n ser&aacute; devuelto por la expresi&oacute;n
-<code>and</code> y asociado a la variable <code>fill-prefix-regexp</code>,
-</p></dd>
-</dl>
-
-<a name="index-regexp_002dquote"></a>
-<p>El resultado de evaluar esta expresi&oacute;n <code>and</code> con &eacute;xito es que
-<code>fill-prefix-regexp</code> se asociar&aacute; al valor de <code>fill-prefix</code>
-como fu&eacute; modificado por la funci&oacute;n <code>regexp-quote</code>. Lo que
-<code>regexp-quote</code> hace es leer una cadena y devolver la expresi&oacute;n
-regular que asociar&aacute; exactamente la cadena y nada m&aacute;s. Esto
-significa que <code>fill-prefix-regexp</code> ser&aacute; asignada a un valor que
-asociar&aacute; el prefijo si el prefijo existe. De otro modo, la variable
-ser&aacute; asignada a <code>nil</code>.
-</p>
-<p>Las dos variables locales siguientes en la expresi&oacute;n <code>let*</code>
-est&aacute;n dise&ntilde;adas para eliminar instancias de &lsquo;<samp>^</samp>&rsquo; desde
-<code>parstart</code> y <code>parsep</code>, las variables locales indican que
-el p&aacute;rrafo empieza como separador de p&aacute;rrafo. La siguiente
-expresi&oacute;n asigna <code>parsep</code> de nuevo. Esto es manejar prefijos
-rellenos.
-</p>
-<p>Esta es la configuraci&oacute;n que requiere la llamada de la definici&oacute;n
-<code>let*</code> en vez de <code>let</code>. El true-or-false-test para el
-<code>if</code> depende de si la variable <code>fill-prefix-regexp</code> eval&uacute;a
-a <code>nil</code> o alg&uacute;n otro valor.
-</p>
-<p>Si <code>fill-prefix-regexp</code> no tiene un valor, Emacs eval&uacute;a la
-parte else de la expresi&oacute;n <code>if</code> y asocia <code>parsep</code> a su
-valor local. (<code>parsep</code> es una expresi&oacute;n regular que asocia lo
-que los p&aacute;rrafos separan.)
-</p>
-<p>Pero si <code>fill-prefix-regexp</code> tiene un valor, Emacs eval&uacute;a la
-parte then de la expresi&oacute;n <code>if</code> y asocia <code>parsep</code> a una
-expresi&oacute;n regular que incluye el <code>fill-prefix-regexp</code> como
-parte del patr&oacute;n.
-</p>
-<p>Espec&iacute;ficamente, <code>parsep</code> est&aacute; asignado al valor
-original del
-p&aacute;rrafo que separa la expresi&oacute;n regular concatenada con una
-expresi&oacute;n alternativa que consiste del <code>fill-prefix-regexp</code>
-seguido por espacios en blanco opcionales para el fin de la
-l&iacute;nea. El espacio en blanco est&aacute; definido por
-<code>&quot;[&nbsp;\t]*$&quot;</code>.) El &lsquo;<samp>\\|</samp>&rsquo; define esta porci&oacute;n del regexp
-como una alternativa a <code>parsep</code>.
-</p>
-<p>De acuerdo a un comentario en el c&oacute;digo, la siguiente variable
-local, <code>sp-parstart</code>, se usa para buscar, y entonces los dos
-finales, <code>start</code> y <code>found-start</code>, se asignan a <code>nil</code>.
-</p>
-<p>Ahora tenemos dentro el cuerpo del <code>let*</code>. La primera parte del
-cuerpo del <code>let*</code> trata con el caso cuando la funci&oacute;n es dada
-a un argumento negativo y consiguientemente movi&eacute;ndose hacia
-atr&aacute;s. Nosotros saldremos de esta secci&oacute;n yendo hacia atr&aacute;s.
-</p>
-<hr>
-<a name="fwd_002dpara-while"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#fwd_002dpara-let" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#forward_002dparagraph" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#etags" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-bucle-while-hacia-adelante"></a>
-<h3 class="unnumberedsubsec">El bucle <code>while</code> hacia adelante</h3>
-
-<p>La segunda parte del cuerpo del <code>let*</code> trata con el proceso hacia
-adelante. Eso es un bucle <code>while</code> que se repite si el valor de
-<code>arg</code> es mayor que cero. En el uso m&aacute;s com&uacute;n de la funci&oacute;n
-el valor del argumento es 1, as&iacute; el cuerpo del bucle
-<code>while</code> se eval&uacute;a exactamente una vez, y el cursor se mueve
-hacia adelante un p&aacute;rrafo.
-</p>
-
-<p>Esta parte maneja tres situaciones: cuando el punto est&aacute; entre
-p&aacute;rrafos, cuando hay un prefijo de relleno y cuando no hay prefijo
-de relleno <em>fill prefix</em>.
-</p>
-<p>El bucle <code>while</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;; <span class="roman">yendo hacia adelante y no al fin del b&uacute;ffer</span>
-(while (and (&gt; arg 0) (not (eobp)))
-
- ;; <span class="roman">entre p&aacute;rrafos</span>
- ;; Mueve hacia adelante a trav&eacute;s de l&iacute;neas de
- ;; separaci&oacute;n...
- (while (and (not (eobp))
- (progn (move-to-left-margin) (not (eobp)))
- (looking-at parsep))
- (forward-line 1))
- ;; <span class="roman">Esto decremento el bucle</span>
- (unless (eobp) (setq arg (1- arg)))
- ;; ... y una l&iacute;nea m&aacute;s
- (forward-line 1)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> (if fill-prefix-regexp
- ;; Hay un prefijo lleno; que sobreescribe parstart;
- ;; vamos adelante l&iacute;nea por l&iacute;nea
- (while (and (not (eobp))
- (progn (move-to-left-margin) (not (eobp)))
- (not (looking-at parsep))
- (looking-at fill-prefix-regexp))
- (forward-line 1))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; No hay prefijo;
- ;; vamos hacia adelante caracter por caracter
- (while (and (re-search-forward sp-parstart nil 1)
- (progn (setq start (match-beginning 0))
- (goto-char start)
- (not (eobp)))
- (progn (move-to-left-margin)
- (not (looking-at parsep)))
- (or (not (looking-at parstart))
- (and use-hard-newlines
- (not (get-text-property (1- start) 'hard)))))
- (forward-char 1))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; y si no hay prefijo y si no estamos al final
- ;; ir a lo que fu&eacute; encontrado en la b&uacute;squeda de expresiones regulares
- ;; para sp-parstart
- (if (&lt; (point) (point-max))
- (goto-char start))))
-</pre></div>
-
-<a name="index-eobp"></a>
-<p>Se puede ver que esto es un contador de decremento <code>while</code>,
-usando la expresi&oacute;n <code>(setq arg (1- arg))</code> como lo que se
-decrementa. Esta expresi&oacute;n no est&aacute; lejos desde el <code>while</code>,
-pero est&aacute; oculta en otra macro Lisp, una macro <code>unless</code>. A
-menos que estemos al final del b&uacute;ffer &mdash; esto es lo que la
-funci&oacute;n <code>eobp</code> determina; eso es una abreviaci&oacute;n de &lsquo;<samp>Fin
-del Buffer P</samp>&rsquo; &mdash; nosotros decrementamos el valor de <code>arg</code> por
-uno.
-</p>
-<p>(Si estamos al fin del b&uacute;ffer, no podemos ir m&aacute;s hacia adelante y
-el siguiente bucle de la expresi&oacute;n <code>while</code> chequear&aacute; falso
-desde que el test es un <code>and</code> con <code>(not (eobp))</code>. La
-funci&oacute;n <code>not</code> significa exactamente como se esperaba; eso es
-otro nombre de <code>null</code>, una funci&oacute;n que devuelve cierto cuando
-su argumento es falso.)
-</p>
-<p>De manera interesante, el bucle cuenta que no se decrementa
-hasta que deje el espacio entre p&aacute;rrafos, a menos que vuelva al fin
-del b&uacute;ffer o pare viendo el valor local del separador del p&aacute;rrafo.
-</p>
-<p>El segundo <code>while</code> tambi&eacute;n tiene una expresi&oacute;n
-<code>(move-to-left-margin)</code>. La funci&oacute;n es autoexplicativa. Eso
-est&aacute; dentro de una expresi&oacute;n <code>progn</code> y no el &uacute;ltimo
-elemento de su cuerpo, as&iacute; es solo invocado para su
-efecto lateral, que es mover el punto al margen izquierdo de la
-l&iacute;nea actual.
-</p>
-<a name="index-looking_002dat"></a>
-<p>La funci&oacute;n <code>looking-at</code> es tambi&eacute;n auto-explicativa; eso
-devuelve cierto si el texto despu&eacute;s del punto asocia la expresi&oacute;n
-regular dada como su argumento.
-</p>
-<p>El resto del cuerpo del bucle se ve compleja al principio, pero tiene
-sentido cuando se comprende.
-</p>
-<p>Primero considera que ocurre si hay un prefijo de relleno <em>fill
-prefix</em>:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (if fill-prefix-regexp
- ;; Hay un prefijo lleno; que sobreescribe parstart;
- ;; vamos adelante l&iacute;nea por l&iacute;nea
- (while (and (not (eobp))
- (progn (move-to-left-margin) (not (eobp)))
- (not (looking-at parsep))
- (looking-at fill-prefix-regexp))
- (forward-line 1))
-</pre></div>
-
-<p>Esta expresi&oacute;n mueve el punto hacia adelante l&iacute;nea por
-l&iacute;nea tan lejos como que las cuatro condiciones son ciertas:
-</p>
-<ol>
-<li>
-Punto no est&aacute; al final del b&uacute;ffer.
-
-</li><li>
-Podemos mover al margen izquierdo del texto y no estar al fin del b&uacute;ffer.
-
-</li><li>
-El siguiente punto no separa p&aacute;rrafos.
-
-</li><li>
-El patr&oacute;n que sigue el punto es la expresi&oacute;n regular prefija rellena.
-</li></ol>
-
-<p>La &uacute;ltima condici&oacute;n puede ser un puzzle, hasta que se recuerde qu&eacute;
-punto fu&eacute; movido al principio de la l&iacute;nea temprana en
-la funci&oacute;n <code>forward-paragraph</code>. Esto significa que si el texto
-tiene el prefijo relleno, la funci&oacute;n <code>looking-at</code> se ver&aacute;.
-</p>
-<p>Considera qu&eacute; ocurre cuando no hay un prefijo lleno.
-</p>
-<div class="smallexample">
-<pre class="smallexample"> (while (and (re-search-forward sp-parstart nil 1)
- (progn (setq start (match-beginning 0))
- (goto-char start)
- (not (eobp)))
- (progn (move-to-left-margin)
- (not (looking-at parsep)))
- (or (not (looking-at parstart))
- (and use-hard-newlines
- (not (get-text-property (1- start) 'hard)))))
- (forward-char 1))
-</pre></div>
-
-<p>El bucle <code>while</code> nos tiene buscando hacia adelante para
-<code>sp-parstart</code>, que es la combinaci&oacute;n de posibles espacios en
-blanco con un valor local del comienzo de un p&aacute;rrafo o de un
-p&aacute;rrafo separador. (Las &uacute;ltimas dos son con una expresi&oacute;n
-empezando con <code>(?:)</code> as&iacute; que no est&aacute;n
-referenciadas por la funci&oacute;n <code>match-beginning</code>.)
-</p>
-<p>Las dos expresiones,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq start (match-beginning 0))
-(goto-char start)
-</pre></div>
-
-<p>significa ir al comienzo del siguiente texto localizado por la
-expresi&oacute;n regular.
-</p>
-<p>La expresi&oacute;n <code>(match-beginning 0)</code> es nueva. Eso devuelve un
-n&uacute;mero especificando la posici&oacute;n del comienzo del texto fuese
-asociado a la &uacute;ltima b&uacute;squeda.
-</p>
-<p>La funci&oacute;n <code>match-beginning</code> es usado aqu&iacute; porque
-una caracter&iacute;stica de una b&uacute;squeda hacia adelante: una
-b&uacute;squeda hacia adelante, sin dignidad si eso es una b&uacute;squeda plana
-o una expresi&oacute;n regular, mueve el punto al fin del texto que es
-encontrado. En este caso, una b&uacute;squeda exitosa mueve el punto al
-fin del patr&oacute;n para <code>sp-parstart</code>.
-</p>
-<p>Sin embargo, se quiere poner el punto al fin del actual p&aacute;rrafo, no
-en alg&uacute;n lugar m&aacute;s. En vez de eso, desde que la b&uacute;squeda
-posiblemente incluye el separador del p&aacute;rrafo, el punto puede
-finalizar al principio de lo siguiente a menos que se use una
-expresi&oacute;n que incluya <code>match-beginning</code>.
-</p>
-<a name="index-match_002dbeginning"></a>
-<p>Cuando un argumento de 0, <code>match-beginning</code> devuelve la posici&oacute;n
-que es el comienzo del texto asociado por la b&uacute;squeda m&aacute;s
-reciente. En este caso, la b&uacute;squeda m&aacute;s reciente parece
-<code>sp-parstart</code>. La expresi&oacute;n <code>(match-beginning 0)</code> devuelve
-la posici&oacute;n del comienzo de este patr&oacute;n, en vez de la posici&oacute;n
-final de este patr&oacute;n.
-</p>
-<p>(Incidentalmente, cuando se pasa un n&uacute;mero positivo como un
-argumento, la funci&oacute;n <code>match-beginning</code> devuelve la
-localizaci&oacute;n de punto en el que la expresi&oacute;n con par&eacute;ntesis en
-la &uacute;ltima b&uacute;squeda a menos que la expresi&oacute;n con par&eacute;ntesis
-empiece con <code>\(?:</code>. No s&eacute; porque <code>\(?:</code> aparece
-aqu&iacute; desde que el argumento es 0.)
-</p>
-<p>La &uacute;ltima expresi&oacute;n cuando no hay prefijos es
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (&lt; (point) (point-max))
- (goto-char start))))
-</pre></div>
-
-<p>Esto dice que si no hay prefijo lleno y no estamos al punto final que
-se mover&iacute;a al principio de lo que fu&eacute; encontrado por
-la b&uacute;squeda de la expresi&oacute;n regular para <code>sp-parstart</code>.
-</p>
-<p>La definici&oacute;n completa para la funci&oacute;n <code>forward-paragraph</code> no
-solo incluye c&oacute;digo para avanzar, tambi&eacute;n c&oacute;digo para retroceder.
-</p>
-<p>Si est&aacute; leyendo esto dentro de GNU Emacs y quieres ver la funci&oacute;n
-completa, se puede escribir <kbd>C-h f</kbd> (<code>describe-function</code>) y
-el nombre de la funci&oacute;n. Esto da la documentaci&oacute;n de funci&oacute;n
-y el nombre de la librer&iacute;a conteniendo las fuentes de la
-funci&oacute;n. Posiciona el punto a trav&eacute;s del nombre de la
-librer&iacute;a y presionar la tecla RET; ser&aacute; tomado
-directamente a las fuentes. (&iexcl;Aseg&uacute;rate de instalar las
-fuentes! &iexcl;Sin eso, estar&aacute;s como una persona que intenta
-conducir un coche con los ojos cerrados!)
-</p>
-<hr>
-<a name="etags"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#fwd_002dpara-while" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Revisar-regexp" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Crea-tu-propio-fichero-TAGS"></a>
-<h2 class="section">12.5 Crea tu propio fichero &lsquo;<tt>TAGS</tt>&rsquo;</h2>
-<a name="index-etags"></a>
-<a name="index-fichero-de-TAGS_002c-crea-el-propio"></a>
-
-<p>Bajo <kbd>C-h f</kbd> (<code>describe-function</code>), otro camino para ver la
-fuente de una funci&oacute;n es escribir <kbd>M-.</kbd> (<code>find-tag</code>) y el
-nombre de la funci&oacute;n se asigna para eso. Esto es un buen h&aacute;bito
-para obtenerlo. El comando <kbd>M-.</kbd> (<code>find-tag</code>) toma
-directamente a las fuentes de una funci&oacute;n, variable, o nodo. La
-funci&oacute;n depende de tablas de etiquetas para saber donde ir.
-</p>
-<p>Si la funci&oacute;n <code>find-tag</code> pregunta primero por el nombre de una
-tabla &lsquo;<tt>TAGS</tt>&rsquo;, dado el nombre de un fichero &lsquo;<tt>TAGS</tt>&rsquo; tal como
-&lsquo;<tt>/usr/local/src/emacs/src/TAGS</tt>&rsquo;. (La ruta exacta a tu fichero
-&lsquo;<tt>TAGS</tt>&rsquo; depende de c&oacute;mo tu copia de Emacs fu&eacute; instalada. Yo
-te cuento la localizaci&oacute;n que provee tanto mi C y mis fuentes de
-Emacs Lisp.)
-</p>
-<p>Se puede tambi&eacute;n crear tu propio fichero &lsquo;<tt>TAGS</tt>&rsquo; para los directorios
-que faltan.
-</p>
-<p>Con frecuencia se necesita construir e instalar etiquetas de tablas
-por uno mismo. Esas no son construidas autom&aacute;ticamente. Una tabla de
-etiquetas llama a un fichero &lsquo;<tt>TAGS</tt>&rsquo;; el nombre es letras
-may&uacute;sculas.
-</p>
-<p>Se puede crear un fichero &lsquo;<tt>TAGS</tt>&rsquo; llamando el programa
-<code>etags</code> que viene como parte de la distribuci&oacute;n
-Emacs. Normalmente, <code>etags</code> est&aacute; compilado e instalado cuando
-Emacs se construye. (<code>etags</code> no es una funci&oacute;n Lisp o una parte
-de Emacs; eso es un programa C.)
-</p>
-<p>Para crear el fichero &lsquo;<tt>TAGS</tt>&rsquo;, primero cambia el directorio en el
-que se quiere crear el fichero. En Emacs se puede hacer esto con el
-comando <kbd>M-x cd</kbd>, o visitando un fichero en el directorio, o
-listando el directorio <code>etags&nbsp;*.el</code> como el comando a ejecutar
-</p>
-<div class="smallexample">
-<pre class="smallexample">M-x compile RET etags *.el RET
-</pre></div>
-
-<p>crear un fichero de &lsquo;<tt>TAGS</tt>&rsquo; para Emacs Lisp.
-</p>
-<p>Por ejemplo, si se tiene un gran n&uacute;mero de ficheros en el
-directorio &lsquo;<tt>~/emacs</tt>&rsquo;, como se hace &mdash; Yo tengo 137 &lsquo;<tt>.el</tt>&rsquo;
-dentro, de que se carguen 12 &mdash; se puede crear un fichero &lsquo;<tt>TAGS</tt>&rsquo;
-para los ficheros Emacs Lisp en este directorio.
-</p>
-<p>El programa <code>etags</code> toma en toda la consola usual &lsquo;comodines&rsquo;. Por
-ejemplo, si tienes dos directorios para el que quieres un fichero
-&lsquo;<tt>TAGS</tt>&rsquo; simple, escribe <code>etags&nbsp;*.el&nbsp;../elisp/*.el</code>, donde
-&lsquo;<tt>../elisp/</tt>&rsquo; es el segundo directorio:
-</p>
-<div class="smallexample">
-<pre class="smallexample">M-x compile RET etags *.el ../elisp/*.el RET
-</pre></div>
-
-<p>Tipo
-</p>
-<div class="smallexample">
-<pre class="smallexample">M-x compile RET etags --help RET
-</pre></div>
-
-<p>para ver una lista de las opciones aceptadas por <code>etags</code> tan bien
-como una lista de lenguajes soportados.
-</p>
-<p>El programa <code>etags</code> maneja m&aacute;s de 20 lenguajes, incluyendo
-Emacs Lisp, Common Lisp, Scheme, C, C++, Ada, Fortran, HTML, Java,
-LaTeX, Pascal, Perl, Postscript, Python, TeX, Texinfo, makefiles, y la
-mayor&iacute;a de ensambladores. El programa no cambia para
-especificar el lenguaje; eso reconoce el lenguaje como una entrada de
-fichero de acuerdo a su nombre de fichero y contenidos.
-</p>
-<p>&lsquo;<tt>etags</tt>&rsquo; es muy &uacute;til cuando se escribe c&oacute;digo por
-t&iacute; mismo y quiere referirse a funciones que ya se han
-escrito. Ahora ejecuta <code>etags</code> de nuevo en intervalos como se
-escriben nuevas funciones, as&iacute; llegan a ser parte del
-fichero &lsquo;<tt>TAGS</tt>&rsquo;.
-</p>
-<p>Si piensa que un fichero &lsquo;<tt>TAGS</tt>&rsquo; apropiado que ya existe para lo
-que quieres, pero no conoces donde est&aacute;, se puede usar el programa
-<code>locate</code> para intentar encontrarlo.
-</p>
-<p>Escribe <kbd><span class="nolinebreak">M-x</span>&nbsp;locate&nbsp;&lt;RET&gt;&nbsp;TAGS&nbsp;&lt;RET&gt;</kbd> y Emacs
-listar&aacute; para ti las rutas nombres completas de todos tus ficheros
-&lsquo;<tt>TAGS</tt>&rsquo;. En mi sistema, este comando lista 34 fichero &lsquo;<tt>TAGS</tt>&rsquo;.
-Por otro lado, un sistema &lsquo;vanilla plano&rsquo; que recientemente no
-conten&iacute;a fichero &lsquo;<tt>TAGS</tt>&rsquo;.
-</p>
-<p>Si la tabla de etiquetas que se quiere ha sido creada, se puede usar
-el comando <code>M-x visit-tags-table</code> para especificarlo. De otro
-modo, se necesitar&aacute; la tabla de etiquetas por t&iacute; mismo
-y entonces usar <code>M-x visit-tags-table</code>.
-</p>
-<a name="Construyendo-Etiquetas-en-las-fuentes-Emacs"></a>
-<h4 class="subsubheading">Construyendo Etiquetas en las fuentes Emacs</h4>
-<a name="index-Construyendo-Etiquetas-en-las-fuentes-Emacs"></a>
-<a name="index-Etiquetas-en-las-fuentes-Emacs"></a>
-<a name="index-crear-etiquetas"></a>
-
-<p>Las fuentes GNU Emacs vienen con un &lsquo;<tt>Makefile</tt>&rsquo; que contiene un
-comando sofisticado <code>etags</code> que crea, recoge, y asocia tablas de
-etiquetas de todas las fuentes de Emacs y pone la informaci&oacute;n dentro
-de un fichero &lsquo;<tt>TAGS</tt>&rsquo; en el directorio &lsquo;<tt>src/</tt>&rsquo;. (El directorio
-&lsquo;<tt>src/</tt>&rsquo; est&aacute; debajo del alto nivel de tu directorio Emacs.)
-</p>
-<p>Para construir este fichero &lsquo;<tt>TAGS</tt>&rsquo;, se puede ir al alto nivel de
-directorio de fuentes Emacs y ejecutar el comando de compilar <code>make
-tags</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">M-x compile RET make tags RET
-</pre></div>
-
-<p>(El comando <code>make tags</code> trabaja bien con las fuentes de GNU
-Emacs, tan bien como con otros paquetes fuentes.)
-</p>
-<p>Para m&aacute;s informaci&oacute;n, mira <a href="emacs.html#Etiquetas">Tablas de Etiquetas</a> in <cite>El Manual GNU Emacs</cite>.
-</p>
-<hr>
-<a name="Revisar-regexp"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#etags" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicios-re_002dsearch" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Revisar-5"></a>
-<h2 class="section">12.6 Revisar</h2>
-
-<p>Aqu&iacute; hay un breve resumen de algunas funciones
-introducidas recientemente.
-</p>
-<dl compact="compact">
-<dt><code>while</code></dt>
-<dd><p>Repetidamente eval&uacute;a el cuerpo de la expresi&oacute;n tan larga como el
-primer elemento del cuerpo chequea cierto. Entonces devuelve
-<code>nil</code>. (La expresi&oacute;n es evaluado solo por sus efectos laterales.)
-</p>
-<p>Por ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let ((foo 2))
- (while (&gt; foo 0)
- (insert (format &quot;foo is %d.\n&quot; foo))
- (setq foo (1- foo))))
-
- &rArr; foo is 2.
- foo is 1.
- nil
-</pre></div>
-
-<p>(La funci&oacute;n <code>insert</code> inserta sus argumentos en el punto; la
-funci&oacute;n <code>format</code> devuelve una cadena formateada desde sus
-argumentos el camino <code>message</code> formatea sus argumentos; <code>\n</code>
-produce una nueva l&iacute;nea.)
-</p>
-</dd>
-<dt><code>re-search-forward</code></dt>
-<dd><p>Busca un patr&oacute;n, y si el patr&oacute;n se encuentra, mueve el punto al
-resto solo despu&eacute;s de eso.
-</p>
-<p>Toma cuatro argumentos, como <code>search-forward</code>:
-</p>
-<ol>
-<li>
-Una expresi&oacute;n regular que especifica el patr&oacute;n para
-buscarlo. (&iexcl;Recuerda por marcas de comillas alrededor de
-este argumento!)
-
-</li><li>
-Opcionalmente, el l&iacute;mite de la b&uacute;squeda.
-
-</li><li>
-Opcionalmente, que haces si la b&uacute;squeda falla, devuelve <code>nil</code> o
-un mensaje de error.
-
-</li><li>
-Opcionalmente, cu&aacute;ntas veces se puede repetir la b&uacute;squeda; si es
-negativa, la b&uacute;squeda va hacia atr&aacute;s.
-</li></ol>
-
-</dd>
-<dt><code>let*</code></dt>
-<dd><p>Asocia algunas variables localmente a valores particulares, y entonces
-eval&uacute;a los argumentos que permanencen, devolviendo el valor del
-&uacute;ltimo. Mientras se asocian las variables locales, se usan los
-valores locales de variables asociadas pronto, si acaso.
-</p>
-<p>Por ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let* ((foo 7)
- (bar (* 3 foo)))
- (message &quot;`bar' is %d.&quot; bar))
- &rArr; `bar' is 21.
-</pre></div>
-
-</dd>
-<dt><code>match-beginning</code></dt>
-<dd><p>Devuelve la posici&oacute;n del principio del texto encontrado por la
-&uacute;ltima b&uacute;squeda de la expresi&oacute;n regular.
-</p>
-</dd>
-<dt><code>looking-at</code></dt>
-<dd><p>Devuelve <code>t</code> para verdadero si el texto despu&eacute;s del punto se
-asocia al argumento, que deber&iacute;a ser una expresi&oacute;n.
-</p>
-</dd>
-<dt><code>eobp</code></dt>
-<dd><p>Devuelve <code>t</code> para cierto si el punto est&aacute; en el fin de la parte
-accesible de un b&uacute;ffer. El fin de la parte accesible es el fin del
-b&uacute;ffer no est&aacute; encogido; eso es el fin de la parte encogida si el
-b&uacute;ffer est&aacute; encogido.
-</p></dd>
-</dl>
-
-<hr>
-<a name="Ejercicios-re_002dsearch"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Revisar-regexp" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Buscar-regexp" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicios-con-re_002dsearch_002dforward"></a>
-<h2 class="section">12.7 Ejercicios con <code>re-search-forward</code></h2>
-
-<ul>
-<li>
-Escribe una funci&oacute;n para buscar para una expresi&oacute;n que detecte dos
-o m&aacute;s l&iacute;neas blancas en secuencia.
-
-</li><li>
-Escribe una funci&oacute;n para buscar palabras duplicadas, tales como &lsquo;el
-el&rsquo;. See <a href="emacs.html#Regexps">Sintaxis para Expresiones Regulares</a> in <cite>El Manual de GNU Emacs</cite>, para informaci&oacute;n de c&oacute;mo escribir un regexp
-(una expresi&oacute;n regular) para asociar una cadena que se compone de
-dos mitades id&eacute;nticas. Se puede disponer de varios regexps; algunos
-son mejores que otros. La funci&oacute;n que se usa es descrito en un
-ap&eacute;ndice, a lo largo de varios regexps. V&eacute;ase la secci&oacute;n <a href="#the_002dthe">Funci&oacute;n de Palabras Duplicadas <code>the-the</code></a>.
-</li></ul>
-
-<hr>
-<a name="Contando-palabras"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Buscar-regexp" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicios-re_002dsearch" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Por-qu_00e9-Contar-Palabras" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Contando_003a-repeticion-y-regexps"></a>
-<h1 class="chapter">13 Contando: repetici&oacute;n y regexps</h1>
-<a name="index-Repeticion-para-contar-palabras"></a>
-<a name="index-Expresiones-regulares-para-contar-palabras"></a>
-
-<p>La repetici&oacute;n y b&uacute;squeda de expresiones regulares son herramientas
-poderosas que con frecuencia se usan cuando se escribe c&oacute;digo en Emacs
-Lisp. Este cap&iacute;tulo ilustra el uso de b&uacute;squeda de
-expresiones regulares a trav&eacute;s de la construcci&oacute;n de comandos de
-contaje de palabras usando bucles <code>while</code> y recursi&oacute;n.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Por-qu_00e9-Contar-Palabras">Contando palabras</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Por qu&eacute; Contar Palabras
-</td></tr>
-<tr><td align="left" valign="top"><a href="#count_002dwords_002dexample">13.1 La funci&oacute;n <code>count-words-example</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usa un regexp, pero encuentra un problema.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#recursive_002dcount_002dwords">13.2 Cuenta palabras recursivamente</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Empezar en caso de que no haya palabras en la
- regi&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-de-Contar">13.3 Ejercicio: contando puntuaci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio de Contar
-</td></tr>
-</table>
-
-<hr>
-<a name="Por-qu_00e9-Contar-Palabras"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Contando-palabras" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#count_002dwords_002dexample" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Contando-palabras-1"></a>
-<h2 class="unnumberedsec">Contando palabras</h2>
-
-<p>La distribuci&oacute;n de Emacs est&aacute;ndar contiene una funci&oacute;n para
-contar el n&uacute;mero de l&iacute;neas en una regi&oacute;n.
-</p>
-<p>Hay cierto tipo de pregunta escrita para contar palabras. De este
-modo, si se escribe un ensayo, puede limitarse a 800 palabras; si se
-escribe una novela, te puedes disciplinar a ti mismo a escribir 1000
-palabras al d&iacute;a. Parece raro, pero durante mucho tiempo,
-a Emacs le falt&oacute; un comando para contar palabras. Quiz&aacute;s la gente
-usaba Emacs mayoritariamente para codificar o documentar cosas que no
-requieren contar palabras, o quiz&aacute;s se restring&iacute;an al
-sistema operativo el comando de contar palabras, <code>wc</code>. De manera
-alternativa, la gente puede seguir la convenci&oacute;n de las editoriales
-y computaban un contaje de palabras dividiendo el n&uacute;mero de caracteres
-en un documento por cinco.
-</p>
-<p>Hay mucho caminos para implementar un comando para contar
-palabras. Aqu&iacute; hay algunos ejemplos, que pueden desear
-compararse con el comando de Emacs est&aacute;ndar,
-<code>count-words-region</code>.
-</p>
-<hr>
-<a name="count_002dwords_002dexample"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Contando-palabras" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Por-qu_00e9-Contar-Palabras" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Dise_00f1ar-count_002dwords_002dexample" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-count_002dwords_002dexample"></a>
-<h2 class="section">13.1 La funci&oacute;n <code>count-words-example</code></h2>
-<a name="index-count_002dwords_002dexample"></a>
-
-<p>Un comando de contar palabras podr&iacute;a contar palabras en
-una l&iacute;nea, p&aacute;rrafo, regi&oacute;n, o
-b&uacute;ffer. &iquest;Qu&eacute; comando funcionar&iacute;a? Se
-podr&iacute;a dise&ntilde;ar el comando para contar el n&uacute;mero de
-palabras en un b&uacute;ffer completo. Sin embargo, la tradici&oacute;n Emacs
-anima a la flexibilidad &mdash; se puede querer contar palabras solo en
-una secci&oacute;n, en vez de en todo un b&uacute;ffer. As&iacute;, tiene
-m&aacute;s sentido dise&ntilde;ar el comando para contar el n&uacute;mero de palabras
-en una regi&oacute;n. Una vez tienes un comando <code>count-words-region</code>,
-se puede, si desea, contar palabras en un b&uacute;ffer completo
-marc&aacute;ndolo con <kbd><span class="nolinebreak">C-x</span>&nbsp;h</kbd> (<code>mark-whole-buffer</code>).
-</p>
-<p>Claramente, contar palabras es un acto repetitivo: empezando desde el
-principio de la regi&oacute;n, se cuenta la primera palabra, entonces la
-segunda palabra, entonces la tercera palabra, y as&iacute;,
-hasta que logres el fin de la regi&oacute;n. Esto significa que contar
-palabras se ajusta idealmente a recursi&oacute;n o a un bucle <code>while</code>.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Dise_00f1ar-count_002dwords_002dexample">Dise&ntilde;ando <code>count-words-example</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La definici&oacute;n usando un bucle
- <code>while</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Error-de-espacio-en-blanco">13.1.1 El error de espacio en blanco en <code>count-words-example</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-</table>
-
-<hr>
-<a name="Dise_00f1ar-count_002dwords_002dexample"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Contando-palabras" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#count_002dwords_002dexample" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#count_002dwords_002dexample" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Error-de-espacio-en-blanco" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Disenando-count_002dwords_002dexample"></a>
-<h3 class="unnumberedsubsec">Dise&ntilde;ando <code>count-words-example</code></h3>
-
-<p>Primero, implementaremos el comando de contar palabras con un bucle
-<code>while</code>, entonces con la recursi&oacute;n. El comando, de acuerdo,
-ser&aacute; interactivo.
-</p>
-<p>La plantilla para una definici&oacute;n de funci&oacute;n interactiva es, como
-siempre:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun <var>name-of-function</var> (<var>argument-list</var>)
- &quot;<var>documentation</var>&hellip;&quot;
- (<var>interactive-expression</var>&hellip;)
- <var>body</var>&hellip;)
-</pre></div>
-
-<p>Lo que necesitamos hacer es rellenar los slots.
-</p>
-<p>El nombre de la funci&oacute;n ser&iacute;a auto-explicativo y
-similar al nombre del <code>count-lines-region</code> existente. Esto hace
-que el nombre sea f&aacute;cil de recordar. <code>count-words-region</code> es
-una buena elecci&oacute;n. Puesto que el nombre se usa ahora para el
-comando de Emacs est&aacute;ndar para contar palabras, nosotros nombraremos
-nuestra implementaci&oacute;n como <code>count-words-example</code>.
-</p>
-<p>La funci&oacute;n cuenta palabras con una regi&oacute;n. Esto significa que el
-argumento lista debe contener s&iacute;mbolos que son asociados
-a las dos posiciones, el principio y fin de la regi&oacute;n. Estas dos
-posiciones puede ser llamadas &lsquo;<samp>beginning</samp>&rsquo; y &lsquo;<samp>end</samp>&rsquo;
-respectivamente. La primera l&iacute;nea de la documentaci&oacute;n
-ser&iacute;a una frase simple, desde que esto es todo lo que
-est&aacute; impreso como documentaci&oacute;n por un comando tal como
-<code>apropos</code>. La expresi&oacute;n interactiva ser&aacute; de la forma
-&lsquo;<samp>(interactive &quot;r&quot;)</samp>&rsquo;, puesto que causar&aacute; que Emacs pase al
-principio y fin de la regi&oacute;n a la lista de argumentos de
-funci&oacute;n. Todo esto es rutina.
-</p>
-<p>El cuerpo de la funci&oacute;n necesita ser escrita para hacer tres tareas:
-primero, configurar condiciones bajo las que el bucle <code>while</code>
-pueda contar palabras, segundo, ejecutar el bucle <code>while</code>, y
-tercero, enviar un mensaje al usuario.
-</p>
-<p>Cuando un usuario llama a <code>count-words-example</code>, apunta a que
-puede estar al principio o fin de la regi&oacute;n. Sin embargo, el proceso
-de conteo debe empezar al principio de la regi&oacute;n. Esto significa que
-querremos poner el punto que hay si eso no est&aacute;
-all&iacute;. Ejecutando <code>(goto-char beginning)</code> asegura
-esto. De acuerdo, querremos devolver el punto a su posici&oacute;n esperada
-cuando la funci&oacute;n finalice su trabajo. Por esta raz&oacute;n, el cuerpo
-debe ser encerrado en una expresi&oacute;n <code>save-excursion</code>.
-</p>
-<p>La parte central del cuerpo de la funci&oacute;n consiste en un bucle
-<code>while</code> en el que una expresi&oacute;n salta el punto hacia delante
-palabra por palabra, y otra expresi&oacute;n cuenta estos saltos. Si el
-test-verdadero-o-falso del bucle <code>while</code> es verdadero, el punto
-saltar&iacute;a hacia adelante, y si es falso el punto
-estar&iacute;a al fin de la regi&oacute;n.
-</p>
-<p>Nosotros podr&iacute;amos usar <code>(forward-word 1)</code> como la
-expresi&oacute;n para mover el punto hacia adelante palabra por palabra,
-pero eso es f&aacute;cil de ver que Emacs identifica como una &lsquo;palabra&rsquo; si
-se usa una b&uacute;squeda de expresi&oacute;n regular.
-</p>
-<p>Una expresi&oacute;n regular busca lo que encuentra el patr&oacute;n que se
-est&aacute; buscando deja el punto despu&eacute;s del &uacute;ltimo car&aacute;cter
-emparejado. Esto significa que una sucesi&oacute;n de palabras exitosas
-busquen que mover&aacute; el punto adelante palabra por palabra.
-</p>
-<p>Como materia pr&aacute;ctica, se quiere que la expresi&oacute;n regular se
-busque para saltar a trav&eacute;s de un espacio en blanco y punt&uacute;e entre
-palabras tan bien a trav&eacute;s de las palabras en s&iacute;. Una
-expresi&oacute;n regexp que rechaza para saltar a trav&eacute;s de espacios en
-blanco entre palabras &iexcl;nunca saltar&iacute;a m&aacute;s
-de una palabra!. Esto significa que el regexp incluir&iacute;a
-el espacio en blanco y la puntuaci&oacute;n sigue a una palabra
-cualquiera, como la palabra en s&iacute;. (Una palabra puede
-finalizar un b&uacute;ffer y no tiene cualquier espacio en blanco o
-puntuaci&oacute;n, as&iacute; esta parte del regexp debe ser
-opcional.)
-</p>
-<p>De este modo, queremos para el regexp es un patr&oacute;n definiendo una o
-m&aacute;s palabras de caracteres que constituyen caracteres seguidos,
-opcionalmente, por uno o m&aacute;s caracteres que no son palabras
-constituyentes. La expresi&oacute;n regular para esto es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">\w+\W*
-</pre></div>
-
-<p>La tabla de sintaxis del b&uacute;ffer determina qu&eacute; caracteres son y no
-son palabras constituyentes. Para m&aacute;s informaci&oacute;n acerca de
-sintaxis, see <a href="elisp.html#Tablas-de-Sintaxis">Tablas de Sintaxis</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>.
-</p>
-<p>La expresi&oacute;n se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(re-search-forward &quot;\\w+\\W*&quot;)
-</pre></div>
-
-<p>(Note que las barras invertidas que preceden el &lsquo;<samp>w</samp>&rsquo; y
-&lsquo;<samp>W</samp>&rsquo;. Una barra invertida tiene significado especial al
-int&eacute;rprete Emacs Lisp. Eso indica que el caracter siguiente es
-interpretado de manera diferente que la normal. Por ejemplo, los dos
-caracteres, &lsquo;<samp>\n</samp>&rsquo;, son una &lsquo;<samp>nueva l&iacute;nea</samp>&rsquo;, en
-vez de una barra invertida seguida por &lsquo;<samp>\n</samp>&rsquo;. Dos barras
-invertidas en una fila para una &lsquo;barra invertida no especial&rsquo;,
-as&iacute; Emacs Lisp interpreta el fin de mirar una barra
-invertida simple seguida por una letra. As&iacute; descubre la
-letra que es especial.)
-</p>
-<p>Se necesita un contador para contar cu&aacute;ntas palabras hay; esta
-variables debe primero ser asignado a 0 y entonces incrementados cada
-vez que Emacs va alrededor del bucle <code>while</code>. La expresi&oacute;n de
-incremento es simple:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq count (1+ count))
-</pre></div>
-
-<p>Finalmente, se quiere contar al usuario cu&aacute;ntas palabras hay en la
-regi&oacute;n. La funci&oacute;n <code>message</code> presenta este tipo de
-informaci&oacute;n al usuario. El mensaje tiene que ser fraseado
-de manera que se lea apropiadamente sin cuidado de cuantas palabras
-hay en la regi&oacute;n: no se quiere decir que &ldquo;hay una palabra en la
-regi&oacute;n&rdquo;. El conflicto entre singular y plural no es gramatical. Se
-puede resolver este problema usando una expresi&oacute;n condicional que
-eval&uacute;a diferentes mensajes dependiendo en el n&uacute;mero de palabras en
-la regi&oacute;n. Hay tres posibilidades: no palabras en la regi&oacute;n, una
-palabra en la regi&oacute;n, y m&aacute;s de una palabra. Esto significa que la
-forma especial <code>cond</code> es apropiada.
-</p>
-<p>Todo esto lidera a la siguiente definici&oacute;n de funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; <span class="roman">&iexcl;La Primera versi&oacute;n; tiene errores!</span>
-(defun count-words-region (beginning end)
- &quot;Imprime el n&uacute;mero de palabras en la regi&oacute;n.
-Las palabras est&aacute;n definidas al menos una palabra
-constituida de caracteres seguido por al menos un
-caracter que no constituye palabra. La tabla de
-sintaxis del b&uacute;ffer determina qu&eacute; caracteres hay.&quot;
- (interactive &quot;r&quot;)
- (message &quot;Contando palaras en la regi&oacute;n ... &quot;)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">1. Configurar condiciones apropiadas.</span>
- (save-excursion
- (goto-char beginning)
- (let ((count 0))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">2. Ejecutar el</span> <span class="roman">bucle</span> while.
- (while (&lt; (point) end)
- (re-search-forward &quot;\\w+\\W*&quot;)
- (setq count (1+ count)))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">3. Enviar un mensaje al usuario.</span>
- (cond ((zerop count)
- (message
- &quot;La regi&oacute;n no tiene palabras.&quot;))
- ((= 1 count)
- (message
- &quot;La regi&oacute;n tiene 1 palabra.&quot;))
- (t
- (message
- &quot;La regi&oacute;n tiene %d palabras.&quot; count))))))
-</pre></div>
-
-<p>Como se escribe, la funci&oacute;n funciona, pero no en todas las circunstancias.
-</p>
-<hr>
-<a name="Error-de-espacio-en-blanco"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Contando-palabras" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Dise_00f1ar-count_002dwords_002dexample" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#count_002dwords_002dexample" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#recursive_002dcount_002dwords" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-error-de-espacio-en-blanco-en-count_002dwords_002dexample"></a>
-<h3 class="subsection">13.1.1 El error de espacio en blanco en <code>count-words-example</code></h3>
-
-<p>El comando <code>count-words-example</code> descrito en la secci&oacute;n
-precedente tiene dos errores, o incluso, un error con dos
-manifestaciones. Primero, si se marca una regi&oacute;n conteniendo solo
-espacio en blanco en el medio de alg&uacute;n texto el comando
-&iexcl;<code>count-words-example</code> cuenta que la regi&oacute;n
-contiene una palabra!. Segundo, si se marca una regi&oacute;n conteniendo
-solo espacios en blanco al final del b&uacute;ffer o la porci&oacute;n accesible
-de un b&uacute;ffer encogido, el comando muestra un mensaje de error que se
-parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">B&uacute;squeda fallida: &quot;\\w+\\W*&quot;
-</pre></div>
-
-<p>Si est&aacute; leyendo esto en Info en GNU Emacs, se puede testear para
-estos errores por s&iacute; mismo.
-</p>
-<p>Primero, eval&uacute;a la funci&oacute;n de la manera usual para instalarlo.
-</p>
-<p>Si se desea, se puede tambi&eacute;n instalar este atajo para ser evaluado:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(global-set-key &quot;\C-c=&quot; 'count-words-example)
-</pre></div>
-
-<p>Para conducir el primer test, asigna marca y punto al principio y fin
-de la siguiente l&iacute;nea y entonces escribe <kbd>C-c =</kbd> (o
-<kbd>M-x count-words-example</kbd> si no se ha asignado <kbd>C-c =</kbd>):
-</p>
-<div class="smallexample">
-<pre class="smallexample"> uno dos tres
-</pre></div>
-
-<p>Emacs te contar&aacute;, correctamente, que la regi&oacute;n tiene tres palabras.
-</p>
-<p>Repite el test, pero marca el lugar al principio de la
-l&iacute;nea y emplaza el punto justo <em>antes</em> de la
-palabra &lsquo;<samp>uno</samp>&rsquo;. De nuevo escribe el comando <kbd>C-c =</kbd> (o
-<kbd>M-x count-words-example</kbd>). Emacs cuenta que la regi&oacute;n no tiene
-palabras, puesto que eso est&aacute; compuesto solo por espacios en blanco
-al principio de la l&iacute;nea. &iexcl;Pero en vez de
-que Emacs cuente que la regi&oacute;n tiene una palabra!
-</p>
-<p>Para el tercer test, copia la l&iacute;nea de ejemplo al fin
-del b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; y entonces escribe varios espacios al fin
-de la l&iacute;nea. Posiciona la marca correcta despu&eacute;s de la
-palabra &lsquo;<samp>tres</samp>&rsquo; y apunta al fin de la l&iacute;nea. (El fin
-de la l&iacute;nea ser&aacute; el fin del b&uacute;ffer.) Escribe <kbd>C-c
-=</kbd> (o <kbd>M-x count-words-example</kbd>) como se hizo antes. De nuevo,
-Emacs te contar&iacute;a que la regi&oacute;n no tiene palabras,
-puesto que eso est&aacute; compuesto solo de los espacios en blanco al fin
-de la l&iacute;nea. En vez de eso, Emacs muestra un mensaje de
-error diciendo &lsquo;<samp>B&uacute;squeda fallida</samp>&rsquo;.
-</p>
-<p>Los dos errores queman el mismo problema.
-</p>
-<p>Considere la primera manifestaci&oacute;n del error, en el que el comando
-te cuenta que el espacio en blanco al principio de la
-l&iacute;nea contiene una palabra. Lo que ocurre es esto: El
-comando <code>M-x count-words-example</code> mueve el punto al principio de
-la regi&oacute;n. El test <code>while</code> si el valor del punto es m&aacute;s
-peque&ntilde;o de lo que el valor de <code>end</code>, que es. Por consiguiente,
-en la expresi&oacute;n regular se busca y encuentra la primera palabra. Eso
-deja el punto despu&eacute;s de la palabra. <code>count</code> que se establece a
-uno. El bucle <code>while</code> repite; pero esta vez el valor del punto es
-m&aacute;s largo que el valor de <code>end</code>, el bucle sale; y la funci&oacute;n
-muestra un mensaje diciendo el n&uacute;mero de palabras en la regi&oacute;n es
-uno. En breve, la expresi&oacute;n regular busca y encuentra la palabra
-incluso aunque eso est&eacute; fuera de la regi&oacute;n marcada.
-</p>
-<p>En la segunda manifestaci&oacute;n del error, la regi&oacute;n es un espacio en
-blanco al fin del b&uacute;ffer. Emacs dice &lsquo;<samp>B&uacute;squeda fallida</samp>&rsquo;. Lo
-que ocurre es que true-or-false-test en el bucle <code>while</code> chequea
-verdad, as&iacute; la expresi&oacute;n de b&uacute;squeda es
-ejecutada. Pero desde que no hay m&aacute;s palabras en el buffer, la
-b&uacute;squeda falla.
-</p>
-<p>En ambas manifestaciones del error, la b&uacute;squeda extiende o intenta
-extenderse fuera de la regi&oacute;n.
-</p>
-<p>La soluci&oacute;n es limitar la b&uacute;squeda a la regi&oacute;n &mdash; esto es una
-acci&oacute;n simple y limpia, pero como tu puedes tener que llegar a
-esperar, eso no es tan simple como se podr&iacute;a pensar.
-</p>
-<p>Como se ha visto, la funci&oacute;n <code>re-search-forward</code> toma un
-patr&oacute;n de b&uacute;squeda como su primer argumento. Pero adem&aacute;s de este
-primer, argumento obligatorio, se aceptan tres argumentos
-opcionales. El segundo argumento opcional asocia la b&uacute;squeda. El
-tercer argumento opcional, si <code>t</code>, causa la funci&oacute;n a devolver
-<code>nil</code> en vez de la se&ntilde;al un error si la b&uacute;squeda falla. El
-cuarto argumento opcional es un contador repetido. (En Emacs, se puede
-ver una documentaci&oacute;n de la funci&oacute;n escribiendo <kbd>C-h f</kbd>, el
-nombre de la funci&oacute;n, y entonces &lt;RET&gt;.)
-</p>
-<p>En la definici&oacute;n <code>count-words-example</code>, el valor del fin de la
-regi&oacute;n es tomada por la variable <code>end</code> que es pasada como un
-argumento para la funci&oacute;n. De este modo, se puede a&ntilde;adir
-<code>end</code> como un argumento para la b&uacute;squeda de la expresi&oacute;n de
-b&uacute;squeda:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(re-search-forward &quot;\\w+\\W*&quot; fin)
-</pre></div>
-
-<p>Sin embargo, si se crea solo este cambio a la definici&oacute;n
-<code>count-words-example</code> y entonces se chequea la nueva versi&oacute;n de
-la definici&oacute;n en una extensi&oacute;n de espacio en blanco, se recibir&aacute;
-un mensaje de error diciendo &lsquo;<samp>B&uacute;squeda fallida</samp>&rsquo;.
-</p>
-<p>Lo que ocurre es esto: la b&uacute;squeda se limita a la regi&oacute;n, y
-falla como se espera porque no hay caracteres de palabras
-constituyentes en la regi&oacute;n. Puesto que eso falla, se recibe un
-mensaje de error. Pero no queremos recibir un mensaje de error en este
-caso; se quiere recibir el mensaje que &quot;La regi&oacute;n no tiene palabras&quot;.
-</p>
-<p>La soluci&oacute;n a este problema es proveer <code>re-search-forward</code> con
-un tercer argumento de <code>t</code>, que causa la funci&oacute;n para devolver
-<code>nil</code> en vez la se&ntilde;alar un error si la b&uacute;squeda falla.
-</p>
-<p>Sin embargo, si se crea este cambio y se intenta, se ver&aacute; el mensaje
-&ldquo;Contando palabras en la regi&oacute;n ...&rdquo; y &hellip; se guardar&aacute;
-viendo qu&eacute; mensaje &hellip;, hasta que se escribe <kbd>C-g</kbd>
-(<code>keyboard-quit</code>).
-</p>
-<p>Aqu&iacute; est&aacute; lo que ocurre: la b&uacute;squeda est&aacute; limitada
-a la regi&oacute;n, como antes, y eso falla porque no hay caracteres no
-constituyentes de palabras en la regi&oacute;n, como se
-espera. Por tanto, la expresi&oacute;n <code>re-search-forward</code>
-devuelve <code>nil</code>. Eso no hace nada m&aacute;s. En particular, no mueve
-el punto, que hace como un efecto lateral si se encuentra la
-b&uacute;squeda objetiva. Despu&eacute;s la expresi&oacute;n <code>re-search-forward</code>
-devuelve <code>nil</code>, la siguiente expresi&oacute;n en el bucle <code>while</code>
-est&aacute; evaluado. Esta expresi&oacute;n incrementa el contador. Entonces el
-bucle repite. El test true-or-false-test chequea cierto porque el
-valor del punto es todav&iacute;a menor que el valor final,
-desde que la expresi&oacute;n <code>re-search-forward</code> no
-mover&iacute;a el punto. &hellip; y el ciclo repite &hellip;
-</p>
-<p>La definici&oacute;n <code>count-words-example</code> requiere
-todav&iacute;a de otra modificaci&oacute;n para causar el
-true-or-false-test del bucle <code>while</code> para chequear falso si la
-b&uacute;squeda falla. Pon otro camino, hay dos condiciones que deben ser
-satisfechas en el true-or-false-test antes que el contador de palabras
-variable se incremente: el punto debe todav&iacute;a estar con la
-regi&oacute;n y la expresi&#324; de b&uacute;squeda debe haber encontrado una
-palabra para contar.
-</p>
-<p>Por ambas la primera condici&oacute;n y la segunda condici&oacute;n deben ser
-ciertas juntas, las dos expresiones, la regi&oacute;n chequea y la
-expresi&oacute;n de b&uacute;squeda, puede estar unido con una forma especial
-<code>and</code> y embebido en el bucle <code>while</code> como el
-true-or-false-test, como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(and (&lt; (point) end) (re-search-forward &quot;\\w+\\W*&quot; end t))
-</pre></div>
-
-
-<p>La expresi&oacute;n <code>re-search-forward</code> devuelve <code>t</code> si la
-b&uacute;squeda es exitosa y como efecto lateral se mueve el
-punto. Consiguientemente, como las palabras se encuentran, el punto es
-movido a trav&eacute;s de la regi&oacute;n. Cuando la b&uacute;squeda de la expresi&oacute;n
-falla para encontrar otra palabra, o cuando el punto logra el fin de
-la regi&oacute;n, el test true-or-false-test es falso, el bucle <code>while</code>
-existe, y la funci&oacute;n <code>count-words-example</code> muestra uno u otro de
-sus mensajes.
-</p>
-<p>Despu&eacute;s de incorporar estos cambios finales, el
-<code>count-words-example</code> funciona sin errores (&iexcl;o al
-menos, sin los errores que yo haya encontrado!. Aqu&iacute; est&aacute;
-lo que parece:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; <span class="roman">Versi&oacute;n final:</span> <code>while</code>
-(defun count-words-example (beginning end)
- &quot;Imprime n&uacute;mero de palabras en la regi&oacute;n.&quot;
- (interactive &quot;r&quot;)
- (message &quot;Contando palabras en la regi&oacute;n ... &quot;)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">1. Configura condiciones apropiadas.</span>
- (save-excursion
- (let ((count 0))
- (goto-char beginning)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">2. Ejecuta el</span> <span class="roman">bucle</span> while
- (while (and (&lt; (point) end)
- (re-search-forward &quot;\\w+\\W*&quot; end t))
- (setq count (1+ count)))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">3. Enviar un mensaje al usuario.</span>
- (cond ((zerop count)
- (message
- &quot;La regi&oacute;n no tiene palabras.&quot;))
- ((= 1 count)
- (message
- &quot;La regi&oacute;n tiene 1 palabra.&quot;))
- (t
- (message
- &quot;La regi&oacute;n tiene %d palabras.&quot; count))))))
-</pre></div>
-
-<hr>
-<a name="recursive_002dcount_002dwords"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Contando-palabras" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Error-de-espacio-en-blanco" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-de-Contar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Cuenta-palabras-recursivamente"></a>
-<h2 class="section">13.2 Cuenta palabras recursivamente</h2>
-<a name="index-Cuenta-palabras-recursivamente"></a>
-<a name="index-Recursivamente-contando-palabras"></a>
-<a name="index-Palabras_002c-contadas-recursivamente"></a>
-
-<p>Se puede escribir la funci&oacute;n para contar palabras tanto de manera
-recursiva como con un bucle <code>while</code>. Permita ver c&oacute;mo se
-hace.
-</p>
-<p>Primero, se necesita reconocer que la funci&oacute;n
-<code>count-words-example</code> tiene tres trabajos: eso configura las
-condiciones apropiadas para contar lo que ocurre; eso cuenta las
-palabras en la regi&oacute;n; y env&iacute;a un mensaje al usuario
-contando cu&aacute;ntas palabras hay.
-</p>
-<p>Si se escribe una funci&oacute;n recursiva simple para hacer cualquier cosa
-se recibir&aacute; un mensaje para cada llamada recursiva. Si la regi&oacute;n
-contiene 13 palabras, se recibir&aacute;n trece mensajes, uno correcto
-despu&eacute;s del otro. &iexcl;No queremos esto!. En vez de eso,
-se deben escribir dos funciones para hacer el trabajo, una (la
-funci&oacute;n recursiva) ser&aacute; usada dentro de la otra. Una funci&oacute;n
-configurar&aacute; las condiciones y muestra el mensaje; la otra
-devolver&aacute; el contador de palabras.
-</p>
-<p>Perm&iacute;tase comenzar con la funci&oacute;n que causa el mensaje
-que se muestra. Se puede continuar por llamarse <code>count-words-example</code>.
-</p>
-<p>Esta es la funci&oacute;n que el usuario llama. Ser&aacute; interactiva. En
-realidad, ser&aacute; similar a nuestras versiones previas de esta
-funci&oacute;n, excepto que llamar&aacute; <code>recursive-count-words</code> para
-determinar cu&aacute;ntas palabras hay en la regi&oacute;n.
-</p>
-<p>Se puede construir una plantilla legible para esta funci&oacute;n, basada
-en versiones previas:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;; <span class="roman">Versi&oacute;n Recursiva; usa la b&uacute;squeda de la expresi&oacute;n regular</span>
-(defun count-words-example (beginning end)
- &quot;<var>documentation</var>&hellip;&quot;
- (<var>interactive-expression</var>&hellip;)
-</pre><pre class="smallexample">
-;;; <span class="roman">1. Configura condiciones apropiadas.</span>
- (<var>explanatory message</var>)
- (<var>set-up functions</var>&hellip;
-</pre><pre class="smallexample">
-;;; <span class="roman">2. Contar las palabras.</span>
- <var>recursive call</var>
-</pre><pre class="smallexample">
-;;; <span class="roman">3. Env&iacute;a un mensaje al usuario.</span>
- <var>message providing word count</var>))
-</pre></div>
-
-<p>La definici&oacute;n parece sencilla, excepto que como el contador devuelve
-la llamada recursiva que debe ser pasada al mensaje mostrando el
-contaje de palabras. Un peque&ntilde;o pensamiento sugiere que esto puede
-ser hecho haciendo uso de una expresi&oacute;n <code>let</code> al n&uacute;mero de
-palabras en la regi&oacute;n, como se devuelve por la llamada recursiva; y
-entonces la expresi&oacute;n <code>cond</code>, que usa la asociaci&oacute;n, puede
-mostrar el valor al usuario.
-</p>
-<p>Con frecuencia, uno piensa que se puede asociar una expresi&oacute;n
-<code>let</code> como algo secundario al trabajo &lsquo;primario&rsquo; de una
-funci&oacute;n. Pero en este caso, se podr&iacute;a considerar el
-trabajo &lsquo;primario&rsquo; de la funci&oacute;n, contando palabras, esto es hecho
-con la expresi&oacute;n <code>let</code>.
-</p>
-<p>Usando <code>let</code>, la definici&oacute;n de funci&oacute;n se parece a:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun count-words-example (beginning end)
- &quot;Imprime el n&uacute;mero de palabras en la regi&oacute;n.&quot;
- (interactive &quot;r&quot;)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">1. Configura condiciones apropiadas.</span>
- (message &quot;Contando palabras en la regi&oacute;n ... &quot;)
- (save-excursion
- (goto-char beginning)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">2. Contar las palabras.</span>
- (let ((count (recursive-count-words end)))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">3. Enviar un mensaje al usuario.</span>
- (cond ((zerop count)
- (message
- &quot;La regi&oacute;n no tiene palabras.&quot;))
- ((= 1 count)
- (message
- &quot;La regi&oacute;n tiene 1 palabra.&quot;))
- (t
- (message
- &quot;La regi&oacute;n tiene %d palabras.&quot; count))))))
-</pre></div>
-
-<p>Lo siguiente, que se necesita es escribir la funci&oacute;n de contaje
-recursivo.
-</p>
-<p>Una funci&oacute;n recursiva tiene al menos tres partes: el &lsquo;do-again-test&rsquo;,
-la &lsquo;next-step-expression&rsquo;, y la llamada recursiva.
-</p>
-<p>El do-again-test determina si la funci&oacute;n ser&aacute; o no llamada de
-nuevo. Puesto que estamos contando palabras en una regi&oacute;n y puede
-causar que una funci&oacute;n se mueva el punto hacia delante por cada
-palabra, el do-again-test puede chequear si el punto est&aacute;
-todav&iacute;a con la regi&oacute;n. El do-again-test
-encontrar&iacute;a el valor del punto y determina si el punto
-est&aacute; antes, en, o despu&eacute;s del valor del fin de la regi&oacute;n. Se
-puede usar la funci&oacute;n <code>point</code> para localizar el
-punto. Claramente, se debe pasar el valor del fin de la regi&oacute;n a la
-funci&oacute;n de contaje recursivo como un argumento.
-</p>
-<p>Adem&aacute;s, el do-again-test tambi&eacute;n chequea si la b&uacute;squeda
-encuentra una palabra. Si no, la funci&oacute;n no se
-llamar&iacute;a de nuevo.
-</p>
-<p>La next-step-expression cambia un valor as&iacute; que cuando
-la funci&oacute;n recursiva se supone que debe parar de llamarse
-as&iacute; misma, se para. M&aacute;s precisamente, los cambios de
-next-step-expression cambia un valor as&iacute; en el momento
-adecuado, el do-again-test para la funci&oacute;n recursiva de la llamada
-en s&iacute; de nuevo. En este caso, la next-step-expression
-puede ser la expresi&oacute;n que mueve el punto hacia adelante, palabra
-por palabra.
-</p>
-<p>La tercera parte de una funci&oacute;n recursiva es la llamada recursiva.
-</p>
-<p>En alg&uacute;n lugar, tambi&eacute;n, se necesita una parte que hace el
-&lsquo;trabajo&rsquo; de la funci&oacute;n, una parte que es el
-contaje. &iexcl;Una parte vital!
-</p>
-<p>Pero ya, tenemos un gui&oacute;n de la funci&oacute;n recursiva de contaje:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun recursive-count-words (region-end)
- &quot;<var>documentation</var>&hellip;&quot;
- <var>do-again-test</var>
- <var>next-step-expression</var>
- <var>recursive call</var>)
-</pre></div>
-
-<p>Ahora se necesita rellenar los slots. Permite comenzar con el caso
-m&aacute;s simple primero: si se apunta debajo del fin de la regi&oacute;n, no
-puede haber palabras en la regi&oacute;n, as&iacute; la funci&oacute;n
-devuelve cero. De otro modo, si la b&uacute;squeda falla no hay palabras
-para contar, as&iacute; la funci&oacute;n devolver&iacute;a cero.
-</p>
-<p>Por otro lado, si se apunta con la regi&oacute;n y la b&uacute;squeda tiene
-&eacute;xito, la funci&oacute;n se llamar&iacute;a de nuevo.
-</p>
-<p>De este modo, do-again-test se ver&iacute;a as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(and (&lt; (point) region-end)
- (re-search-forward &quot;\\w+\\W*&quot; region-end t))
-</pre></div>
-
-<p>Note que la expresi&oacute;n de b&uacute;squeda es parte del do-again-test &mdash;
-la funci&oacute;n devuelve <code>t</code> si su b&uacute;squeda tiene &eacute;xito y
-<code>nil</code> si falla. (V&eacute;ase la secci&oacute;n <a href="#Error-de-espacio-en-blanco">El Error de Espacio en Blanco en <code>count-words-example</code></a>), para una
-explicaci&oacute;n de c&oacute;mo <code>re-search-forward</code> funciona.)
-</p>
-<p>El do-again-test es el test true-or-false de una cl&aacute;usula
-<code>if</code>. Claramente si el do-again-test tiene &eacute;xito, la then-part
-de la cl&aacute;usula <code>if</code> llamar&iacute;a a la funci&oacute;n; pero
-si eso falla, la else-part devolver&iacute;a cero desde que el
-punto est&aacute; fuera de la regi&oacute;n o la b&uacute;squeda fall&oacute; porque no
-hab&iacute;a palabras a encontrar.
-</p>
-<p>Pero antes de considerar la llamada recursiva, se necesita considerar
-la next-step-expression. &iquest;Qu&eacute; es eso? De manera
-interesante, eso es la parte de la b&uacute;squeda del do-again-test.
-</p>
-<p>Adem&aacute;s para devolver <code>t</code> o <code>nil</code> para el do-again-test,
-<code>re-search-forward</code> mueve el punto hacia adelante como un efecto
-lateral de una b&uacute;squeda exitosa. Esta es la acci&oacute;n que cambia el
-valor de punto as&iacute; que la funci&oacute;n recursiva para de
-llamarse a s&iacute; misma cuando el punto complete su
-movimiento a trav&eacute;s de la regi&oacute;n. Por consiguiente, la expresi&oacute;n
-<code>re-search-forward</code> es la next-step-expression.
-</p>
-<p>En esquema, entonces, el cuerpo de la funci&oacute;n
-<code>recursive-count-words</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if <var>do-again-test-and-next-step-combined</var>
- ;; <span class="roman">then</span>
- <var>recursive-call-returning-count</var>
- ;; <span class="roman">else</span>
- <var>return-zero</var>)
-</pre></div>
-
-<p>&iquest;C&oacute;mo incorporar el mecanismo que cuenta?
-</p>
-<p>Si no est&aacute;s acostumbrado a escribir funciones recursivas, una pregunta
-como esta puede ser un problema. Pero eso puede y ser&iacute;a
-enfocado sistem&aacute;ticamente.
-</p>
-<p>Se sabe que el mecanismo de contaje ser&iacute;a asociado en
-alg&uacute;n lugar con la llamada recursiva. En vez de eso, desde que la
-next-step-expression mueve el punto hacia adelante por una palabra, y
-desde que una llamada recursiva es hecha para cada palabra, el
-mecanismo de contaje debe ser una expresi&oacute;n que a&ntilde;ade uno al valor
-devuelto por una llamada para <code>recursive-count-words</code>
-</p>
-<p>Considera varias casos:
-</p>
-<ul>
-<li>
-Si hay dos palabras en la regi&oacute;n, la funci&oacute;n devolver&aacute; un valor
-resultante de a&ntilde;adir uno al valor devuelto al contar la primera
-palabra, m&aacute;s el n&uacute;mero devuelto al contar las palabras que
-permanecen en la regi&oacute;n, que en este caso es una.
-
-</li><li>
-Si hay una palabra en la regi&oacute;n, la funci&oacute;n
-devolver&iacute;a un valor resultante de a&ntilde;adir uno al valor
-devuelto cuando eso cuenta esta palabra m&aacute;s el n&uacute;mero devuelto
-cuando eso cuenta las palabras que permanecen en la regi&oacute;n, que en
-este caso es cero.
-
-</li><li>
-Si no hay palabras en la regi&oacute;n, la funci&oacute;n
-devolver&iacute;a cero.
-</li></ul>
-
-<p>Desde el esquema se puede ver que la parte else del <code>if</code> devuelve
-cero para el caso en el que no hay palabras. Esto significa que la
-parte then del <code>if</code> debe devolver un valor resultante de a&ntilde;adir
-uno al valor devuelto desde el contaje de las palabras que permanecen.
-</p>
-<p>La expresi&oacute;n se parece a esto, donde <code>1+</code> es una funci&oacute;n que
-a&ntilde;ade uno a su argumento.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(1+ (recursive-count-words region-end))
-</pre></div>
-
-<p>La funci&oacute;n completa <code>recursive-count-words</code> entonces se
-parecer&aacute; e esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun recursive-count-words (region-end)
- &quot;<var>documentation</var>&hellip;&quot;
-
-;;; <span class="roman">1. do-again-test</span>
- (if (and (&lt; (point) region-end)
- (re-search-forward &quot;\\w+\\W*&quot; region-end t))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">2. then-part: la llamada recursiva</span>
- (1+ (recursive-count-words region-end))
-
-;;; <span class="roman">3. else-part</span>
- 0))
-</pre></div>
-
-<p>Perm&iacute;teme examinar c&oacute;mo esto funciona:
-</p>
-<p>Si no hay palabras en la regi&oacute;n, la parte else de la expresi&oacute;n
-<code>if</code> es evaluada y, por tanto, la funci&oacute;n devuelve cero.
-</p>
-<p>Si hay una palabra en la regi&oacute;n, el valor del punto es menor que el
-valor de <code>region-end</code> y la b&uacute;squeda tiene &eacute;xito. En este
-caso, el true-or-false-test de la expresi&oacute;n <code>if</code> chequea
-cierto, y la then-part de la expresi&oacute;n <code>if</code> es evaluada. La
-expresi&oacute;n de contaje se eval&uacute;a. Esta expresi&oacute;n devuelve un valor
-(que ser&aacute; el valor devuelto por la funci&oacute;n completa) que es la
-suma de uno a&ntilde;adida al valor devuelto por una llamada recursiva.
-</p>
-<p>Mientras tanto, la next-step-expression ha causado el punto para
-saltar a trav&eacute;s de la primera (y en este caso &uacute;nica) palabra en la
-regi&oacute;n. Esto significa que cuando <code>(recursive-count-words
-region-end)</code> est&aacute; evaluada una segunda vez, como un resultado de la
-llamada recursiva, el valor del punto ser&aacute; igual o mayor que el
-valor de la regi&oacute;n final. As&iacute; esta vez,
-<code>recursive-count-words</code> devolver&aacute; cero. El cero ser&aacute;
-a&ntilde;adido a uno, y la evaluaci&oacute;n original de
-<code>recursive-count-words</code> devolver&aacute; uno m&aacute;s cero (uno) que es
-la cantidad correcta.
-</p>
-<p>Claramente, si hay dos palabras en la regi&oacute;n, la primera llamada a
-<code>recursive-count-words</code> devuelve uno que se a&ntilde;ade al valor
-devuelto por el siguiente <code>recursive-count-words</code> en una regi&oacute;n
-donde est&aacute; la palabra que permanece &mdash; que es, eso a&ntilde;adir uno a
-uno, produciendo dos, que es la cantidad correcta.
-</p>
-<p>Similarmente, si hay tres palabras en la regi&oacute;n, la primera llamada
-<code>recursive-count-words</code> devuelve uno a&ntilde;adido al valor devuelto
-llamado <code>recursive-count-words</code> en una regi&oacute;n conteniendo las
-dos palabras que faltan &mdash; y as&iacute;.
-</p>
-<p>Con documentaci&oacute;n completa las dos funciones se parecen a esto:
-</p>
-<p>La funci&oacute;n recursiva:
-</p>
-<a name="index-recursive_002dcount_002dwords"></a>
-<div class="smallexample">
-<pre class="smallexample">(defun recursive-count-words (region-end)
- &quot;N&uacute;mero de palabras entre punto y REGION-END.&quot;
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">1. do-again-test</span>
- (if (and (&lt; (point) region-end)
- (re-search-forward &quot;\\w+\\W*&quot; region-end t))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">2. then-part: la llamada recursiva</span>
- (1+ (recursive-count-words region-end))
-
-;;; <span class="roman">3. else-part</span>
- 0))
-</pre></div>
-
-<p>El envoltorio:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; <span class="roman">Versi&oacute;n Recursiva</span>
-(defun count-words-example (beginning end)
- &quot;Imprime el n&uacute;mero de palabras en la regi&oacute;n.
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">Las palabras son definidas como al menos una palabra constituyente
-seguida por al menos un caracter que es una palabra constituyente. La
-tabla de sintaxis del buffer determina qu&eacute; caracter hay.
-</pre><pre class="smallexample"> (interactive &quot;r&quot;)
- (message &quot;Contando palabras en la regi&oacute;n ... &quot;)
- (save-excursion
- (goto-char beginning)
- (let ((count (recursive-count-words end)))
-</pre><pre class="smallexample"> (cond ((zerop count)
- (message
- &quot;La regi&oacute;n no tiene palabras.&quot;))
-</pre><pre class="smallexample"> ((= 1 count)
- (message &quot;La regi&oacute;n tiene 1 palabra.&quot;))
- (t
- (message
- &quot;La regi&oacute;n tiene %d palabras.&quot; count))))))
-</pre></div>
-
-<hr>
-<a name="Ejercicio-de-Contar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Contando-palabras" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#recursive_002dcount_002dwords" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-palabras" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicio_003a-contando-puntuacion"></a>
-<h2 class="section">13.3 Ejercicio: contando puntuaci&oacute;n</h2>
-
-<p>Usando un bucle <code>while</code>, escriba una funci&oacute;n para contar el
-n&uacute;mero de marcas de puntuaci&oacute;n en una regi&oacute;n &mdash; periodo, coma,
-punto y coma, dos puntos, exclamaci&oacute;n, marca y marca de
-pregunta. Haga lo mismo usando recursi&oacute;n.
-</p>
-<hr>
-<a name="Palabras-en-una-funci_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Contando-palabras" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-de-Contar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Divide-y-vencer_00e1s" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Contando-palabras-en-una-defun"></a>
-<h1 class="chapter">14 Contando palabras en una <code>defun</code></h1>
-<a name="index-Contando-palabras-en-un-defun"></a>
-<a name="index-Contando-las-palabras-en-un-defun"></a>
-
-<p>El siguiente proyecto es contar el n&uacute;mero de palabras en una
-definici&oacute;n de funci&oacute;n. Claramente, esto se puede hacer usando
-alguna variante de <code>count-words-example</code>. V&eacute;ase la secci&oacute;n <a href="#Contando-palabras">Contando palabras: repetici&oacute;n y regexps</a>. Si se est&aacute;
-ahora yendo a contar las palabras en una definici&oacute;n, es
-suficientemente f&aacute;cil marcar la definici&oacute;n con el comando
-<kbd>C-M-h</kbd> (<code>mark-defun</code>), y entonces se llama a
-<code>count-words-example</code>.
-</p>
-<p>Sin embargo, soy m&aacute;s ambicioso: Yo quiero contar las palabras y
-s&iacute;mbolos en cada definici&oacute;n en las fuentes de Emacs y
-entonces imprimir un grafo que muestre cu&aacute;ntas funciones hay de cada
-tama&ntilde;o: cu&aacute;ntas contienen de 40 a 49 palabras o
-s&iacute;mbolos, cu&aacute;ntas contienen de 50 a 59 palabras o
-s&iacute;mbolos, y as&iacute;. Yo he sido con frecuencia
-curioso de c&oacute;mo es una funci&oacute;n t&iacute;pica, y esto se
-contar&aacute;.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Divide-y-vencer_00e1s">Divide y vencer&aacute;s</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Palabras-y-S_00edmbolos">14.1 &iquest;Qu&eacute; contar?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Sintaxis">14.2 &iquest;Qu&eacute; constituye una palabra o s&iacute;mbolo?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#count_002dwords_002din_002ddefun">14.3 La funci&oacute;n <code>count-words-in-defun</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Similar a <code>count-words-example</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Varias-funciones">14.4 Contar varias <code>defuns</code> en un fichero</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Contando varias funciones en un fichero.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Encontrar-un-fichero">14.5 Encontrar un fichero</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iquest;Quieres buscar en un fichero?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#lengths_002dlist_002dfile">14.6 <code>lengths-list-file</code> en detalle</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una lista de los tama&ntilde;os de muchas
- definiciones.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Varios-ficheros">14.7 Contar palabras en <code>defuns</code> en diferentes ficheros</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Contando en definiciones en diferentes
- ficheros.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Varios-ficheros-recursivamente">14.8 Recursivamente cuenta palabras en diferentes ficheros</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Recursivamente contando en diferentes
- ficheros.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Preparar-los-datos">14.9 Preparar los datos para mostrarlos en un grafo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-</table>
-
-<hr>
-<a name="Divide-y-vencer_00e1s"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-y-S_00edmbolos" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Divide-y-venceras"></a>
-<h2 class="unnumberedsec">Divide y vencer&aacute;s</h2>
-
-<p>Descrito en una frase, el proyecto desanima; pero dividido dentro de
-numerosos peque&ntilde;os pasos, cada uno de los que podemos tomar en un
-momento, el proyecto llegar ser menos
-atemorizante. Perm&iacute;tenos considerar qu&eacute; pasos deben
-ser:
-</p>
-<ul>
-<li>
-Primero, escribe una funci&oacute;n para contar las palabras en una
-definici&oacute;n. Esto incluye el problema de manejar
-s&iacute;mbolos tan bien como palabras.
-
-</li><li>
-Segundo, escribe una funci&oacute;n para listar los n&uacute;meros de palabras
-en cada funci&oacute;n en un fichero. Esta funci&oacute;n puede usar la
-funci&oacute;n <code>count-words-in-defun</code>.
-
-</li><li>
-Tercero, escribe una funci&oacute;n para listar los n&uacute;meros de palabras
-en cada funci&oacute;n en cada uno de varios ficheros. Esto encola
-autom&aacute;ticamente encontrando varios ficheros, cambi&aacute;ndolos, y
-contando las palabras en las definiciones con ellos.
-
-</li><li>
-Cuarto, escribe una funci&oacute;n para convertir la lista de n&uacute;meros que
-nosotros creamos en tres pasos para un formulario que se ajustar&aacute;
-para imprimir un grafo.
-
-</li><li>
-Quinto, escribe una funci&oacute;n para imprimir los resultados como un grafo.
-</li></ul>
-
-<p>&iexcl;Esto es un proyecto! Pero si tomamos cada paso
-lentamente, eso no ser&aacute; dif&iacute;cil.
-</p>
-<hr>
-<a name="Palabras-y-S_00edmbolos"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Divide-y-vencer_00e1s" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Sintaxis" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="g_t_00bfQue-contar_003f"></a>
-<h2 class="section">14.1 &iquest;Qu&eacute; contar?</h2>
-<a name="index-Palabras-y-simbolos-en-defun"></a>
-
-<p>Cuando nosotros primero empezamos pensando acerca del contaje de
-palabras en una definici&oacute;n de funci&oacute;n, la primera pregunta es (o
-podr&iacute;a ser) &iquest;qu&eacute; se va a contar? Cuando
-se habla de &lsquo;palabras&rsquo; con repecto a una definici&oacute;n de funci&oacute;n
-Lisp, estamos actualmente hablando, en parte, de
-&lsquo;s&iacute;mbolos&rsquo;. Por ejemplo, la siguiente funci&oacute;n
-<code>multiply-by-seven</code> contiene los cinco s&iacute;mbolos
-<code>defun</code>, <code>multipy-by-seven</code>, <code>number</code>, <code>*</code>, y
-<code>7</code>. Adem&aacute;s, en la cadena de documentaci&oacute;n, contiene cuatro
-palabras &lsquo;<samp>Multiplicar</samp>&rsquo;, &lsquo;<samp>NUMBER</samp>&rsquo;, &lsquo;<samp>por</samp>&rsquo;, y
-&lsquo;<samp>siete</samp>&rsquo;. El s&iacute;mbolo &lsquo;<samp>n&uacute;mero</samp>&rsquo; es repetido,
-as&iacute; la definici&oacute;n contiene un total de diez palabras y
-s&iacute;mbolos.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun multiplicar-por-siete (numero)
- &quot;Multiplica NUMERO por siete.&quot;
- (* 7 numero))
-</pre></div>
-
-<p>Sin embargo, si se marca la definici&oacute;n <code>multiply-by-seven</code> con
-<kbd>C-M-h</kbd> (<code>mark-defun</code>), y entonces se llama a
-<code>count-words-example</code> dentro, se encontrar&aacute; que
-<code>count-words-example</code> &iexcl;reclama la definici&oacute;n tiene
-once palabras, no diez! &iexcl;Alguna cosa est&aacute; mal!
-</p>
-<p>El problema es doble: <code>count-words-example</code> no cuenta el &lsquo;<samp>*</samp>&rsquo;
-como una palabra, y eso cuenta el s&iacute;mbolo simple,
-<code>multiply-by-seven</code>, conteniendo tres palabras. Las conexiones
-son tratadas como si fueran espacios entre palabras en vez de
-conectores entre palabras &lsquo;<samp>multiply-by-seven</samp>&rsquo; se cuenta como si
-fuese escrito &lsquo;<samp>multiply-by-seven</samp>&rsquo;.
-</p>
-<p>La causa de esta confusi&oacute;n es la expresi&oacute;n regular que busca la
-definici&oacute;n <code>count-words-example</code> que mueve el punto hacia
-delante palabra por palabra. En la versi&oacute;n can&oacute;nica de
-<code>count-words-example</code>, el regexp es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">&quot;\\w+\\W*&quot;
-</pre></div>
-
-<p>Esta expresi&oacute;n regular es un patr&oacute;n definiendo una o m&aacute;s
-palabras constituyendo caracteres posiblemente seguidos por uno o
-m&aacute;s caracteres que no son palabras constituyentes. Esto significa
-que los &lsquo;caracteres que constituyen palabras&rsquo; nos traen la cuesti&oacute;n
-de la sintaxis, que es el valor de una secci&oacute;n en s&iacute;.
-</p>
-<hr>
-<a name="Sintaxis"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-y-S_00edmbolos" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#count_002dwords_002din_002ddefun" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="g_t_00bfQue-constituye-una-palabra-o-simbolo_003f"></a>
-<h2 class="section">14.2 &iquest;Qu&eacute; constituye una palabra o s&iacute;mbolo?</h2>
-<a name="index-Categorias-de-sintaxis-y-tablas"></a>
-
-<p>Emacs trata diferentes caracteres perteneciendo a diferentes
-<em>categor&iacute;as de sintaxis</em>. Por ejemplo, la
-expresi&oacute;n regular, &lsquo;<samp>\\w+</samp>&rsquo;, es un patr&oacute;n especificando uno o
-m&aacute;s caracteres de <em>palabras constituyentes</em>. Los caracteres de
-palabras constituyentes son miembros de una categor&iacute;a de
-sintaxis. Otras categor&iacute;a de sintaxis incluye la clase
-de caracteres de puntuaci&oacute;n, tales como el espacio en blanco o el
-caracter de tabulaci&oacute;n. (Para m&aacute;s informaci&oacute;n, ver
-<a href="emacs.html#Sintaxis">La Tabla de Sintaxis</a> in <cite>El Manual GNU Emacs</cite>, y <a href="elisp.html#Tablas-de-Sintaxis">Tablas de Sintaxis</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>.)
-</p>
-<p>Las tablas de sintaxis especifican qu&eacute; caracteres pertenecen a qu&eacute;
-categor&iacute;as. Normalmente un gui&oacute;n no est&aacute;
-especificado como un &lsquo;caracter constituido por una palabra&rsquo;. En vez de
-eso, se especific&oacute; como estando en la &lsquo;clase de caracteres que son
-parte de los nombres de s&iacute;mbolos, pero no las palabras.&rsquo;
-Esto significa que la funci&oacute;n <code>count-words-example</code> se trata del
-mismo modo que trata un espacio en blanco entre palabras, que es el
-por qu&eacute; <code>count-words-example</code> cuenta &lsquo;<samp>multiply-by-seven</samp>&rsquo;
-como tres palabras.
-</p>
-<p>Hay dos caminos para causar que Emacs cuente &lsquo;<samp>multiply-by-seven</samp>&rsquo;
-como un s&iacute;mbolo: modificar la tabla de sintaxis o
-modificar la expresi&oacute;n regular.
-</p>
-<p>Se podr&iacute;a redefinir un gui&oacute;n (<em>hyphen</em>) como un
-caracter que constituye una palabra modificando la tabla de sintaxis
-que Emacs guarda por cada modo. Esta acci&oacute;n servir&iacute;a
-nuestro prop&oacute;sito, excepto que una conexi&oacute;n es meramente el
-caracter m&aacute;s com&uacute;n con s&iacute;mbolos que no son
-t&iacute;picamente un caracter de palabra constituyente; hay
-otros, tambi&eacute;n.
-</p>
-<p>Alternativamente, se puede redefinir la expresi&oacute;n regular
-<em>regexp</em> usada en la definici&oacute;n <code>count-words</code>
-as&iacute; como incluir s&iacute;mbolos. Este
-procedimiento tiene el m&eacute;rito de la claridad, pero la tarea es un
-peque&ntilde;o truco.
-</p>
-<p>La primera parte es suficientemente simple: el patr&oacute;n debe asignarse
-&ldquo;al menos un car&aacute;cter que es una palabra o s&iacute;mbolo
-constituyente&rdquo;. De este modo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">&quot;\\(\\w\\|\\s_\\)+&quot;
-</pre></div>
-
-<p>El &lsquo;<samp>\\(</samp>&rsquo; es la primera parte del constructo que agrupa esto que
-incluye el &lsquo;<samp>\\w</samp>&rsquo; y el &lsquo;<samp>\\s_</samp>&rsquo; como alternativas, separadas
-por los &lsquo;<samp>\\|</samp>&rsquo;. El &lsquo;<samp>\\w</samp>&rsquo; asocia cualquier caracter de
-palabra constituyente y el &lsquo;<samp>\\s_</samp>&rsquo; asocia cualquier caracter que
-es parte de un nombre de s&iacute;mbolo pero no una palabra de
-caracteres constituyente. El &lsquo;<samp>+</samp>&rsquo; sigue al grupo que indica que la
-palabra o s&iacute;mbolo constituyan caracteres que deben ser
-asociados al menos por uno.
-</p>
-<p>Sin embargo, la segunda parte de regexp es m&aacute;s dif&iacute;cil
-de dise&ntilde;ar. Lo que queremos es seguir la primera parte con
-&ldquo;opcionalmente uno o m&aacute;s caracteres que no constituyen una palabra
-o s&iacute;mbolo&rdquo;. Primero, se pensaba que se
-podr&iacute;a definir esto con lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">&quot;\\(\\W\\|\\S_\\)*&quot;
-</pre></div>
-
-<p>Las may&uacute;sculas &lsquo;<samp>W</samp>&rsquo; y &lsquo;<samp>S</samp>&rsquo; asocian caracteres que <em>no</em>
-son constituyente de palabra o
-s&iacute;mbolo. Desafortunadamente, esta expresi&oacute;n asocia
-cualquier caracter que sea o no una palabra constituyente no un
-s&iacute;mbolo constituyente. &iexcl;Esto asocia
-cualquier caracter!
-</p>
-<p>Entonces se notific&oacute; que cada palabra o s&iacute;mbolo en mi
-regi&oacute;n test fu&eacute; seguida por alg&uacute;n espacio (espacio en blanco,
-tabulador, o nueva l&iacute;nea). As&iacute; yo
-intent&eacute; emplazar un patr&oacute;n para asociar uno o m&aacute;s espacios en
-blanco despu&eacute;s del patr&oacute;n para una o m&aacute;s palabras o
-s&iacute;mbolos constituyentes. Esto fall&oacute;,
-tambi&eacute;n. Palabras y s&iacute;mbolos son con frecuencia
-separados por espacios en blanco, pero en el c&oacute;digo actual los
-par&eacute;ntesis pueden seguir s&iacute;mbolos y puntuaci&oacute;n puede
-seguir las palabras. As&iacute; finalmente, se dise&ntilde;o un
-patr&oacute;n en el que la palabra o s&iacute;mbolo constituyente
-es seguido opcionalmente por caracteres que no son espacios en blanco
-y entonces son seguidos opcionalmente por espacios en blanco.
-</p>
-<p>Aqu&iacute; est&aacute; la expresi&oacute;n regular completa:
-</p>
-<div class="smallexample">
-<pre class="smallexample">&quot;\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*&quot;
-</pre></div>
-
-<hr>
-<a name="count_002dwords_002din_002ddefun"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Sintaxis" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Varias-funciones" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-count_002dwords_002din_002ddefun"></a>
-<h2 class="section">14.3 La funci&oacute;n <code>count-words-in-defun</code></h2>
-<a name="index-Contando-palabras-en-un-defun-1"></a>
-
-<p>Se ha visto que hay varios caminos para escribir una funci&oacute;n
-<code>count-word-region</code>. Para escribir un
-<code>count-words-in-defun</code>, se necesita solamente adaptar una de
-estas versiones.
-</p>
-<p>La versi&oacute;n que usa un bucle <code>while</code> es f&aacute;cil de comprender,
-as&iacute; estoy yendo a adaptar esto. Porque
-<code>count-words-in-defun</code> ser&aacute; parte de un programa m&aacute;s
-complejo, eso no necesita ser interactivo y no necesita mostrar un
-mensaje pero solo devuelve el contaje. Estas consideraciones
-simplifican la definici&oacute;n un poco.
-</p>
-<p>Por otro lado, <code>count-words-in-defun</code> ser&aacute; usado con un buffer
-que contiene definiciones de funci&oacute;n. Consiguientemente, es
-razonable preguntar que la funci&oacute;n determina si se llam&oacute; cuando el
-punto est&aacute; con una definici&oacute;n de funci&oacute;n, y eso es, para
-devolver el contaje para esta definici&oacute;n. Esto a&ntilde;ade complejidad a
-la definici&oacute;n, pero nos guarda desde la necesidad de pasar
-argumentos a la funci&oacute;n.
-</p>
-<p>Estas consideraciones nos llevan a preparar la siguiente plantilla:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun count-words-in-defun ()
- &quot;<var>documentation</var>&hellip;&quot;
- (<var>set up</var>&hellip;
- (<var>while loop</var>&hellip;)
- <var>return count</var>)
-</pre></div>
-
-<p>As&iacute;, el trabajo es rellenar los slots.
-</p>
-<p>Primero, la configuraci&oacute;n.
-</p>
-<p>Estamos presuponiendo que esta funci&oacute;n ser&aacute; llamada con un
-b&uacute;ffer conteniendo definiciones de funci&oacute;n. Apunta si ser&aacute; con
-una definici&oacute;n de funci&oacute;n o no. Para que
-<code>count-words-in-defun</code> funcione, el punto debe moverse al
-principio de la definici&oacute;n, un contador debe empezar a cero, y el
-bucle contando debe parar cuando el punto logre el fin de la definici&oacute;n.
-</p>
-<p>La funci&oacute;n <code>beginning-of-defun</code> busca atr&aacute;s para un
-delimitador de apertura tal como &lsquo;<samp>(</samp>&rsquo; al principio de una
-l&iacute;nea, y mueve el punto a esta posici&oacute;n, o sino al
-l&iacute;mite de la b&uacute;squeda. En la pr&aacute;ctica, esto significa
-que <code>beginning-of-defun</code> mueve el punto al principio de un cierre
-o definici&oacute;n de funci&oacute;n precedente, o sino al principio del buffer.
-</p>
-<p>El bucle <code>while</code> requiere un contador para guardar la traza de
-las palabras o s&iacute;mbolos siendo contados. Una expresi&oacute;n
-<code>let</code> puede ser usado para crear una variable local para este
-prop&oacute;sito, y lo asocia a un valor inicial de cero.
-</p>
-<p>La funci&oacute;n <code>end-of-defun</code> funciona como
-<code>beginning-of-defun</code> excepto que mueve el punto al fin de la
-definici&oacute;n. <code>end-of-defun</code> puede ser usado como parte de una
-expresi&oacute;n que determina la posici&oacute;n del fin de la definici&oacute;n.
-</p>
-<p>La configuraci&oacute;n para <code>count-words-in-defun</code> toma forma
-r&aacute;pidamente: primero movemos el punto al principio de la
-definici&oacute;n, entonces se crea una variable local para manejar el
-conteo, y finalmente, se graba la posici&oacute;n del fin de la
-definici&oacute;n as&iacute; el bucle <code>while</code> conocer&aacute; cuando
-parar el bucle.
-</p>
-<p>El c&oacute;digo se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(beginning-of-defun)
-(let ((count 0)
- (end (save-excursion (end-of-defun) (point))))
-</pre></div>
-
-<p>El c&oacute;digo es simple. La &uacute;nica ligera complicaci&oacute;n es
-probablemente ir al <code>end</code>: eso est&aacute; asociado a la posici&oacute;n
-del fin de la definici&oacute;n por una expresi&oacute;n <code>save-excursion</code>
-que devuelve el valor del punto despu&eacute;s de <code>end-of-defun</code>
-temporalmente se mueve al fin de la definici&oacute;n.
-</p>
-<p>La segunda parte del <code>count-words-in-defun</code>, despu&eacute;s de la
-configuraci&oacute;n, es el bucle <code>while</code>.
-</p>
-<p>El bucle debe contener una expresi&oacute;n que mueva el punto hacia
-adelante palabra por palabra y s&iacute;mbolo por
-s&iacute;mbolo, y otra expresi&oacute;n que cuente los saltos. El
-test-verdadero-o-falso para el bucle <code>while</code> chequear&iacute;a
-verdadero tan largo como el punto deber&iacute;a saltar hacia
-adelante, y falso si apunta al fin de la definici&oacute;n. Ya se ha
-redefinido la expresi&oacute;n regular para esto, as&iacute; el
-bucle es sencillo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while (and (&lt; (point) end)
- (re-search-forward
- &quot;\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*&quot; end t)
- (setq count (1+ count)))
-</pre></div>
-
-<p>La tercera parte de la definici&oacute;n devuelve el contaje de palabras y
-s&iacute;mbolos. Esta parte es la &uacute;ltima expresi&oacute;n con el
-cuerpo de la expresi&oacute;n <code>let</code>, y puede ser, muy la variable
-local <code>count</code>, que cuando se eval&uacute;a devuelve el contaje.
-</p>
-<p>Puesto junto, la definici&oacute;n <code>count-words-in-defun</code> se ve
-as&iacute;:
-</p>
-<a name="index-count_002dwords_002din_002ddefun"></a>
-<div class="smallexample">
-<pre class="smallexample">(defun count-words-in-defun ()
- &quot;Devuelve el n&uacute;mero de palabras y s&iacute;mbolos en una defun.&quot;
- (beginning-of-defun)
- (let ((count 0)
- (end (save-excursion (end-of-defun) (point))))
-</pre><pre class="smallexample"> (while
- (and (&lt; (point) end)
- (re-search-forward
- &quot;\\(\\w\\|\\s_\\)+[^ \t\n]*[ \t\n]*&quot;
- end t))
- (setq count (1+ count)))
- count))
-</pre></div>
-
-<p>&iquest;C&oacute;mo se chequea esto? La funci&oacute;n no es interactiva,
-pero es f&aacute;cil poner un envoltorio alrededor de la funci&oacute;n para
-hacerla interactiva; se puede usar casi el mismo c&oacute;digo como la
-versi&oacute;n recursiva de <code>count-words-example</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; <span class="roman">Versi&oacute;n Interactiva.</span>
-(defun count-words-defun ()
- &quot;N&uacute;mero de palabras y s&iacute;mbolos en una definici&oacute;n
- de funci&oacute;n.&quot;
- (interactive)
- (message
- &quot;Contando palabras y s&iacute;mbolos en la definici&oacute;n de funci&oacute;n ... &quot;)
-</pre><pre class="smallexample"> (let ((count (count-words-in-defun)))
- (cond
- ((zerop count)
- (message
- &quot;La definici&oacute;n NO tiene palabras o s&iacute;mbolos.&quot;))
-</pre><pre class="smallexample"> ((= 1 count)
- (message
- &quot;La definici&oacute;n tiene 1 palabra o s&iacute;mbolo.&quot;))
- (t
- (message
- &quot;La definici&oacute;n tiene %d palabras o s&iacute;mbolos.&quot; count)))))
-</pre></div>
-
-<p>Permite reutilizar <kbd>C-c =</kbd> como un atajo conveniente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(global-set-key &quot;\C-c=&quot; 'count-words-defun)
-</pre></div>
-
-<p>Ahora se puede intentar <code>count-words-defun</code>: instala ambas
-funciones <code>count-words-in-defun</code> y <code>count-words-defun</code>, y
-asigna el atajo, y entonces emplaza el cursor con la siguiente definici&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun multiply-by-seven (number)
- &quot;Multiplicar NUMBER por siete.&quot;
- (* 7 number))
- &rArr; 10
-</pre></div>
-
-<p>&iexcl;&Eacute;xito! La definici&oacute;n tiene 10 palabras y
-s&iacute;mbolos.
-</p>
-<p>El siguiente problema es contar los n&uacute;meros de palabras y
-s&iacute;mbolos en varias definiciones con un fichero simple.
-</p>
-<hr>
-<a name="Varias-funciones"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#count_002dwords_002din_002ddefun" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Encontrar-un-fichero" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Contar-varias-defuns-en-un-fichero"></a>
-<h2 class="section">14.4 Contar varias <code>defuns</code> en un fichero</h2>
-
-<p>Un fichero tal como &lsquo;<tt>simple.el</tt>&rsquo; puede tener un centenar o m&aacute;s
-definiciones de funci&oacute;n dentro. Nuestro objetivo es recoger
-estad&iacute;sticas en muchos ficheros, pero en un primer
-paso, nuestro objetivo inmediato es recoger estad&iacute;sticas
-en un fichero.
-</p>
-<p>La informaci&oacute;n ser&aacute; una serie de n&uacute;meros, cada n&uacute;mero siendo
-el tama&ntilde;o de una definici&oacute;n de funci&oacute;n. Se pueden almacenar los
-n&uacute;meros en una lista.
-</p>
-<p>Se sabe que se querr&aacute; incorporar la informaci&oacute;n considerando un
-fichero con informaci&oacute;n acerca de muchos otros ficheros; esto
-significa que la funci&oacute;n para contar el tama&ntilde;o de contaje con un
-fichero solo necesita devolver la lista de tama&ntilde;os. Eso no necesita
-y no mostrar&iacute;a mensajes.
-</p>
-<p>Los comando de contar palabras contienen una expresi&oacute;n para saltar
-el punto hacia adelante palabra por palabra y otra expresi&oacute;n para
-contar los saltos. La funci&oacute;n devuelve los tama&ntilde;os de definiciones
-que pueden ser dise&ntilde;adas para trabajar del mismo modo, con una
-expresi&oacute;n para saltar el punto hacia la definici&oacute;n por
-definici&oacute;n y otra expresi&oacute;n para construir el tama&ntilde;o de la lista.
-</p>
-<p>Esta frase del problema hace elemental escribir la definici&oacute;n de
-funci&oacute;n. Claramente, empezaremos el conteo al principio del fichero,
-as&iacute; el primer comando ser&aacute; <code>(goto-char
-(point-min))</code>. Lo siguiente, es empezar el bucle <code>while</code>; y este
-true-or-false del bucle puede ser una b&uacute;squeda de expresi&oacute;n
-regular para la siguiente definici&oacute;n de funci&oacute;n &mdash;
-as&iacute; en el momento que la b&uacute;squeda tiene &eacute;xito, el
-punto se mueve hacia adelante y entonces el cuerpo del bucle es
-evaluado. El cuerpo necesita una expresi&oacute;n que construye la lista de
-tama&ntilde;os. <code>cons</code>, la lista de construcci&oacute;n del comando, puede
-ser usado para crear la lista. Esto es casi todo lo que hay.
-</p>
-<p>Aqu&iacute; est&aacute; este fragmento de c&oacute;digo que se ve
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(goto-char (point-min))
-(while (re-search-forward &quot;^(defun&quot; nil t)
- (setq lengths-list
- (cons (count-words-in-defun) lengths-list)))
-</pre></div>
-
-<p>Dejamos fuera el mecanismo para encontrar el fichero que contiene las
-definiciones de funci&oacute;n.
-</p>
-<p>En ejemplos previos, nosotros hab&iacute;amos usado esto, el
-fichero Info, o cambiamos atr&aacute;s y adelante a alg&uacute;n otro b&uacute;ffer,
-tal como el b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo;.
-</p>
-<p>Encontrar un fichero es un nuevo proceso que no tenemos
-todav&iacute;a discutido.
-</p>
-<hr>
-<a name="Encontrar-un-fichero"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Varias-funciones" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#lengths_002dlist_002dfile" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Encontrar-un-fichero-1"></a>
-<h2 class="section">14.5 Encontrar un fichero</h2>
-<a name="index-Encontrar-un-fichero"></a>
-
-<p>Para encontrar un fichero en Emacs, se usa el comando <kbd>C-x C-f</kbd>
-(<code>find-file</code>). Este comando es casi, pero no bastante correcto
-para el problema de tama&ntilde;os.
-</p>
-<p>Permita mirar el fuente para <code>find-file</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun find-file (filename)
- &quot;Edita el fichero FILENAME.
-Cambia a un b&uacute;ffer visitando el fichero FILENAME,
-creando uno si no existe ya.&quot;
- (interactive &quot;FFind file: &quot;)
- (switch-to-buffer (find-file-noselect filename)))
-</pre></div>
-
-<p>(La versi&oacute;n m&aacute;s reciente de la definici&oacute;n de funci&oacute;n
-<code>find-file</code> permite comodines especiales para visitar m&uacute;ltiples
-ficheros; que hacen la definici&oacute;n m&aacute;s compleja y no se discutir&aacute;
-aqu&iacute;, ya que no es relevante. Se pueden ver sus fuentes
-usando <kbd>M-.</kbd> (<code>find-tag</code>) o <kbd>C-h f</kbd>
-(<code>describe-function</code>).)
-</p>
-
-<p>La definici&oacute;n que se est&aacute; mostrando posee una documentaci&oacute;n
-corta, pero completa y una especificaci&oacute;n interactiva que muestra un
-nombre de fichero cuando se usa el comando interactivamente. El cuerpo
-de la definici&oacute;n contiene dos funciones, <code>find-file-noselect</code> y
-<code>switch-to-buffer</code>.
-</p>
-<p>De acuerdo a su documentaci&oacute;n como muestra por <kbd>C-h f</kbd> (el
-comando <code>describe-function</code>), la funci&oacute;n
-<code>find-file-noselect</code> lee el fichero nombrado dentro de un
-b&uacute;ffer y devuelve el b&uacute;ffer. (Su versi&oacute;n m&aacute;s reciente incluye
-un argumento comod&iacute;n, tambi&eacute;n, as&iacute; como
-otro para leer un fichero literalmente y otro que suprime mensajes de
-aviso. Estos argumentos opcionales son irrelevantes.)
-</p>
-<p>Sin embargo, la funci&oacute;n <code>find-file-noselect</code> no selecciona el
-b&uacute;ffer en el que se pone el fichero. Emacs no cambia su atenci&oacute;n
-(o la tuya si est&aacute;s usando <code>find-file-noselect</code>) al b&uacute;ffer
-seleccionado. Esto es lo que <code>switch-to-buffer</code> hace: eso cambia
-el b&uacute;ffer al que se dirige la atenci&oacute;n de Emacs; y eso cambia el
-b&uacute;ffer mostrado en la ventana al nuevo b&uacute;ffer. Se ha discutido el
-b&uacute;ffer cambiando a otro lugar. (V&eacute;ase la secci&oacute;n <a href="#Cambiando-b_00faffers">Cambiando b&uacute;ffers</a>.)
-</p>
-<p>En este proyecto de histograma, no se necesita mostrar cada fichero en
-la pantalla como el programa determina el tama&ntilde;o de cada
-definici&oacute;n con eso. En vez de emplear <code>switch-to-buffer</code>, se
-puede trabajar con <code>set-buffer</code>, que redirige la atenci&oacute;n del
-programa de ordenador para un b&uacute;ffer diferente pero no lo muestra en
-pantalla. As&iacute; en vez llamar a <code>find-file</code> para
-hacer el trabajo, debe escribir nuestra expresi&oacute;n.
-</p>
-<p>La tarea es f&aacute;cil: usar <code>find-file-noselect</code> y <code>set-buffer</code>.
-</p>
-<hr>
-<a name="lengths_002dlist_002dfile"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Encontrar-un-fichero" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Varios-ficheros" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="lengths_002dlist_002dfile-en-detalle"></a>
-<h2 class="section">14.6 <code>lengths-list-file</code> en detalle</h2>
-
-<p>El n&uacute;cleo de la funci&oacute;n <code>lengths-list-file</code> es un bucle
-<code>while</code> conteniendo una funci&oacute;n para mover el punto hacia
-delante &lsquo;funci&oacute;n a funci&oacute;n&rsquo; y una funci&oacute;n para contar el
-n&uacute;mero de palabras y s&iacute;mbolos en cada funci&oacute;n. Este
-n&uacute;cleo debe ser rodeado por funciones que hacen otras tareas varias,
-incluyendo encontrar el fichero, y asegurando que el punto empieza al
-principio del fichero. La definici&oacute;n de la funci&oacute;n se parece a:
-<a name="index-lengths_002dlist_002dfile"></a>
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun lengths-list-file (filename)
- &quot;Devuelve la lista de tama&ntilde;os de definiciones con FILE.
-La lista devuelta es una lista de n&uacute;meros.
-Cada n&uacute;mero es el n&uacute;mero de palabras o
-s&iacute;mbolos en una definici&oacute;n.&quot;
-</pre><pre class="smallexample"> (message &quot;Trabajando en `%s' ... &quot; filename)
- (save-excursion
- (let ((buffer (find-file-noselect filename))
- (lengths-list))
- (set-buffer buffer)
- (setq buffer-read-only t)
- (widen)
- (goto-char (point-min))
- (while (re-search-forward &quot;^(defun&quot; nil t)
- (setq lengths-list
- (cons (count-words-in-defun) lengths-list)))
- (kill-buffer buffer)
- lengths-list)))
-</pre></div>
-
-<p>La funci&oacute;n pasa un argumento, el nombre del fichero en el que se
-trabajar&aacute;. Eso tiene cuatro l&iacute;neas de documentaci&oacute;n,
-pero sin especificaci&oacute;n interactiva. Para evitar la preocupaci&oacute;n
-de si se ha estropeado el programa o no, la primera
-l&iacute;nea del cuerpo es un mensaje de aviso.
-</p>
-<p>La siguiente l&iacute;nea contiene un <code>save-excursion</code> que
-devuelve a Emacs la atenci&oacute;n al actual b&uacute;ffer cuando la funci&oacute;n
-se completa. Esto es &uacute;til en caso de embeber esta funci&oacute;n en otra
-funci&oacute;n que presume que el punto restaura el b&uacute;ffer original.
-</p>
-<p>En la varlist de la expresi&oacute;n <code>let</code>, Emacs encuentra el fichero
-y ajusta la variable local <code>buffer</code> al b&uacute;ffer conteniendo el
-fichero. Al mismo tiempo, Emacs crea <code>lengths-list</code> como una
-variable local.
-</p>
-<p>Lo siguiente, Emacs cambia su atenci&oacute;n al b&uacute;ffer.
-</p>
-<p>En la siguiente l&iacute;nea, Emacs crea el b&uacute;ffer de solo
-lectura. Idealmente, esta l&iacute;nea no es necesaria. Ninguna
-de las funciones para contar palabras y s&iacute;mbolos en una
-definici&oacute;n de funci&oacute;n cambiar&iacute;a el b&uacute;ffer. Debajo,
-el b&uacute;ffer no est&aacute; yendo para ser guardado, incluso si eso fuese
-cambiado. Esta l&iacute;nea es enteramente la consecuencia
-grata, quiz&aacute;s excesiva precauci&oacute;n. La raz&oacute;n para la precauci&oacute;n
-es que esta funci&oacute;n y esta se llama a trabajar en las fuentes para
-Emacs y eso es un inconveniente si est&aacute;n inadvertidamente
-modificadas. Eso va sin decir que no se realiz&oacute; una necesidad para
-esta l&iacute;nea hasta que un experimento fu&eacute; cambiado hacia
-un lado y empez&oacute; a modificar mis ficheros de fuentes Emacs &hellip;
-</p>
-<p>Lo siguiente llama a alargar el b&uacute;ffer si eso est&aacute; encogido. Esta
-funci&oacute;n es normalmente innecesaria &mdash; Emacs crea un b&uacute;ffer fresco
-si ninguno ya existe; pero si un b&uacute;ffer est&aacute; visitando el fichero
-que ya existe que Emacs devuelve uno. En este caso, el b&uacute;ffer puede
-ser encogido y debe ser amplio. Si se quiere ser completamente &lsquo;amigo
-del usuario&rsquo;, se pondr&iacute;a en orden para guardar la
-restricci&oacute;n y la localizaci&oacute;n del punto, pero no.
-</p>
-<p>La expresi&oacute;n <code>(goto-char (point-min))</code> mueve el punto al
-principio del b&uacute;ffer.
-</p>
-<p>Entonces llega un bucle <code>while</code> en el que se devuelve el
-&lsquo;trabajo&rsquo; de la funci&oacute;n. En el bucle, Emacs determina el tama&ntilde;o de
-cada definici&oacute;n y construye una lista de tama&ntilde;os conteniendo la
-informaci&oacute;n.
-</p>
-<p>Emacs corta el b&uacute;ffer despu&eacute;s de trabajar a trav&eacute;s de eso. Esto
-es guardar espacio dentro de Emacs. Mi versi&oacute;n de GNU Emacs 19
-conten&iacute;a 300 ficheros fuente de inter&eacute;s; GNU Emacs 22
-contiene a trav&eacute;s de un millar de ficheros fuente. Otra funci&oacute;n
-aplicar&aacute; <code>lengths-list-file</code> a cada uno de los ficheros.
-</p>
-<p>Finalmente, la &uacute;ltima expresi&oacute;n con la expresi&oacute;n <code>let</code> es
-la variable <code>lengths-list</code>; su valor es devuelto como el valor de
-la funci&oacute;n completa.
-</p>
-<p>Se puede probar esta funci&oacute;n instal&aacute;ndolo en el modo
-usual. Entonces posiciona tu cursor despu&eacute;s de la siguiente
-expresi&oacute;n y escribe <kbd>C-x C-e</kbd> (<code>eval-last-sexp</code>).
-</p>
-<div class="smallexample">
-<pre class="smallexample">(lengths-list-file
- &quot;/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/debug.el&quot;)
-</pre></div>
-
-<p>(Se puede necesitar cambiar la ruta del fichero; el &uacute;nico
-aqu&iacute; es para GNU Emacs versi&oacute;n 22.1.1. Para cambiar la
-expresi&oacute;n, c&oacute;pialo al b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; y
-ed&iacute;talo.
-</p>
-<p>(Tambi&eacute;n, para ver el tama&ntilde;o completo de la lista, en vez de una
-versi&oacute;n truncada se puede tener que evaluar lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(custom-set-variables '(eval-expression-print-length nil))
-</pre></div>
-
-<p>(V&eacute;ase la secci&oacute;n <a href="#defcustom">Especificando Variables usando <code>defcustom</code></a>. Entonces eval&uacute;a la expresi&oacute;n
-<code>lengths-list-file</code>.)
-</p>
-<p>La lista de tama&ntilde;os para &lsquo;<tt>debug.el</tt>&rsquo; toma menos de un segundo
-para producirse esto en GNU Emacs 22:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(83 113 105 144 289 22 30 97 48 89 25 52 52 88 28 29 77 49 43 290 232 587)
-</pre></div>
-
-<p>(Usando mi vieja m&aacute;quina, la versi&oacute;n 19 lista tama&ntilde;os para
-&lsquo;<tt>debug.el</tt>&rsquo; que en siete segundos para producen esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(75 41 80 62 20 45 44 68 45 12 34 235)
-</pre></div>
-
-<p>(La versi&oacute;n nueva de &lsquo;<tt>debug.el</tt>&rsquo; contiene m&aacute;s defuns que la
-temprana; y mi nueva m&aacute;quina es m&aacute;s r&aacute;pida que la vieja.
-</p>
-<p>N&oacute;tese que el tama&ntilde;o de la &uacute;ltima definici&oacute;n en el fichero es
-el primero en la lista.
-</p>
-<hr>
-<a name="Varios-ficheros"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#lengths_002dlist_002dfile" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#lengths_002dlist_002dmany_002dfiles" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Contar-palabras-en-defuns-en-diferentes-ficheros"></a>
-<h2 class="section">14.7 Contar palabras en <code>defuns</code> en diferentes ficheros</h2>
-
-<p>En la secci&oacute;n previa, se creaba una funci&oacute;n que devuelve una lista
-de los tama&ntilde;os de cada definici&oacute;n en un fichero. Ahora, se quiere
-definir una funci&oacute;n para devolver una lista maestra de los tama&ntilde;os
-de las definiciones en una lista de ficheros.
-</p>
-<p>Trabajar en cada elemento de una lista de ficheros es un acto repetitivo,
-as&iacute; se puede usar un bucle <code>while</code> o recursi&oacute;n.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#lengths_002dlist_002dmany_002dfiles">Determina las longitudes de <code>defuns</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Devolver una lista de tama&ntilde;os de funciones.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#append">14.7.1 La funci&oacute;n <code>append</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Adjuntar una lista a otra.
-</td></tr>
-</table>
-
-<hr>
-<a name="lengths_002dlist_002dmany_002dfiles"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Varios-ficheros" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Varios-ficheros" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#append" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Determina-las-longitudes-de-defuns"></a>
-<h3 class="unnumberedsubsec">Determina las longitudes de <code>defuns</code></h3>
-
-<p>El dise&ntilde;o usando un bucle <code>while</code> es rutina. El argumento que
-se pasaba a la funci&oacute;n es una lista de ficheros. Como se vi&oacute;
-pronto (v&eacute;ase la secci&oacute;n <a href="#Ejemplo-de-bucle">Un bucle <code>while</code> y una lista</a>), se puede escribir un bucle
-<code>while</code> de un modo que el cuerpo del bucle es evaluado si tal
-lista contiene elementos, pero sale del bucle si la lista est&aacute;
-vac&iacute;a. Para que este dise&ntilde;o funcione, el cuerpo del
-bucle debe contener una expresi&oacute;n que ordene la lista cada vez que
-el cuerpo es evaluado, de modo que finalmente la lista est&eacute;
-vac&iacute;a. La t&eacute;cnica normal es asignar el valor de la
-lista para el valor del <small>CDR</small> de la lista cada vez que el cuerpo es
-evaluado.
-</p>
-<p>La plantilla se ve as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while <var>test-whether-list-is-empty</var>
- <var>body</var>&hellip;
- <var>set-list-to-cdr-of-list</var>)
-</pre></div>
-
-<p>Tambi&eacute;n, recu&eacute;rdanos que un bucle <code>while</code> devuelve <code>nil</code>
-(el resultado de evaluar el true-or-false-test), no el resultado de
-cualquier evaluaci&oacute;n con su cuerpo. (Las evaluaciones con el cuerpo
-del bucle son hechas para sus efectos laterales.) Sin embargo, la
-expresi&oacute;n que asigna la lista de tama&ntilde;os es parte del cuerpo &mdash; y
-que es el valor que queremos devuelto por la funci&oacute;n como un
-todo. Para hacer esto cerramos el bucle <code>while</code> con una
-expresi&oacute;n <code>let</code>, y pone en orden que el &uacute;ltimo elemento de la
-expresi&oacute;n <code>let</code> contiene el valor de lista de
-tama&ntilde;os. (V&eacute;ase la secci&oacute;n <a href="#Ejemplo-de-Incremento">El Ejemplo del Bucle con un Contador de Incremento</a>.)
-</p>
-<a name="index-lengths_002dlist_002dmany_002dfiles"></a>
-<p>Estas consideraciones lideran directamente a la funci&oacute;n en
-s&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; <span class="roman">Usar bucle <code>while</code>.</span>
-(defun lengths-list-many-files (list-of-files)
- &quot;Devuelve la lista de tama&ntilde;os de funciones en LIST-OF-FILES.&quot;
-</pre><pre class="smallexample"> (let (lengths-list)
-
-;;; <span class="roman">true-or-false-test</span>
- (while list-of-files
- (setq lengths-list
- (append
- lengths-list
-
-;;; <span class="roman">Genera una lista de tama&ntilde;os.</span>
- (lengths-list-file
- (expand-file-name (car list-of-files)))))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; <span class="roman">Crea una lista ordenada de ficheros.</span>
- (setq list-of-files (cdr list-of-files)))
-
-;;; <span class="roman">Devuelve la lista final de valores de tama&ntilde;os.</span>
- lengths-list))
-</pre></div>
-
-<p><code>expand-file-name</code> es una funci&oacute;n construida que convierte un
-nombre de fichero al absoluto, forma de nombre de ruta. La funci&oacute;n
-emplea el nombre del directorio en el que la funci&oacute;n se llama.
-</p>
-<p>De este modo, si <code>expand-file-name</code> es llamado en <code>debug.el</code>
-cuando Emacs est&aacute; visitando el directorio
-&lsquo;<tt>/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/</tt>&rsquo;
-</p>
-<div class="smallexample">
-<pre class="smallexample">debug.el
-</pre></div>
-
-<p>llega a ser
-</p>
-<div class="smallexample">
-<pre class="smallexample">/usr/local/share/emacs/22.1.1/lisp/emacs-lisp/debug.el
-</pre></div>
-
-<p>El &uacute;nico nuevo elemento de esta definici&oacute;n de funci&oacute;n es la
-todav&iacute;a no estudiada funci&oacute;n <code>append</code>, que merece
-una corta secci&oacute;n en s&iacute;.
-</p>
-<hr>
-<a name="append"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#lengths_002dlist_002dmany_002dfiles" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Varios-ficheros" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Varios-ficheros-recursivamente" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-append"></a>
-<h3 class="subsection">14.7.1 La funci&oacute;n <code>append</code></h3>
-
-<p>La funci&oacute;n <code>append</code> adjunta una lista a otra. De este modo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(append '(1 2 3 4) '(5 6 7 8))
-</pre></div>
-
-<p>produce la lista
-</p>
-<div class="smallexample">
-<pre class="smallexample">(1 2 3 4 5 6 7 8)
-</pre></div>
-
-<p>Esto es exactamente c&oacute;mo queremos adjuntar dos listas de tama&ntilde;os
-producidas por <code>lengths-list-file</code> a cualquier otra. Los
-resultados contrastan con <code>cons</code>,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cons '(1 2 3 4) '(5 6 7 8))
-</pre></div>
-
-<p>que construye una nueva lista en el que el primer argumento para
-<code>cons</code> llega a ser el primer elemento de la nueva lista:
-</p>
-<div class="smallexample">
-<pre class="smallexample">((1 2 3 4) 5 6 7 8)
-</pre></div>
-
-<hr>
-<a name="Varios-ficheros-recursivamente"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#append" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Preparar-los-datos" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Recursivamente-cuenta-palabras-en-diferentes-ficheros"></a>
-<h2 class="section">14.8 Recursivamente cuenta palabras en diferentes ficheros</h2>
-
-<p>Bajo un bucle <code>while</code>, se puede trabajar cada lista de ficheros
-con recursi&oacute;n. Una versi&oacute;n recursiva de
-<code>lengths-list-many-files</code> es corta y simple.
-</p>
-<p>La funci&oacute;n recursiva tiene las partes normales: el &lsquo;do-again-test&rsquo;,
-la &lsquo;next-step-expression&rsquo;, y la llamada recursiva. El &lsquo;do-again-test&rsquo;
-determina si la funci&oacute;n se llamar&iacute;a, que har&aacute; si la
-<code>list-of-files</code> contiene los elementos que permanecen; la
-&lsquo;next-step-expression&rsquo; resetea el <code>list-of-files</code> al <small>CDR</small> en
-s&iacute;, as&iacute; finalmente la lista ser&aacute;
-vac&iacute;a; y la llamada recursiva llama en s&iacute;
-a la lista ordenada. &iexcl;La funci&oacute;n completa est&aacute;
-ordenada por esta descripci&oacute;n!
-<a name="index-recursive_002dlengths_002dlist_002dmany_002dfiles"></a>
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun recursive-lengths-list-many-files (list-of-files)
- &quot;Devuelve la lista de tama&ntilde;os de cada defun en LIST-OF-FILES.&quot;
- (if list-of-files ; <span class="roman">do-again-test</span>
- (append
- (lengths-list-file
- (expand-file-name (car list-of-files)))
- (recursive-lengths-list-many-files
- (cdr list-of-files)))))
-</pre></div>
-
-<p>En una frase, la funci&oacute;n devuelve de tama&ntilde;os de la lista para la
-el primero de la <code>list-of-files</code> al resultado de llamarse
-as&iacute; mismo al resto de <code>list-of-files</code>.
-</p>
-<p>Aqu&iacute; hay un test
-<code>recursive-lengths-list-many-files</code>, a lo largo de los resultados
-de ejecutar <code>lengths-list-file</code> en cada uno de los ficheros
-individualmente.
-</p>
-<p>Instala <code>recursive-lengths-list-many-files</code> y
-<code>lengths-list-file</code>, si es necesario, y entonces eval&uacute;a las
-siguientes expresiones. Se puede necesitar cambiar las rutas de
-ficheros; aqu&iacute; se trabaja cuando este fichero Info
-y las fuentes de Emacs est&aacute;n localizadas en sus lugares
-personales. Para cambiar las expresiones, c&oacute;pialas al b&uacute;ffer
-&lsquo;<tt>*scratch*</tt>&rsquo;, ed&iacute;talos y entonces eval&uacute;alos.
-</p>
-<p>Los resultados son mostrados despu&eacute;s del &lsquo;<samp>&rArr;</samp>&rsquo;. (Estos
-resultados son para ficheros de Emacs versi&oacute;n 22.1.1; ficheros desde
-otras versiones de Emacs puede producir diferentes resultados.)
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cd &quot;/usr/local/share/emacs/22.1.1/&quot;)
-
-(lengths-list-file &quot;./lisp/macros.el&quot;)
- &rArr; (283 263 480 90)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(lengths-list-file &quot;./lisp/mail/mailalias.el&quot;)
- &rArr; (38 32 29 95 178 180 321 218 324)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(lengths-list-file &quot;./lisp/makesum.el&quot;)
- &rArr; (85 181)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> (recursive-lengths-list-many-files
- '(&quot;./lisp/macros.el&quot;
- &quot;./lisp/mail/mailalias.el&quot;
- &quot;./lisp/makesum.el&quot;))
- &rArr; (283 263 480 90 38 32 29 95 178 180 321 218 324 85 181)
-</pre></div>
-
-<p>La funci&oacute;n <code>recursive-lengths-list-many-files</code> produce la
-salida que queremos.
-</p>
-<p>El siguiente paso es preparar el dato en la lista para mostrarlo en un
-grafo.
-</p>
-<hr>
-<a name="Preparar-los-datos"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Varios-ficheros-recursivamente" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Datos-para-mostrar-en-detalle" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Preparar-los-datos-para-mostrarlos-en-un-grafo"></a>
-<h2 class="section">14.9 Preparar los datos para mostrarlos en un grafo</h2>
-
-<p>La funci&oacute;n <code>recursive-lengths-list-many-files</code> devuelve una
-lista de n&uacute;meros. Cada n&uacute;mero graba el tama&ntilde;o de una
-definici&oacute;n de funci&oacute;n. Lo que se necesita hacer ahora es
-transformar estos datos dentro de una lista de n&uacute;meros ajustado para
-generar un grafo. La nueva lista contar&aacute; cu&aacute;ntas definiciones de
-funciones contienen menos de 10 palabras y s&iacute;mbolos,
-cuantas contienen entre 10 y 19 palabras y s&iacute;mbolos,
-cu&aacute;ntas contienen entre 20 y 29 palabras y s&iacute;mbolos, y
-as&iacute;.
-</p>
-<p>En breve, se necesita ir a trav&eacute;s el tama&ntilde;o de la lista producida
-por la funci&oacute;n <code>recursive-lengths-list-many-files</code> y contar el
-n&uacute;mero de defuns con cada rango de tama&ntilde;os, y produce una lista de
-esto de n&uacute;meros.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Datos-para-mostrar-en-detalle">El dato para mostrar en detalle</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Datos para mostrar en detalle
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ordenando">14.9.1 Ordenando listas</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Listar-ficheros">14.9.2 Creando una lista de ficheros</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#Contando-definiciones-de-funci_00f3n">14.9.3 Contando definiciones de funci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-</table>
-
-<hr>
-<a name="Datos-para-mostrar-en-detalle"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Preparar-los-datos" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Preparar-los-datos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ordenando" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-dato-para-mostrar-en-detalle"></a>
-<h3 class="unnumberedsubsec">El dato para mostrar en detalle</h3>
-
-<p>Basado en lo que hemos hecho antes, se prevee que no
-ser&iacute;a dif&iacute;cil escribir una funci&oacute;n que
-&lsquo;<small>CDR</small>s&rsquo; bajo la lista de tama&ntilde;os, parece que cada elemento,
-determina que rango de tama&ntilde;os est&aacute; dentro, e incrementa un
-contador para este rango.
-</p>
-<p>Sin embargo, antes de empezar a escribir tal funci&oacute;n, nosotros
-considerar&iacute;amos las ventajas de ordenar los tama&ntilde;os de
-la lista primero, as&iacute; los n&uacute;meros son ordenados desde
-el m&aacute;s peque&ntilde;o al m&aacute;s largo. Primero, ordenando se har&aacute;
-f&aacute;cil contar los n&uacute;meros en cada rango, desde dos n&uacute;meros
-adyacentes ser&aacute; el mismo rango del tama&ntilde;o en rangos
-adyacentes. Segundo, inspeccionando una lista ordenada, se puede
-descubrir el n&uacute;mero mayor y menor, y esto significa determinar el
-rango de tama&ntilde;o mayor y menor que necesitar&aacute;.
-</p>
-<hr>
-<a name="Ordenando"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Datos-para-mostrar-en-detalle" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Preparar-los-datos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Listar-ficheros" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ordenando-listas"></a>
-<h3 class="subsection">14.9.1 Ordenando listas</h3>
-<a name="index-sort"></a>
-
-<p>Emacs contiene una funci&oacute;n para listas ordenadas, llamadas (como se
-podr&iacute;a adivinar) <code>sort</code>. La funci&oacute;n <code>sort</code>
-toma dos argumentos, la lista es ordenada, y un predicado que
-determina si la primera de dos elementos de lista es &ldquo;menor&rdquo; que la
-segunda.
-</p>
-<p>Como se vi&oacute; antes (v&eacute;ase la secci&oacute;n <a href="#Tipo-incorrecto-de-argumento">Usando el Tipo Incorrecto de Objeto como un Argumento</a>), un predicado es una
-funci&oacute;n que determina si alguna propiedad es verdadera o falsa. La
-funci&oacute;n <code>sort</code> reordenar&aacute; una lista de acuerdo a lo que la
-propiedad del predicado usa; esto significa que <code>sort</code> puede ser
-usado para ordenar listas no num&eacute;ricas por un criterio no num&eacute;rico
-&mdash; eso puede, por ejemplo, alfabetizar una lista.
-</p>
-<p>La funci&oacute;n <code>&lt;</code> se usa cuando se ordena una lista
-num&eacute;rica. Por ejemplo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(sort '(4 8 21 17 33 7 21 7) '&lt;)
-</pre></div>
-
-<p>produce esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(4 7 7 8 17 21 21 33)
-</pre></div>
-
-<p>(Note que en este ejemplo, ambos argumentos se citan
-as&iacute; que los s&iacute;mbolos no se eval&uacute;an
-antes de ser pasados por <code>sort</code> como argumentos.)
-</p>
-<p>Ordenando la lista devuelta por la funci&oacute;n
-<code>recursive-lengths-list-many-files</code> es honesta; eso usa la
-funci&#324; <code>&lt;</code>:
-</p>
-
-<div class="smallexample">
-<pre class="smallexample">(sort
- (recursive-lengths-list-many-files
- '(&quot;./lisp/macros.el&quot;
- &quot;./lisp/mailalias.el&quot;
- &quot;./lisp/makesum.el&quot;))
- '&lt;)
-</pre></div>
-
-<p>que produce:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(29 32 38 85 90 95 178 180 181 218 263 283 321 324 480)
-</pre></div>
-
-<p>(Note que en este ejemplo, el primer argumento para <code>sort</code> no
-est&aacute; citado, desde que la expresi&oacute;n debe ser evaluado
-as&iacute; como producir la lista que es pasada para <code>sort</code>.)
-</p>
-<hr>
-<a name="Listar-ficheros"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ordenando" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Preparar-los-datos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-definiciones-de-funci_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Creando-una-lista-de-ficheros"></a>
-<h3 class="subsection">14.9.2 Creando una lista de ficheros</h3>
-
-<p>La funci&oacute;n <code>recursive-lengths-list-many-files</code> requiere una
-lista de fichero como argumento. Para nuestros ejemplos de test, se
-construyeron tal como una lista a mano; pero el directorio fuente de
-Emacs Lisp es demasiado grande para hacer esto. As&iacute;, se
-escribir&aacute; una funci&oacute;n para hacer el trabajo. En esta funci&oacute;n,
-se usa tanto un bucle <code>while</code> como una llamada recursiva.
-</p>
-<a name="index-directory_002dfiles"></a>
-<p>En viejas versiones de GNU Emacs no hizo falta tener que escribir esta
-funci&oacute;n, puesto que todos los ficheros &lsquo;<samp>.el</samp>&rsquo; en un
-directorio. En vez de eso, se puede ser capaz de usar la funci&oacute;n
-<code>directory-files</code>, que lista los nombres de fichero que hay en un
-directorio simple.
-</p>
-<p>Sin embargo, las versiones reciente Emacs emplazan ficheros de Emacs
-Lisp en subdirectorios del directorio de alto nivel &lsquo;<tt>lisp</tt>&rsquo;. Esto
-facilita la navegaci&oacute;n. Por ejemplo, todos los ficheros de correo
-relacionados que est&aacute;n en el subdirectorio llamado &lsquo;<tt>mail</tt>&rsquo;. Pero al
-mismo tiempo, esta facilidad fuerza a crear un fichero listando la
-funci&oacute;n que desciende dentro de los subdirectorios.
-</p>
-<a name="index-files_002din_002dbelow_002ddirectory"></a>
-<p>Se puede crear esta funci&oacute;n, llamada
-<code>files-en-below-directory</code>, usando funciones familiares tales
-como <code>car</code>, <code>nthcdr</code>, y <code>substring</code> en conjunci&oacute;n con
-una funci&oacute;n existente llamada
-<code>directory-files-and-attributes</code>. Esta &uacute;ltima funci&oacute;n no solo
-listas de ficheros en un directorio, incluyendo los nombres de
-subdirectorios, pero tambi&eacute;n sus atributos.
-</p>
-<p>Para empezar nuestro objetivo: crear una funci&oacute;n que nos permita
-alimentas ficheros a <code>recursive-lengths-list-many-files</code> como una
-lista que se parece a esto (pero con m&aacute;s elementos):
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&quot;./lisp/macros.el&quot;
- &quot;./lisp/mail/rmail.el&quot;
- &quot;./lisp/makesum.el&quot;)
-</pre></div>
-
-<p>La funci&oacute;n <code>directory-files-and-attributes</code> devuelve una lista
-de listas. Cada una de las listas con la lista principal consiste de
-13 elementos. El primer elemento es una cadena que contiene el nombre
-del fichero &ndash; que, en GNU/Linux, puede ser un &lsquo;directorio fichero&rsquo;,
-que dice, un fichero con los atributos especiales de un directorio. El
-segundo elemento de la lista es <code>t</code> para un directorio, es una
-cadena para el enlace simb&oacute;lico (la cadena es el nombre enlazado), o
-<code>nil</code>.
-</p>
-<p>Por ejemplo, el primer fichero &lsquo;<samp>.el</samp>&rsquo; en el directorio es
-&lsquo;<tt>abbrev.el</tt>&rsquo;. Su nombre es
-&lsquo;<tt>/usr/local/share/emacs/22.1.1/lisp/abbrev.el</tt>&rsquo; y no es un
-directorio o un enlace simb&oacute;lico.
-</p>
-<p>Esto es c&oacute;mo <code>directory-files-and-attributes</code> lista este
-fichero y sus atributos:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&quot;abbrev.el&quot;
-nil
-1
-1000
-100
-</pre><pre class="smallexample">(20615 27034 579989 697000)
-(17905 55681 0 0)
-(20615 26327 734791 805000)
-13188
-&quot;-rw-r--r--&quot;
-</pre><pre class="smallexample">nil
-2971624
-773)
-</pre></div>
-
-<p>Por otro lado, &lsquo;<tt>mail/</tt>&rsquo; es un directorio con el directorio
-&lsquo;<tt>lisp/</tt>&rsquo;. El principio del listado se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&quot;mail&quot;
-t
-&hellip;
-)
-</pre></div>
-
-<p>(Para aprender acerca de los diferentes atributos, mira en la
-documentaci&oacute;n de <code>file-attributes</code>. Tenga en mente que la
-funci&oacute;n <code>file-attributes</code> no lista el nombre del fichero,
-as&iacute; su primer elemento es
-<code>directory-files-and-attributes</code> que es el segundo elemento.)
-</p>
-<p>Se querr&aacute;n nuestras nuevas funciones,
-<code>files-in-below-directory</code>, para listar los fichero &lsquo;<samp>.el</samp>&rsquo; en
-el directorio eso es contado para chequear, y en los directorios bajo
-este directorio.
-</p>
-<p>Esto nos da una sugesti&oacute;n de como construir
-<code>files-in-below-directory</code>: con un directorio, la funci&oacute;n
-a&ntilde;adir los nombres de ficheros &lsquo;<samp>.el</samp>&rsquo; a una lista; y si, con un
-directorio, la funci&oacute;n viene con un subdirectorio,
-ir&iacute;a dentro de este subdirectorio y repite sus acciones.
-</p>
-<p>Sin embargo, nosotros notar&iacute;amos que cada directorio
-contiene un nombre que se refiere a s&iacute; mismo, llamado
-&lsquo;<tt>.</tt>&rsquo;, (&ldquo;dot&rdquo;) y un nombre que se refiere a su directorio padre,
-llamado &lsquo;<tt>..</tt>&rsquo; (&ldquo;doble punto&rdquo;). (En &lsquo;<tt>/</tt>&rsquo;, el directorio
-ra&iacute;z, &lsquo;<tt>..</tt>&rsquo; se refiere as&iacute; mismo,
-desde que &lsquo;<tt>/</tt>&rsquo; no tiene padre.) Claramente, no que se quiere
-nuestra funci&oacute;n <code>files-in-below-directory</code> para introducir
-estos directorio, desde que ellos siempre nos lideran, directamente o
-indirectamente, al directorio actual.
-</p>
-<p>Consecuentemente, nuestra funci&oacute;n <code>files-in-below-directory</code>
-debe hacer varias tareas:
-</p>
-<ul>
-<li>
-Chequee para ver si se est&aacute; mirando en un nombre de fichero que
-finaliza en &lsquo;<samp>.el</samp>&rsquo; y si es as&iacute;, se a&ntilde;ade el nombre
-a una lista.
-
-</li><li>
-Chequee para ver si est&aacute; mirando en un nombre de fichero que es el
-nombre de un directorio; y si es as&iacute;,
-
-<ul class="no-bullet">
-<li>-
-Chequee para ver si est&aacute; mirando en &lsquo;<tt>.</tt>&rsquo; o &lsquo;<tt>..</tt>&rsquo;; y si es
-as&iacute; sal.
-
-</li><li>-
-O adem&aacute;s, ve dentro de este directorio y repite el proceso.
-</li></ul>
-</li></ul>
-
-<p>Se permite escribir una definici&oacute;n de funci&oacute;n para hacer estas
-tareas. Se usar&aacute; un bucle <code>while</code> para mover de un nombre de
-fichero a otro con un directorio chequeando lo que necesita ser hecho;
-y se usa una llamada recursiva para repetir las acciones en cada
-subdirectorio. El patr&oacute;n recursivo es &lsquo;acumular&rsquo; (v&eacute;ase la secci&oacute;n <a href="#Acumular">Patr&oacute;n recursivo: <em>accumulate</em></a>) usando <code>append</code> para
-combinar.
-</p>
-
-
-<p>Aqu&iacute; est&aacute; la funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun files-in-below-directory (directory)
- &quot;Lista los ficheros .el en DIRECTORIO y en sus subdirectorios.&quot;
- ;; Aunque la funci&oacute;n ser&aacute; usada no interactivamente,
- ;; ser&aacute; f&aacute;cil chequear si lo hacemos interactivo.
- ;; El directorio tendr&aacute; un nombre tal como
- ;; &quot;/usr/local/share/emacs/22.1.1/lisp/&quot;
- (interactive &quot;DNombre del Directorio: &quot;)
-</pre><pre class="smallexample"> (let (el-files-list
- (current-directory-list
- (directory-files-and-attributes directory t)))
- ;; mientras estamos en el directorio actual
- (while current-directory-list
-</pre><pre class="smallexample"> (cond
- ;; chequee para ver si el nombre del fichero finaliza en `.el'
- ;; y si es as&iacute;, a&ntilde;ade su nombre a una lista.
- ((equal &quot;.el&quot; (substring (car (car current-directory-list)) -3))
- (setq el-files-list
- (cons (car (car current-directory-list)) el-files-list)))
-</pre><pre class="smallexample"> ;; chequee si el nombre del fichero es un directorio
- ((eq t (car (cdr (car current-directory-list))))
- ;; decide si salir o hacer recursi&oacute;n
- (if
- (equal &quot;.&quot;
- (substring (car (car current-directory-list)) -1))
- ;; entonces no hagas nada puesto que el nombre del fichero es
- ;; el actual directorio o padre, &quot;.&quot; o &quot;..&quot;
- ()
-</pre><pre class="smallexample"> ;; else desciende dentro del directorio y repite el proceso
- (setq el-files-list
- (append
- (files-in-below-directory
- (car (car current-directory-list)))
- el-files-list)))))
- ;; mueve al siguiente fichero en la lista; esto tambi&eacute;n
- ;; ordena la lista as&iacute; mientras el bucle
- ;; eventualmente llega a un fin
- (setq current-directory-list (cdr current-directory-list)))
- ;; devuelve los ficheros
- el-files-list))
-</pre></div>
-
-
-<p>Las funciones <code>files-in-below-directory</code> <code>directory-files</code>
-toma un argumento, el nombre de un directorio.
-</p>
-<p>De este modo, en mi sistema,
-</p>
-
-<div class="smallexample">
-<pre class="smallexample">(length
- (files-in-below-directory &quot;/usr/local/share/emacs/22.1.1/lisp/&quot;))
-</pre></div>
-
-<p>se cuenta que dentro y debajo de mi directorio de fuentes Lisp hay
-1031 ficheros &lsquo;<samp>.el</samp>&rsquo;
-</p>
-<p><code>files-in-below-directory</code> devuelve una lista en orden
-alfab&eacute;tico inverso. Una expresi&oacute;n para ordenar la lista en orden
-que parece como este:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(sort
- (files-in-below-directory &quot;/usr/local/share/emacs/22.1.1/lisp/&quot;)
- 'string-lessp)
-</pre></div>
-
-
-<hr>
-<a name="Contando-definiciones-de-funci_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Listar-ficheros" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Preparar-los-datos" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Contando-definiciones-de-funcion"></a>
-<h3 class="subsection">14.9.3 Contando definiciones de funci&oacute;n</h3>
-
-<p>Nuestro objetivo inmediato es generar una lista que cuenta, cuantas
-definiciones de funciones contienen menos de 10 palabras y
-s&iacute;mbolos, cuantas contienen entre 10 y 19 palabras y
-s&iacute;mbolos, cuantas contienen entre 20 y 29 palabras y
-s&iacute;mbolos, y as&iacute;.
-</p>
-<p>Con una lista ordenada de n&uacute;meros, es f&aacute;cil: se cuentan cuantos
-elementos de la lista son m&aacute;s peque&ntilde;os de 10, entonces, se
-devuelven los n&uacute;meros contados, se cuenta cuantos son m&aacute;s
-peque&ntilde;os de 20, entonces se devuelven los n&uacute;meros contados,
-despu&eacute;s se cuentan los que son m&aacute;s peque&ntilde;os de 30, y
-as&iacute;. Cada uno de los n&uacute;meros, 10, 20, 30, 40, y como,
-es m&aacute;s grande que el tope de este rango. Se puede llamar a la lista
-de tales n&uacute;meros, la lista <code>top-of-ranges</code>.
-</p>
-<p>Si se desea, se podr&iacute;a generar esta lista
-autom&aacute;ticamente, pero es m&aacute;s simple escribir una lista
-manualmente. Aqu&iacute; est&aacute;:
-<a name="index-top_002dof_002dranges"></a>
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defvar top-of-ranges
- '(10 20 30 40 50
- 60 70 80 90 100
- 110 120 130 140 150
- 160 170 180 190 200
- 210 220 230 240 250
- 260 270 280 290 300)
- &quot;Listar especificando rangos para `defuns-per-range'.&quot;)
-</pre></div>
-
-<p>Para cambiar los rangos, se edita esta lista.
-</p>
-<p>Lo siguiente, que se necesita es escribir la funci&oacute;n que crea la
-lista del n&uacute;mero de definiciones con cada rango. Claramente, esta
-funci&oacute;n debe tomar el <code>sorted-lengths</code> y las listas
-<code>top-of-ranges</code> listas como argumentos.
-</p>
-<p>La funci&oacute;n <code>defuns-per-range</code> debe hacer dos cosas una y otra
-vez: eso debe contar el n&uacute;mero de definiciones con un rango
-espec&iacute;fico por el actual valor top-of-range; y eso debe
-dividir al siguiente gran valor en la lista <code>top-of-ranges</code>
-despu&eacute;s de contar el n&uacute;mero de definiciones en el rango
-actual. Desde que cada una de estas acciones es repetitiva, se puede
-usar los bucles <code>while</code> para el trabajo. Un bucle cuenta el
-n&uacute;mero de definiciones en el rango definido por el valor actual
-top-of-range, y el otro bucle selecciona cada uno de los valores
-top-of-range en turno.
-</p>
-<p>Varias entradas de la lista <code>sorted-lengths</code> se cuentan para
-cada rango; esto significa que el bucle para la lista
-<code>sorted-lengths</code> ser&aacute; dentro del bucle para la lista
-<code>top-of-ranges</code>, como un peque&ntilde;o adorno dentro de un gran adorno.
-</p>
-<p>El bucle interno cuenta el n&uacute;mero de definiciones con el rango. Eso
-es un simple contaje del tipo en el que se ha visto
-antes. (V&eacute;ase la secci&oacute;n <a href="#Incrementando-el-Bucle">Un bucle con un contador de incremento</a>). El test true-or-false del bucle chequea si el valor
-desde la lista <code>sorted-lengths</code> es m&aacute;s peque&ntilde;a que el actual
-valor de lo alto del rango. Si es as&iacute;, la funci&oacute;n
-incrementa el contador y se chequea el siguiente valor desde la lista
-<code>sorted-lengths</code>.
-</p>
-<p>El bucle interno se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while <var>length-element-smaller-than-top-of-range</var>
- (setq number-within-range (1+ number-within-range))
- (setq sorted-lengths (cdr sorted-lengths)))
-</pre></div>
-
-<p>El bucle de fuera debe empezar con el valor m&aacute;s bajo de la lista
-<code>top-of-ranges</code>, y entonces se asigna a cada uno de los valores
-superiores exitosos a su vez. Esto puede ser hecho con un bucle como
-este:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while top-of-ranges
- <var>body-of-loop</var>&hellip;
- (setq top-of-ranges (cdr top-of-ranges)))
-</pre></div>
-
-<p>Se ponen juntos, los dos bucles como este:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(while top-of-ranges
-
- ;; <span class="roman">Contar el n&uacute;mero de elementos con el actual rango.</span>
- (while <var>length-element-smaller-than-top-of-range</var>
- (setq number-within-range (1+ number-within-range))
- (setq sorted-lengths (cdr sorted-lengths)))
-
- ;; <span class="roman">Mover al siguiente rango.</span>
- (setq top-of-ranges (cdr top-of-ranges)))
-</pre></div>
-
-<p>Adem&aacute;s, en cada circuito del bucle exterior, Emacs
-grabar&iacute;a el n&uacute;mero de definiciones con este rango (el
-valor de <code>number-within-range</code>) en una lista. Se puede usar
-<code>cons</code> para este prop&oacute;sito. (V&eacute;ase la secci&oacute;n <a href="#cons"><code>cons</code></a>.)
-</p>
-<p>La funci&oacute;n <code>cons</code> trabaja bien, excepto que la lista que se
-construye contendr&aacute; el n&uacute;mero de definiciones para el alto rango y
-su principio el n&uacute;mero de definiciones para el m&aacute;s bajo rango a su
-fin. Esto es porque <code>cons</code> adjunta nuevos elementos de la lista
-al principio de la lista, y desde los dos bucles que hacen c&aacute;lculos
-a trav&eacute;s de la lista de tama&ntilde;os desde lo bajo finaliza primero, el
-<code>defuns-per-range-list</code> finalizar&aacute; el primer n&uacute;mero m&aacute;s
-largo. Pero lo que se quiere es imprimir nuestro grafo con peque&ntilde;os
-valores primero y el m&aacute;s grande despu&eacute;s. La soluci&oacute;n es invertir
-el orden del <code>defuns-per-range-list</code>. Nosotros podemos hacer esto
-usando la funci&oacute;n <code>nreverse</code>, que invierte el orden de una
-lista.
-<a name="index-nreverse"></a>
-</p>
-<p>Por ejemplo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(nreverse '(1 2 3 4))
-</pre></div>
-
-<p>produce:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(4 3 2 1)
-</pre></div>
-
-<p>Note que la funci&oacute;n <code>nreverse</code> es &ldquo;destructiva&rdquo; &mdash; que es,
-cambiar la lista a la que se aplica; esto contrasta con las
-funciones <code>car</code> y <code>cdr</code>, que no son destructivas. En este
-caso, no se quiere que el original <code>defuns-per-range-list</code>,
-de manera que no hay materia que se destruya. (La funci&oacute;n
-<code>reverse</code> provee un copia inversa de una lista, dejando la lista
-original como es.)
-<a name="index-reverse"></a>
-</p>
-<p>Pon todo junto, el <code>defuns-per-range</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun defuns-per-range (sorted-lengths top-of-ranges)
- &quot;funciones de SORTED-LENGTHS en cada rango TOP-OF-RANGES.&quot;
- (let ((top-of-range (car top-of-ranges))
- (number-within-range 0)
- defuns-per-range-list)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; <span class="roman">Bucle Exterior.</span>
- (while top-of-ranges
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; <span class="roman">Bucle Interno.</span>
- (while (and
- ;; <span class="roman">Necesita el n&uacute;mero para el test num&eacute;rico.</span>
- (car sorted-lengths)
- (&lt; (car sorted-lengths) top-of-range))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; <span class="roman">Contar n&uacute;mero de definiciones con el rango actual.</span>
- (setq number-within-range (1+ number-within-range))
- (setq sorted-lengths (cdr sorted-lengths)))
-
- ;; <span class="roman">Sal del bucle interno pero permanece con el bucle externo.</span>
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> (setq defuns-per-range-list
- (cons number-within-range defuns-per-range-list))
- (setq number-within-range 0) ; <span class="roman">Resetear el contaje a cero.</span>
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; <span class="roman">Mover al siguiente rango.</span>
- (setq top-of-ranges (cdr top-of-ranges))
- ;; <span class="roman">Especifica el siguiente mejor rango de valores.</span>
- (setq top-of-range (car top-of-ranges)))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; <span class="roman">Salir del bucle externo y contar el n&uacute;mero de defuns m&aacute;s
- ;; largas que</span>
- ;; <span class="roman">el valor m&aacute;s largo del valor top-of-range.</span>
- (setq defuns-per-range-list
- (cons
- (length sorted-lengths)
- defuns-per-range-list))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; <span class="roman">Devuelve una lista del n&uacute;mero de definiciones con cada rango,</span>
- ;; <span class="roman"> del m&aacute;s peque&ntilde;o al m&aacute;s largo.</span>
- (nreverse defuns-per-range-list)))
-</pre></div>
-
-<p>La funci&oacute;n es simple excepto para una peque&ntilde;a funcionalidad. El
-test verdadero-o-falso para el bucle interno se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(and (car sorted-lengths)
- (&lt; (car sorted-lengths) top-of-range))
-</pre></div>
-
-<p>en vez de algo como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&lt; (car sorted-lengths) top-of-range)
-</pre></div>
-
-<p>El prop&oacute;sito del test es determinar si el primer &iacute;tem
-en la lista <code>sorted-lengths</code> es menor que el valor de lo mejor
-del rango.
-</p>
-<p>La versi&oacute;n simple del test trabaja bien a menos que la lista
-<code>sorted-lengths</code> tiene un valor <code>nil</code>. En este caso, la
-expresi&oacute;n <code>(car sorted-lengths)</code> devuelve <code>nil</code>. La
-funci&oacute;n <code>&lt;</code> no se puede compara un n&uacute;mero a <code>nil</code>, que
-es una lista vac&iacute;a, as&iacute; Emacs se&ntilde;ala un
-error y para la funci&oacute;n desde el intento de continuar la ejecuci&oacute;n.
-</p>
-<p>La lista <code>sorted-lengths</code> siempre llega a ser <code>nil</code> cuando
-el contador logra el fin de la lista. Esto significa que cualquier
-intento de usar la funci&oacute;n <code>defuns-per-range</code> con la versi&oacute;n
-simple del test fallar&aacute;.
-</p>
-<p>Se resuelve el problema usando <code>(car sorted-lengths)</code> en
-conjunci&oacute;n con la expresi&oacute;n <code>and</code>. La expresi&oacute;n <code>(car
-sorted-lengths)</code> devuelve un valor no <code>nil</code> tan largo como la
-lista que tiene al menos un n&uacute;mero con eso, pero devuelve <code>nil</code>
-si la lista est&aacute; vac&iacute;a. La expresi&oacute;n <code>and</code>
-primero eval&uacute;a el <code>(car sorted-lengths)</code>, y si eso es
-<code>nil</code>, devuelve falso <em>sin</em> evaluar la expresi&oacute;n <code>&lt;</code>
- y devuelve este valor como el valor de la expresi&oacute;n <code>and</code>.
-</p>
-<p>Este camino, evita un error.
-</p>
-<p>Aqu&iacute; hay un peque&ntilde;o test de la funci&oacute;n
-<code>defuns-per-range</code>. Primero, eval&uacute;a la expresi&oacute;n que ajusta
-(una resumida) lista <code>top-of-ranges</code> a la lista de valores,
-entonces eval&uacute;a la expresi&oacute;n para ajustar la lista
-<code>sorted-lengths</code>, y entonces eval&uacute;a la funci&oacute;n
-<code>defuns-per-range</code>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">;; <span class="roman">(La lista ordenada que usar&aacute; despu&eacute;s.)</span>
-(setq top-of-ranges
- '(110 120 130 140 150
- 160 170 180 190 200))
-
-(setq sorted-lengths
- '(85 86 110 116 122 129 154 176 179 200 265 300 300))
-
-(defuns-per-range sorted-lengths top-of-ranges)
-</pre></div>
-
-<p>La lista devuelta se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(2 2 2 0 0 1 0 2 0 0 4)
-</pre></div>
-
-<p>Dentro, hay dos elementos de la lista <code>sorted-lengths</code> menores de
-110, dos elementos entre 110 y 119, dos elementos entre 120 y 129 y
-as&iacute;. Hay cuatro elementos con un valor de 200 o superior.
-</p>
-<hr>
-<a name="Leyendo-un-grafo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Palabras-en-una-funci_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Contando-definiciones-de-funci_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Columnas-de-un-grafo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Leyendo-un-grafo-1"></a>
-<h1 class="chapter">15 Leyendo un grafo</h1>
-<a name="index-Leyendo-un-grafo"></a>
-<a name="index-Grafo-prototipo"></a>
-<a name="index-Prototipo-de-grafo"></a>
-<a name="index-Cuerpo-de-grafo"></a>
-
-<p>Nuestro objetivo es construir un grafo mostrando los n&uacute;meros de
-definiciones de funci&oacute;n de varios tama&ntilde;os en las fuentes de Emacs lisp.
-</p>
-<p>Como una materia pr&aacute;ctica, si se estuviese creando un grafo,
-probablemente usar&iacute;as un programa tal como
-<code>gnuplot</code> para hacer el trabajo. (<code>gnuplot</code> est&aacute; bien
-integrado dentro de GNU Emacs.) En este caso, sin embargo, creamos uno
-desde cero, y en el proceso lo reconstruimos nosotros mismos con algo de
-lo que se aprende antes y as&iacute; poder aprender m&aacute;s.
-</p>
-<p>En este cap&iacute;tulo, primero se escribe un grafo simple
-imprimiendo la funci&oacute;n. Esta primera definici&oacute;n ser&aacute; un
-<em>prototipo</em>, una funci&oacute;n escrita r&aacute;pidamente nos permite
-reconocer este territorio de crear un grafo. Se descubren dragones, o
-resulta que son mitos. Despu&eacute;s de olisquear el terreno, nos
-sentiremos m&aacute;s confidentes y mejoraremos la funci&oacute;n para etiquetar
-las coordenadas autom&aacute;ticamente.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Columnas-de-un-grafo">Imprimiendo las columnas de un grafo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Columnas de un grafo
-</td></tr>
-<tr><td align="left" valign="top"><a href="#graph_002dbody_002dprint">15.1 La funci&oacute;n <code>graph-body-print</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo imprimir el cuerpo de un grafo.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#recursive_002dgraph_002dbody_002dprint">15.2 La funci&oacute;n <code>recursive-graph-body-print</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> recursive-graph-body-print
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejes-Impresos">15.3 Necesidad para ejes impresos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejes Impresos
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicio-de-L_00ednea-de-Grafo">15.4 Ejercicio</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejercicio de
- L&iacute;nea de Grafo
-</td></tr>
-</table>
-
-<hr>
-<a name="Columnas-de-un-grafo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#graph_002dbody_002dprint" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Imprimiendo-las-columnas-de-un-grafo"></a>
-<h2 class="unnumberedsec">Imprimiendo las columnas de un grafo</h2>
-
-<p>Puesto que Emacs est&aacute; dise&ntilde;ado para ser flexible y trabajar con
-todo tipo de terminales, incluyendo los terminales de caracteres, el
-grafo necesitar&aacute; ser hecho desde s&iacute;mbolos de
-&lsquo;escritura&rsquo;. Un asterisco har&aacute;; como nosotros mejoramos la funci&oacute;n
-de impresi&oacute;n del grafo, se puede crear la elecci&oacute;n del
-s&iacute;mbolo como una opci&oacute;n de usuario.
-</p>
-<p>Se puede llamar a esta funci&oacute;n <code>graph-body-print</code>; se tomar&aacute;
-un <code>numbers-list</code> como su &uacute;nico argumento. En esta fase, no se
-etiquetar&aacute; el grafo, pero se imprime su cuerpo.
-</p>
-<p>La funci&oacute;n <code>graph-body-print</code> inserta una columna vertical de
-asteriscos para cada elemento en la lista <code>numbers-list</code>. La
-altura de cada l&iacute;nea est&aacute; determinada por el valor de
-este elemento de la <code>numbers-list</code>.
-</p>
-<p>Insertar columnas es un acto repetitivo; que significa que esta
-funci&oacute;n debe ser escrita con un bucle <code>while</code> o
-recursivamente.
-</p>
-<p>Nuestro primer reto es descubrir como imprimir una columna de
-asteriscos. Normalmente, en Emacs, se imprimen caracteres dentro de
-una pantalla horizontalmente, l&iacute;nea a
-l&iacute;nea, escribiendo. Se tienen dos rutas que se pueden
-seguir: escribir nuestra funci&oacute;n column-insertion o descubrir si una
-que exista en Emacs.
-</p>
-<p>Para ver si hay uno en Emacs, se puede usar el comando <kbd>M-x
-apropos</kbd>. Este comando es como el comando <kbd>C-h a</kbd>
-(<code>command-apropos</code>), excepto que &uacute;ltimo encuentra solo estas
-funciones que son comandos. El comando <kbd>M-x apropos</kbd> lista todos
-los s&iacute;mbolos que se asocian a una expresi&oacute;n regular,
-incluyendo funciones que no son interactivas.
-<a name="index-apropos"></a>
-</p>
-<p>Lo que se quiere buscar es alg&uacute;n comando que imprima o inserte
-columnas. Muy probablemente, el nombre de la funci&oacute;n contendr&aacute; la
-palabra &lsquo;print&rsquo; o la palabra &lsquo;insert&rsquo; o la palabra &lsquo;column&rsquo;. Por esta
-raz&oacute;n, podemos simplemente escribir <kbd>M-x apropos RET print
-\|insert\|column RET</kbd> y se ve el resultado. En mi sistema, este comando
-toma todav&iacute;a alg&uacute;n tiempo, y entonces se produce una
-lista de 79 funciones y variables. Ahora no se tarda mucho y se
-produce una lista de 211 funciones y variables. Escaneando la lista,
-la &uacute;nica funci&oacute;n que se ve como si se pudiera hacer el trabajo que
-es <code>insert-rectangle</code>.
-</p>
-<p>En realidad, esta es la funci&oacute;n que queremos; su documentaci&oacute;n dice:
-</p>
-<div class="smallexample">
-<pre class="smallexample">insert-rectangle:
-Insertar texto de RECTANGLE con la esquina izquierda a punto
-La primera l&iacute;nea de RECTANGLE es insertada al punto
-su segunda l&iacute;nea es insertada a un punto verticalmente
-bajo el punto, etc.
-El RECTANGLE deber&iacute;a ser una lista de cadenas.
-Despu&eacute;s de este comando, la marca est&aacute; en la esquina izquierda
-superior y el punto en la esquina derecha inferior.
-</pre></div>
-
-<p>Se puede ejecutar un test r&aacute;pido, para asegurar que hace lo que se
-espera de eso.
-</p>
-<p>Aqu&iacute; est&aacute; el resultado de emplazar el cursor despu&eacute;s
-de la expresi&oacute;n <code>insert-rectangle</code> y escribiendo <kbd>C-u C-x
-C-e</kbd> (<code>eval-last-sexp</code>). La funci&oacute;n inserta las cadenas
-&lsquo;<samp>&quot;primero&quot;</samp>&rsquo;, &lsquo;<samp>&quot;segundo&quot;</samp>&rsquo;, y &lsquo;<samp>&quot;tercero&quot;</samp>&rsquo; en el
-punto. Tambi&eacute;n la funci&oacute;n devuelve <code>nil</code>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(insert-rectangle '(&quot;primero&quot; &quot;segundo&quot; &quot;tercer&quot;))primero
- segundo
- terceronil
-</pre></div>
-
-<p>De acuerdo, no se inserta el texto de la expresi&oacute;n
-<code>insert-rectangle</code> en s&iacute; dentro del b&uacute;ffer en el
-que se marca el grafo, pero se llamar&aacute; la funci&oacute;n de nuestro
-programa. Nosotros, sin embargo, tenemos que asegurar que el punto
-est&aacute; en el b&uacute;ffer en el lugar donde la funci&oacute;n
-<code>insert-rectangle</code> insertar&aacute; la columna de cadenas.
-</p>
-<p>Si se est&aacute; leyendo esto en Info, se puede ver como este trabajo
-cambia a otro b&uacute;ffer, tal como el b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo;,
-emplazando el punto a alg&uacute;n lugar en el b&uacute;ffer, se escribe
-<kbd>M-:</kbd>, despu&eacute;s se escribe la expresi&oacute;n <code>insert-rectangle</code>
-dentro del minib&uacute;ffer en la consola, y entonces se escribe
-&lt;RET&gt;. Esto causa que Emacs eval&uacute;e la expresi&oacute;n en el
-minib&uacute;ffer, pero usa como el valor del punto la posici&oacute;n del punto
-en el b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo;. (<kbd>M-:</kbd> es el atajo para
-<code>eval-expression</code>. <code>nil</code> tampoco aparece en el b&uacute;ffer
-&lsquo;<tt>*scratch*</tt>&rsquo; desde que la expresi&oacute;n se eval&uacute;a en el
-minib&uacute;ffer.)
-</p>
-<p>Se encuentra cuando hacer esto hasta el punto que finaliza al fin de
-la &uacute;ltima l&iacute;nea insertada &mdash; es decir, esta funci&oacute;n
-mueve el punto como un efecto lateral. Si se iba a repetir el comando,
-con el punto en esta posici&oacute;n, la siguiente inserci&oacute;n
-ser&iacute;a debajo y a la derecha de la inserci&oacute;n
-previa. &iexcl;Nosotros no queremos esto!. Si se est&aacute; yendo a
-crear un gr&aacute;fico de barras, las columnas necesitan estar debajo unas
-de otras.
-</p>
-<p>As&iacute; se descubre que cada ciclo del bucle <code>while</code>
-de column-inserting debe reposicionar el punto al lugar que queremos,
-y este lugar estar&aacute; arriba, no abajo, de la columna. M&aacute;s all&aacute;,
-se recuerda que cuando se imprime un grafo, no esperan todas las
-columnas para estar a la misma altura. Esto significa que el alto de
-cada columna puede estar a una altura diferente desde una
-previa. Nosotros simplemente reposicionamos el punto a la misma
-l&iacute;nea cada vez, pero movido cubriendo a la derecha &mdash; o
-quiz&aacute;s se puede &hellip;
-</p>
-<p>Estamos planeando crear las columnas de la barra gr&aacute;fica sin
-asteriscos. El n&uacute;mero de asteriscos en la columna es el n&uacute;mero
-espec&iacute;fico por el elemento actual del
-<code>numbers-list</code>. Necesitamos construir una lista de asteriscos del
-tama&ntilde;o derecho para cada llamada a <code>insert-rectangle</code>. Si esta
-lista consiste &uacute;nicamente del n&uacute;mero requerido de asteriscos,
-entonces tendremos la posici&oacute;n de punto el n&uacute;mero correcto de
-l&iacute;neas bajo la base del gr&aacute;fico para imprimirse
-correctamente. Esto podr&iacute;a ser dif&iacute;cil.
-</p>
-<p>Alternativamente, si podemos figurarnos alg&uacute;n camino para pasar
-<code>insert-rectangle</code> del mismo tama&ntilde;o cada vez, entonces podemos
-posicionar el punto en la misma l&iacute;nea cada vez, pero se
-mueve a trav&eacute;s de una columna a la derecha por cada nueva
-columna. Si hacemos esto, sin embargo, alguna de las entradas en la
-lista pasaba a <code>insert-rectangle</code> y deben ser espacios en blanco
-en vez de asteriscos. Por ejemplo, si la altura m&aacute;xima del grafo es
-5, pero la altura de la columna es 3, entonces <code>insert-rectangle</code>
-requiere un argumento que se parezca a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&quot; &quot; &quot; &quot; &quot;*&quot; &quot;*&quot; &quot;*&quot;)
-</pre></div>
-
-<p>Esta &uacute;ltima propuesta no es tan dif&iacute;cil, de hecho se
-puede determinar la altura de la columna. Hay dos caminos para
-nosotros especificar la altura de la columna: se puede arbitrariamente
-situar lo que ser&aacute;, lo que funcionar&iacute;a bien para
-gr&aacute;ficas de esta altura; o podemos buscar a trav&eacute;s de la lista de
-n&uacute;meros y usar la altura m&aacute;xima de la lista como la altura
-m&aacute;xima del grafo. Si la &uacute;ltima operaci&oacute;n fuera
-dif&iacute;cil, entonces el procedimiento formal
-ser&iacute;a f&aacute;cil, pero hay una funci&oacute;n construida en
-Emacs para determinar el m&aacute;ximo de sus argumentos. Se puede usar
-esta funci&oacute;n. La funci&oacute;n se llamaba <code>max</code> y eso devuelve el
-mayor de sus argumentos, que deben ser n&uacute;meros. De este modo, por
-ejemplo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(max 3 4 6 5 7 3)
-</pre></div>
-
-<p>devuelve 7. (Una funci&oacute;n correspondiente llamada <code>min</code> devuelve
-lo m&aacute;s peque&ntilde;o de todos sus argumentos.)
-<a name="index-max"></a>
-<a name="index-min"></a>
-</p>
-<p>Sin embargo, no podemos simplemente llama a <code>max</code> en el
-<code>numbers-list</code>; la funci&oacute;n <code>max</code> espera n&uacute;meros como sus
-argumentos, no una lista de n&uacute;meros. De este modo, la siguiente
-expresi&oacute;n,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(max '(3 4 6 5 7 3))
-</pre></div>
-
-<p>produce el siguiente mensaje error;
-</p>
-<div class="smallexample">
-<pre class="smallexample">Mal tipo de argumento: number-or-marker-p, (3 4 6 5 7 3)
-</pre></div>
-
-<a name="index-apply"></a>
-<p>Se necesita una funci&oacute;n que pasa una lista de argumentos a una
-funci&oacute;n. Esta funci&oacute;n es <code>apply</code>. Esta funci&oacute;n &lsquo;aplica&rsquo; su
-primer argumento (una funci&oacute;n) para los argumentos que permanecen,
-el &uacute;ltimo puede ser una lista.
-</p>
-<p>Por ejemplo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(apply 'max 3 4 7 3 '(4 8 5))
-</pre></div>
-
-<p>devuelve 8
-</p>
-<p>(Incidentalmente, yo no sabr&iacute;a c&oacute;mo aprender acerca de
-esta funci&oacute;n sin un libro tal como este. Eso es posible descubrir
-otras funciones, como <code>search-forward</code> o <code>insert-rectangle</code>,
-adivinando una parte de sus nombres y entonces usando
-<code>apropos</code>. Incluso aunque su base metaf&oacute;rica es clara &mdash;
-&lsquo;apply&rsquo; su primer argumento al resto &mdash; dudo que un novicio
-vendr&iacute;a con esta palabra particular usando
-<code>apropos</code> u otra ayuda. De acuerdo, podr&iacute;a ser
-incorrecto; despu&eacute;s de todo, la funci&oacute;n fu&eacute; primero llamada por
-alguien quien lo hab&iacute;a inventado.
-</p>
-<p>El segundo y subsiguientes argumentos para <code>apply</code> son
-opcionales, as&iacute; se puede usar <code>apply</code> para llamar a
-una funci&oacute;n y pasan los elementos de una lista, como este, que
-tambi&eacute;n devuelve 8:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(apply 'max '(4 8 5))
-</pre></div>
-
-<p>Este camino tard&iacute;o usar&aacute; <code>apply</code>. La funci&oacute;n
-<code>recursive-lengths-list-many-files</code> devuelve una lista de
-n&uacute;meros que se puede aplicar a <code>max</code> (se podr&iacute;a
-tambi&eacute;n aplicar <em>(hacer apply)</em> a la lista de n&uacute;meros
-ordenados; eso no importa si la lista est&aacute; o no).
-</p>
-<p>Aqu&iacute;, la operaci&oacute;n para encontrar el tama&ntilde;o m&aacute;ximo
-del grafo es este:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq max-graph-height (apply 'max numbers-list))
-</pre></div>
-
-<p>Ahora se puede devolver la pregunta de como crear una lista de cadenas
-para una columna del grafo. Cuenta la m&aacute;xima altura del grafo y el
-n&uacute;mero de asteriscos que aparecer&iacute;an en la columna, la
-funci&oacute;n devolver&aacute; una lista de cadenas para el comando a insertar
-<code>insert-rectangle</code>.
-</p>
-<p>Cada columna se realiza con asteriscos o espacios en blanco. Puesto que
-la funci&oacute;n pasa el valor del alto de la columna y el n&uacute;mero de
-asteriscos en el columna, el n&uacute;mero de espacios en blanco puede ser
-encontrado sustrayendo el n&uacute;mero de asteriscos desde lo alto de la
-columna. Dado el n&uacute;mero de espacios en blanco y el n&uacute;mero de
-asteriscos, dos bucles <code>while</code> puede ser usado para construir la
-lista:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; <span class="roman">Primera versi&oacute;n.</span>
-(defun column-of-graph (max-graph-height actual-height)
- &quot;Devuelve la lista de cadenas que una columna de un grafo.&quot;
- (let ((insert-list nil)
- (number-of-top-blanks
- (- max-graph-height actual-height)))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; <span class="roman">Llenar asteriscos.</span>
- (while (&gt; actual-height 0)
- (setq insert-list (cons &quot;*&quot; insert-list))
- (setq actual-height (1- actual-height)))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; <span class="roman">Rellena espacios en blanco.</span>
- (while (&gt; number-of-top-blanks 0)
- (setq insert-list (cons &quot; &quot; insert-list))
- (setq number-of-top-blanks
- (1- number-of-top-blanks)))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; <span class="roman">Devuelve la lista completa.</span>
- insert-list))
-</pre></div>
-
-<p>Si se instala esta funci&oacute;n y entonces eval&uacute;a la siguiente
-expresi&oacute;n se ver&aacute; que devuelve la lista como se desea:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(column-of-graph 5 3)
-</pre></div>
-
-<p>devuelve
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&quot; &quot; &quot; &quot; &quot;*&quot; &quot;*&quot; &quot;*&quot;)
-</pre></div>
-
-<p>Como est&aacute; escrito, <code>column-of-graph</code> contiene una grieta mayor:
-los s&iacute;mbolos usados para el espacio en blanco para las
-entradas marcadas en la columna son &lsquo;codificadas duras&rsquo; como un
-espacio y un asterisco. Esto est&aacute; bien para un prototipo, pero tu, u
-otro usuario, puede desear usar otros s&iacute;mbolos. Por
-ejemplo, chequeando la funci&oacute;n grafo, tu quieres usar un periodo en
-vez del espacio, asegura el punto que est&aacute; siendo reposicionando
-apropiadamente cada vez que la funci&oacute;n <code>insert-rectangle</code> se
-llama; o se podr&iacute;a querer sustituir un signo &lsquo;<samp>+</samp>&rsquo; u
-otro s&iacute;mbolo para el asterisco. Se podr&iacute;a
-incluso querer hacer un graph-column que es m&aacute;s que un ancho de
-columna. El programa deber&iacute;a ser m&aacute;s flexible. El
-camino para hacer esto es reemplazar el espacio en blanco y el
-asterisco con dos variables que se puede llamar <code>graph-blank</code> y
-<code>graph-symbol</code> y define estas variables separadamente.
-</p>
-<p>Tambi&eacute;n la documentaci&oacute;n no est&aacute; escrita. Estas consideraciones
-nos llevan tambi&eacute;n a la segunda versi&oacute;n de la funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defvar graph-symbol &quot;*&quot;
- &quot;Cadena usada como s&iacute;mbolo en grafo, normalmente un asterisco.&quot;)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(defvar graph-blank &quot; &quot;
- &quot;La cadena como un espacio en blanco en grafo, normalmente un
- espacio en blanco.
-graph-blank debe ser el mismo n&uacute;mero de columnas amplio como graph-symbol.&quot;)
-</pre></div>
-
-<p>(Para una explicaci&oacute;n de <code>defvar</code>, ver <a href="#defvar">Inicializando una Variable con <code>defvar</code></a>.)
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; <span class="roman">Segunda versi&oacute;n.</span>
-(defun column-of-graph (max-graph-height actual-height)
- &quot;Devuelve cadenas MAX-GRAPH-HEIGHT; ACTUAL-HEIGHT son
- s&iacute;mbolos de grafos.
-
-</pre><pre class="smallexample">Los graph-symbols son entradas contiguo al fin de la lista.
-La lista ser&aacute; insertado como una columna de un grafo.
-Las cadenas son tanto graph-blank o graph-symbol.
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> (let ((insert-list nil)
- (number-of-top-blanks
- (- max-graph-height actual-height)))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; <span class="roman">Rellenar en <code>graph-symbols</code>.</span>
- (while (&gt; actual-height 0)
- (setq insert-list (cons graph-symbol insert-list))
- (setq actual-height (1- actual-height)))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> ;; <span class="roman">Rellenar en <code>graph-blanks</code>.</span>
- (while (&gt; number-of-top-blanks 0)
- (setq insert-list (cons graph-blank insert-list))
- (setq number-of-top-blanks
- (1- number-of-top-blanks)))
-
- ;; <span class="roman">Devuelve la lista completa.</span>
- insert-list))
-</pre></div>
-
-<p>Si se desea, podr&iacute;amos reescribir <code>column-of-graph</code>
-una tercera vez para proporcionar opcionalmente un gr&aacute;fico de
-l&iacute;neas, como gr&aacute;fico de barras. Esto no
-ser&iacute;a duro de hacer. Un camino para pensar en un grafo
-de l&iacute;neas es que no es m&aacute;s que un grafo de barras en
-el que la parte de cada barra que est&aacute; debajo del alto es
-blanco. Para construir una columna para gr&aacute;fico de
-l&iacute;neas, la funci&oacute;n primero construyen una lista de
-espacios en blanco que es una m&aacute;s ordenada que el valor, entonces
-usa <code>cons</code> para adjuntar un s&iacute;mbolo gr&aacute;fico a la
-lista; entonces eso usa <code>cons</code> de nuevo para adjuntar el &lsquo;alto de
-espacios en blanco&rsquo; a la lista.
-</p>
-<p>Es f&aacute;cil ver como escribir tal funci&oacute;n, pero puesto que no se
-necesita eso, no se har&aacute;. Pero el trabajo podr&iacute;a ser
-hecho, y si eso se hiciera, se har&iacute;a con
-<code>column-of-graph</code>. Incluso m&aacute;s importante, no se valora nada
-m&aacute;s que pocos cambios que tendr&iacute;an que ser hechos de
-cualquier otra manera. La mejora, que se desea hacer, es simple.
-</p>
-<p>Ahora, finalmente, volvemos a nuestra primera funci&oacute;n de grafo
-impresa. Esto imprime el cuerpo de un grafo, no las etiquetas para los
-ejes horizontal y vertical, as&iacute; se puede llamar este
-<code>graph-body-print</code>.
-</p>
-<hr>
-<a name="graph_002dbody_002dprint"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Columnas-de-un-grafo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#recursive_002dgraph_002dbody_002dprint" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-graph_002dbody_002dprint"></a>
-<h2 class="section">15.1 La funci&oacute;n <code>graph-body-print</code></h2>
-<a name="index-graph_002dbody_002dprint"></a>
-
-<p>Despu&eacute;s de nuestra preparaci&oacute;n en la secci&oacute;n precedente, la
-funci&oacute;n <code>graph-body-print</code> es simple. La funci&oacute;n imprimir&aacute;
-la columna despu&eacute;s de la columna de asteriscos y espacios en blanco,
-usando los elementos de la lista de n&uacute;meros para especificar el
-n&uacute;mero de asteriscos en cada columna. Esto es un acto repetitivo,
-que significa que se puede usar un bucle <code>while</code> que decrementa o
-una funci&oacute;n recursiva para el trabajo. En esta secci&oacute;n, se
-escribir&aacute; la definici&oacute;n usando un bucle <code>while</code>.
-</p>
-<p>La funci&oacute;n <code>column-of-graph</code> requiere el alto del grafo como un
-argumento, as&iacute; se asigna y guarda esto como una variable
-local.
-</p>
-<p>Esto lidera a la siguiente plantilla para el bucle <code>while</code>
-versi&oacute;n de esta funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun graph-body-print (numbers-list)
- &quot;<var>documentation</var>&hellip;&quot;
- (let ((height &hellip;
- &hellip;))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> (while numbers-list
- <var>insert-columns-and-reposition-point</var>
- (setq numbers-list (cdr numbers-list)))))
-</pre></div>
-
-<p>Necesitamos rellenar los slots de la plantilla.
-</p>
-<p>Claramente, se puede usar la expresi&oacute;n <code>(apply 'max
-numbers-list)</code> para determinar el alto del grafo.
-</p>
-<p>El bucle <code>while</code> iterar&aacute; a trav&eacute;s de <code>numbers-list</code> un
-elemento a la vez. Como eso est&aacute; ordenado por la expresi&oacute;n
-<code>(setq numbers-list (cdr numbers-list))</code>, el <small>CAR</small> de cada
-instancia de la lista es el valor del argumento para <code>column-of-graph</code>.
-</p>
-<p>En cada ciclo del bucle <code>while</code>, la funci&oacute;n
-<code>insert-rectangle</code> inserta la lista devuelta por
-<code>column-of-graph</code>. Desde que la funci&oacute;n
-<code>insert-rectangle</code>, se necesita guardar la localizaci&oacute;n de
-punto al tiempo que el rect&aacute;ngulo se inserta, mueve atr&aacute;s a esta
-posici&oacute;n despu&eacute;s de que el rect&aacute;ngulo es insertado, y entonces
-se mueve horizontalmente al siguiente lugar desde el que
-<code>insert-rectangle</code> se llama.
-</p>
-<p>Si las columnas se insertan en un car&aacute;cter amplio, ser&aacute; si los
-espacios en blanco y asteriscos se usan, el comando de reposici&oacute;n
-es simple <code>(forward-char 1)</code>; sin embargo, el ancho de una
-columna puede ser m&aacute;s grande que uno. Esto significa que el comando
-de reposicionamiento ser&iacute;a escrito <code>(forward-char
-symbol-width)</code>. El mejor lugar para asociar la variable
-<code>symbol-width</code> al valor del width de la columna grafo est&aacute; en
-la varlist de la expresi&oacute;n <code>let</code>.
-</p>
-<p>Estas consideraciones lideran a la siguiente definici&oacute;n de funci&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun graph-body-print (numbers-list)
- &quot;Imprime un gr&aacute;fico de barras de la NUMBERS-LIST.
-La numbers-list consiste en los valores del eje Y.&quot;
-
- (let ((height (apply 'max numbers-list))
- (symbol-width (length graph-blank))
- from-position)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> (while numbers-list
- (setq from-position (point))
- (insert-rectangle
- (column-of-graph height (car numbers-list)))
- (goto-char from-position)
- (forward-char symbol-width)
-</pre><pre class="smallexample"> ;; <span class="roman">Dibuja la columna del grafo por columna.</span>
- (sit-for 0)
- (setq numbers-list (cdr numbers-list)))
-</pre><pre class="smallexample"> ;; <span class="roman">Emplaza el punto para etiquetas de ejes X.</span>
- (forward-line height)
- (insert &quot;\n&quot;)
-))
-</pre></div>
-
-<p>La expresi&oacute;n inesperada en esta funci&oacute;n es la expresi&oacute;n
-<code><span class="nolinebreak">(sit-for</span>&nbsp;0)</code> en el bucle <code>while</code>. Esta expresi&oacute;n hace que el grafo
-imprima la operaci&oacute;n m&aacute;s interesante para vigilar lo que
-ser&iacute;a de otro modo. La expresi&oacute;n causa que Emacs pare
-(sit-for 0) para un momento cero y entonces redibuje la
-pantalla. Puesto aqu&iacute;, eso causa que Emacs redibuje la
-pantalla columna por columna. Sin eso, Emacs no
-redibujar&iacute;a la pantalla hasta que la funci&oacute;n exista.
-</p>
-<p>Se puede chequear <code>graph-body-print</code> con una peque&ntilde;a lista de
-n&uacute;meros.
-</p>
-<ol>
-<li>
-Instala <code>graph-symbol</code>, <code>graph-blank</code>,
-<code>column-of-graph</code>, que est&aacute;n en
-and <code>graph-body-print</code>.
-
-</li><li>
-Copia la siguiente expresi&oacute;n:
-
-<div class="smallexample">
-<pre class="smallexample">(graph-body-print '(1 2 3 4 6 4 3 5 7 6 5 2 3))
-</pre></div>
-
-</li><li>
-Cambia al b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; y emplaza el cursor donde quiere
-que el grafo empiece.
-
-</li><li>
-Escribe <kbd>M-:</kbd> (<code>eval-expression</code>).
-
-</li><li>
-Pega la expresi&oacute;n <code>graph-body-print</code> dentro del minib&uacute;ffer con
-<kbd>C-y</kbd> (<code>yank</code>).
-
-</li><li>
-Presiona &lt;RET&gt; para evaluar la expresi&oacute;n <code>graph-body-print</code>
-</li></ol>
-
-<p>Emacs imprimir&aacute; un grafo como este:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> *
- * **
- * ****
- *** ****
- ********* *
- ************
- *************
-</pre></div>
-
-<hr>
-<a name="recursive_002dgraph_002dbody_002dprint"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#graph_002dbody_002dprint" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejes-Impresos" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-recursive_002dgraph_002dbody_002dprint"></a>
-<h2 class="section">15.2 La funci&oacute;n <code>recursive-graph-body-print</code></h2>
-<a name="index-recursive_002dgraph_002dbody_002dprint"></a>
-
-<p>La funci&oacute;n <code>graph-body-print</code> puede tambi&eacute;n ser escrito
-recursivamente. La soluci&oacute;n recursiva es dividida dentro de dos
-partes: una fuera &lsquo;wrapper&rsquo; <em>envoltorio</em> que usa una expresi&oacute;n
-<code>let</code> para determinar los valores varias variables que solo
-necesitan ser encontradas una vez, tal como la m&aacute;xima altura del
-grafo, y una funci&oacute;n dentro que es llamada recursivamente para
-imprimir el grafo.
-</p>
-<p>El &lsquo;envoltorio&rsquo; no es complicado:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun recursive-graph-body-print (numbers-list)
- &quot;Imprime un gr&aacute;fico de barras del NUMBERS-LIST.
-El numbers-list consiste en los valores del eje Y.&quot;
- (let ((height (apply 'max numbers-list))
- (symbol-width (length graph-blank))
- from-position)
- (recursive-graph-body-print-internal
- numbers-list
- height
- symbol-width)))
-</pre></div>
-
-<p>La funci&oacute;n recursiva es un poco m&aacute;s dif&iacute;cil. Eso
-tiene cuatro partes: el &lsquo;do-again-test&rsquo;, el c&oacute;digo impreso, la
-llamada recursiva, y la &lsquo;next-step-expression&rsquo;. El &lsquo;do-again-test&rsquo; es
-una expresi&oacute;n <code>when</code> determina si la <code>numbers-list</code>
-contiene cualquier elemento que permanece; si hace eso, la funci&oacute;n
-imprime una columna del grafo usando el c&oacute;digo impreso y se llama
-as&iacute; mismo de nuevo. La funci&oacute;n se llama as&iacute;
-misma de nuevo de acuerdo al valor producido por la
-&lsquo;next-step-expression&rsquo; que causa para llamar a actuar en una versi&oacute;n
-ordenada de la <code>numbers-list</code>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun recursive-graph-body-print-internal
- (numbers-list height symbol-width)
- &quot;Imprime un gr&aacute;fico de barras.
-Usado con la funci&oacute;n recursive-graph-body-print.&quot;
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> (when numbers-list
- (setq from-position (point))
- (insert-rectangle
- (column-of-graph height (car numbers-list)))
-</pre><pre class="smallexample"> (goto-char from-position)
- (forward-char symbol-width)
- (sit-for 0) ; <span class="roman">Dibuja un gr&aacute;fico columna por columna.</span>
- (recursive-graph-body-print-internal
- (cdr numbers-list) height symbol-width)))
-</pre></div>
-
-<p>Despu&eacute;s de la siguiente instalaci&oacute;n, esta expresi&oacute;n puede ser
-chequeada; aqu&iacute; hay un ejemplo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(recursive-graph-body-print '(3 2 5 6 7 5 3 4 6 4 3 2 1))
-</pre></div>
-
-<p>Aqu&iacute; est&aacute; lo que <code>recursive-graph-body-print</code> produce:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> *
- ** *
- **** *
- **** ***
- * *********
- ************
- *************
-</pre></div>
-
-<p>Cada una de estas dos funciones, <code>graph-body-print</code> o
-<code>recursive-graph-body-print</code>, crea el cuerpo de un grafo.
-</p>
-<hr>
-<a name="Ejes-Impresos"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#recursive_002dgraph_002dbody_002dprint" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-de-L_00ednea-de-Grafo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Necesidad-para-ejes-impresos"></a>
-<h2 class="section">15.3 Necesidad para ejes impresos</h2>
-
-<p>Un grafo necesita ejes impresos, as&iacute; se puede orientar a
-t&iacute; mismo. Para un proyecto do-once, eso puede ser
-razonable dibujar los ejes a mano usando el modo de emacs Picture,
-pero un grafo dibuja la funci&oacute;n que puede ser usada m&aacute;s de una vez.
-</p>
-<p>Por esta raz&oacute;n, se han escrito mejoras a la funci&oacute;n b&aacute;sica
-<code>print-graph-body</code> que autom&aacute;ticamente imprime etiquetas para
-los ejes horizontal y vertical. Puesto que la etiqueta de imprimir
-funciones no contiene mucho material nuevo, se ha emplazado su
-descripci&oacute;n en un ap&eacute;ndice V&eacute;ase la secci&oacute;n <a href="#Grafo-completo">Un Grafo con Ejes Etiquetados</a>.
-</p>
-<hr>
-<a name="Ejercicio-de-L_00ednea-de-Grafo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejes-Impresos" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicio-3"></a>
-<h2 class="section">15.4 Ejercicio</h2>
-
-<p>Escribe una versi&oacute;n de l&iacute;nea de grafo de la funciones
-de impresi&oacute;n del grafo.
-</p>
-<hr>
-<a name="Inicializaci_00f3n-de-Emacs"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Leyendo-un-grafo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicio-de-L_00ednea-de-Grafo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Configuraci_00f3n-por-defecto" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Tu-fichero-_002eemacs"></a>
-<h1 class="chapter">16 Tu fichero &lsquo;<tt>.emacs</tt>&rsquo;</h1>
-<a name="index-fichero-_002eemacs"></a>
-<a name="index-Personalizando-tu-fichero-_002eemacs"></a>
-<a name="index-Fichero-inicializacion"></a>
-
-<p>&ldquo;No te tiene que gustar Emacs para lo que te gusta&rdquo; &mdash; esto que
-parece una frase parad&oacute;jica es el secreto de GNU Emacs. En realidad,
-Emacs es una herramienta gen&eacute;rica. La mayor&iacute;a de la
-gente que usa Emacs, lo personaliza para ajustarlo a sus necesidades.
-</p>
-<p>GNU Emacs est&aacute; mayoritariamente escrito en Emacs Lisp; esto
-significa que escribiendo expresiones en Emacs Lisp se puede modificar
-o extender Emacs.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Configuraci_00f3n-por-defecto">Configuraci&oacute;n por defecto de Emacs</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Configuraci&oacute;n por defecto
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Site_002dwide-Init">16.1 Fichero de inicializaci&oacute;n site-wide</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Se puede escribir site-wide ficheros init.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#defcustom">16.2 Especificar variables usando <code>defcustom</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Emacs escribir&aacute; c&oacute;digo para ti.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Empezando-un-fichero-_002eemacs">16.3 Empieza por un fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo escribir un <code>fichero .emacs</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Texto-y-Autorelleno">16.4 Modo texto y auto relleno</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Corta l&iacute;neas autom&aacute;ticamente.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Alias-de-correo">16.5 Alias de correo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Usar abreviaciones para direcciones de correo
- electr&oacute;nico.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Indentar-modo-de-tabulaciones">16.6 Indentar modo de tabulaciones</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> No usar tabulaciones con TeX
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Crear algunos atajos de teclado personales.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Mapas-de-teclado">16.8 Mapas de teclado</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> M&aacute;s acerca de atajos de teclado.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Cargando-ficheros">16.9 Cargando ficheros</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cargar (por ej. evaluar) ficheros
- autom&aacute;ticamente.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Autocarga">16.10 Autoloading</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Crear funciones disponibles.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Extensi_00f3n-simple">16.11 Una extensi&oacute;n simple: <code>line-to-top-of-window</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Definir una funci&oacute;n; enlazarla a una tecla.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Colores-X11">16.12 Colores X11</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Colores en X.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Miscel_00e1nea">16.13 Configuraciones miscel&aacute;neas para un fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Miscel&aacute;nea
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Mode-Line">16.14 Una l&iacute;nea modificada</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo personalizar tu mode line.
-</td></tr>
-</table>
-
-<hr>
-<a name="Configuraci_00f3n-por-defecto"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Site_002dwide-Init" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Configuracion-por-defecto-de-Emacs"></a>
-<h2 class="unnumberedsec">Configuraci&oacute;n por defecto de Emacs</h2>
-
-<p>Hay quien aprecia la configuraci&oacute;n por defecto de Emacs. Despu&eacute;s
-de todo, Emacs empieza en modo C cuando se edita un fichero C, empieza
-en modo Fortran cuando se edita un fichero Fortran, y empieza en modo
-Fundamental cuando se edita un fichero no adornado. Esto tiene
-sentido, si no sabes quien est&aacute; yendo a usar
-Emacs. &iquest;Qui&eacute;n sabe lo que una persona espera hacer con
-un fichero no adornado? El modo fundamental es el modo correcto por
-defecto para tal fichero, tal como el modo C es lo correcto para
-editar c&oacute;digo C. (Suficientes lenguajes de programaci&oacute;n tienen
-sintaxis que permiten compartir funcionalidades, tal como el modo C es
-ahora proporcionado por el modo CC, la &lsquo;Colecci&oacute;n C&rsquo;.)
-</p>
-<p>Pero cuando se conoce quien est&aacute; yendo a usar Emacs &mdash; tu, tu mismo
-&ndash; entonces eso tiene sentido para personalizar Emacs.
-</p>
-<p>Por ejemplo, yo raramente quiero el modo Fundamental cuando edito un
-fichero de otro modo no distinguido; yo quiero el modo Texto. Esto es
-por lo que yo personalizo Emacs: as&iacute; eso se ajusta a
-m&iacute;.
-</p>
-<p>Se puede personalizar y extender Emacs escribiendo o adaptando un
-fichero &lsquo;<tt>~/.emacs</tt>&rsquo;. Esto es un fichero de inicializaci&oacute;n
-personal; sus contenidos, escritos en Emacs Lisp, cuentan a Emacs qu&eacute;
-hacer.<a name="DOCF14" href="#FOOT14">(14)</a>
-</p>
-<p>Un fichero &lsquo;<tt>~/.emacs</tt>&rsquo; contiene c&oacute;digo Emacs Lisp. Se puede
-escribir este c&oacute;digo por uno mismo; o se puede usar la funcionalidad
-<code>customize</code> para escribir el c&oacute;digo para ti. Se puede combinar
-tus propias expresiones y expresiones auto-escritas personalizadas en
-tu fichero &lsquo;<tt>.emacs</tt>&rsquo;.
-</p>
-<p>(Yo prefiero por m&iacute; mismo escribir mis propias
-expresiones, excepto para estas, fuentes particularmente, que se
-encuentran f&aacute;ciles de manipular usando el comando
-<code>customize</code>. Yo combino los dos m&eacute;todos.)
-</p>
-<p>La mayor&iacute;a de este cap&iacute;tulo es acerca de
-escribir expresiones por uno mismo. Eso describe un fichero
-&lsquo;<tt>.emacs</tt>&rsquo; simple; para m&aacute;s informaci&oacute;n, mira <a href="emacs.html#Fichero-de-Inicio">El Fichero de Inicio</a> in <cite>El Manual GNU Emacs</cite>, y la
-<a href="elisp.html#Fichero-de-Inicio">El Fichero de Inicio</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>.
-</p>
-<hr>
-<a name="Site_002dwide-Init"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Configuraci_00f3n-por-defecto" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#defcustom" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Fichero-de-inicializacion-site_002dwide"></a>
-<h2 class="section">16.1 Fichero de inicializaci&oacute;n site-wide</h2>
-
-<a name="index-fichero-de-inicio-default_002eel"></a>
-<a name="index-fichero-inicio-site_002dinit_002eel"></a>
-<a name="index-fichero-site_002dload_002eel"></a>
-<p>Adem&aacute;s de tu fichero de inicializaci&oacute;n personal, Emacs
-autom&aacute;ticamente carga varios ficheros de inicializaci&oacute;n amplios,
-si existen. Tienen la misma forma que tu fichero &lsquo;<tt>.emacs</tt>&rsquo;, pero
-se cargan por cualquiera.
-</p>
-<p>Dos ficheros de incializaci&oacute;n, &lsquo;<tt>site-load.el</tt>&rsquo; y
-&lsquo;<tt>site-init.el</tt>&rsquo;, est&aacute;n cargados dentro de Emacs y volcados
-<em>dumped</em> sin una versi&oacute;n dumped de Emacs se cre&oacute;, como es
-m&aacute;s com&uacute;n. (Las copias dumped de Emacs cargan m&aacute;s
-r&aacute;pidamente. Sin embargo, puesto que un fichero se carga y compila,
-un cambio no llega a ser un cambio en Emacs a menos que se cargue por
-uno mismo o se recompile Emacs. See <a href="elisp.html#Construyendo-Emacs">Construyendo Emacs</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>,
-y el fichero &lsquo;<tt>INSTALL</tt>&rsquo;)
-</p>
-<p>Los otros tres ficheros de inicializaci&oacute;n se cargan
-autom&aacute;ticamente cada vez que se inicia Emacs, si existen. Son
-&lsquo;<tt>site-start.el</tt>&rsquo;, que se carga <em>antes</em> que tu fichero
-&lsquo;<tt>.emacs</tt>&rsquo;, y &lsquo;<tt>default.el</tt>&rsquo;, y el tipo de fichero terminal, que
-se cargan <em>despu&eacute;s</em> de tu fichero &lsquo;<tt>.emacs</tt>&rsquo;.
-</p>
-<p>Las configuraciones y definiciones en tu fichero &lsquo;<tt>.emacs</tt>&rsquo;
-sobreescribir&aacute;n las configuraciones en conflicto y definiciones en
-un fichero &lsquo;<tt>site-start.el</tt>&rsquo;, si eso existe; pero las
-configuraciones y definiciones en un &lsquo;<tt>default.el</tt>&rsquo; o el tipo de
-fichero terminal sobreescribir&aacute; estos en tu fichero
-&lsquo;<tt>.emacs</tt>&rsquo;. (Se pueden prevenir interferencias desde un tipo de
-fichero terminal configurando <code>term-file-prefix</code> para
-<code>nil</code>. V&eacute;ase la secci&oacute;n <a href="#Extensi_00f3n-simple">Una extensi&oacute;n simple</a>.)
-</p>
-<p>El fichero &lsquo;<tt>INSTALL</tt>&rsquo; que viene en la distribuci&oacute;n contiene
-descripciones de los fichero &lsquo;<tt>site-init.el</tt>&rsquo; y &lsquo;<tt>site-load.el</tt>&rsquo;.
-</p>
-<p>Los ficheros &lsquo;<tt>loadup.el</tt>&rsquo;, &lsquo;<tt>startup.el</tt>&rsquo;, y &lsquo;<tt>loaddefs.el</tt>&rsquo;
-controlan la carga. Estos ficheros est&aacute;n en el directorio
-&lsquo;<tt>lisp</tt>&rsquo; de la distribuci&oacute;n Emacs y tiene valor de uso.
-</p>
-<p>El fichero &lsquo;<tt>loaddefs.el</tt>&rsquo; contiene buenas sugerencias como las que
-poner dentro de tu propio fichero &lsquo;<tt>.emacs</tt>&rsquo;, o dentro de un
-fichero de inicializaci&oacute;n amplio.
-</p>
-<hr>
-<a name="defcustom"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Site_002dwide-Init" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Empezando-un-fichero-_002eemacs" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Especificar-variables-usando-defcustom"></a>
-<h2 class="section">16.2 Especificar variables usando <code>defcustom</code></h2>
-<a name="index-defcustom"></a>
-
-<p>Se pueden especificar variables usando <code>defcustom</code>
-as&iacute; que la gente pueda usar la funcionalidad de
-Emacs <code>customize</code> para asignar sus valores. (No se puede usar
-<code>customize</code> para escribir definiciones de funci&oacute;n; pero se
-pueden escribir <code>defuns</code> en tu fichero &lsquo;<tt>.emacs</tt>&rsquo;. En vez de
-eso, se puede escribir cualquier expresi&oacute;n Lisp en tu fichero
-&lsquo;<tt>.emacs</tt>&rsquo;).
-</p>
-<p>La funcionalidad <code>customize</code> depende de la forma especial
-<code>defcustom</code>. Aunque se puede usar <code>defvar</code> o <code>setq</code>
-para las variables que los usuarios asignan, la forma especial
-<code>defcustom</code> est&aacute; dise&ntilde;ada para el trabajo.
-</p>
-<p>Se puede usar tu conocimiento de <code>defvar</code> para escribir los
-primeros tres argumentos para <code>defcustom</code>. El primer argumento
-para <code>defcustom</code> es el nombre de la variable. El segundo
-argumento es el valor inicial de la variable, cualquiera; y este
-valor es asignado solo si el valor no ha sido ya asignado. El tercer
-argumento es la documentaci&oacute;n.
-</p>
-<p>El cuarto y subsiguientes argumentos para <code>defcustom</code> especifican
-los tipos y opciones; estos no son funcionales en <code>defvar</code>. (Estos
-argumentos son opcionales.)
-</p>
-<p>Cada uno de estos argumentos consiste de una palabra seguido de una
-palabra por un valor. Cada palabra clave empieza con los dos puntos
-&lsquo;<samp>:</samp>&rsquo;.
-</p>
-<p>Por ejemplo, la variable de opciones personalizable
-<code>text-mode-hook</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defcustom text-mode-hook nil
- &quot;El hook normal se ejecuta cuando se introduce en modo texto y
- muchos modos relacionados.&quot;
- :type 'hook
- :options '(turn-on-auto-fill flyspell-mode)
- :group 'data)
-</pre></div>
-
-<p>El nombre de la variable es <code>text-mode-hook</code>; no tiene valor por
-defecto; y su cadena de documentaci&oacute;n cuenta lo que hace.
-</p>
-<p>La palabra clave <code>:type</code> le cuenta a Emacs el tipo de datos para
-los que <code>text-mode-hook</code> ser&iacute;a asignado y como
-muestra el valor en un b&uacute;ffer de Personalizaci&oacute;n.
-</p>
-<p>La palabra clave <code>:options</code> especifica una lista sugerida de
-valores para la variable. Normalmente, <code>:options</code> se asocia a un
-gancho (<em>hook</em>. La lista es solo una sugerencia; esa no es
-exclusiva; una persona quien asigna la variable puede asignarse a
-otros valores; la lista mostrada siguiendo la palabra clave
-<code>:options</code> se pretende ofrecer elecciones convenientes a un
-usuario.
-</p>
-<p>Finalmente, la palabra clave <code>:group</code> cuenta el comando de
-Personalizaci&oacute;n de Emacs en el que el grupo de la variable est&aacute;
-localizado. Esto cuenta d&oacute;nde encontralo.
-</p>
-<p>La funci&oacute;n <code>defcustom</code> reconoce m&aacute;s de una docena de palabras
-clave. Para m&aacute;s informaci&oacute;n, mire <a href="elisp.html#Personalizaci_00f3n">Escribiendo las Definiciones de Personalizaci&oacute;n</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>.
-</p>
-<p>Considere <code>text-mode-hook</code> como un ejemplo.
-</p>
-<p>Hay dos caminos para personalizar esta variable. Se puede usar el
-comando de personalizaci&oacute;n o escribir las expresiones apropiadas por
-uno mismo.
-</p>
-<p>Usando el comando de personalizaci&oacute;n, se puede escribir:
-</p>
-<div class="smallexample">
-<pre class="smallexample">M-x customize
-</pre></div>
-
-<p>y encuentre que el grupo para editar ficheros de datos se llama
-&lsquo;datos&rsquo;. Introduzca este grupo. El Hook <em>Disparador</em> es el primer
-miembro. Se puede hacer click en sus opciones varias, tal como
-<code>turn-on-auto-fill</code>, para asignar los valores. Despu&eacute;s de hacer
-click en el bot&oacute;n.
-</p>
-<div class="smallexample">
-<pre class="smallexample">Gu&aacute;rdalo para Futuras Sesiones
-</pre></div>
-
-<p>Emacs escribir&aacute; una expresi&oacute;n en tu fichero &lsquo;<tt>.emacs</tt>&rsquo;. Se
-parecer&aacute; a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(custom-set-variables
- ;; custom-set-variables fu&eacute; a&ntilde;adido por Custom.
- ;; Si se edita a mano, tu podr&iacute;as liarte,
- ;; as&iacute; que ten cuidado.
- ;; Tu fichero init contendr&iacute;a solo esta instancia.
- ;; Si hay m&aacute;s de uno, ellos no quieren trabajar.
- '(text-mode-hook (quote (turn-on-auto-fill text-mode-hook-identify))))
-</pre></div>
-
-<p>(La funci&oacute;n <code>text-mode-hook-identify</code> cuenta
-<code>toggle-text-mode-auto-fill</code> que buffers hay en modo Texto. Eso
-viene autom&aacute;ticamente)
-</p>
-<p>La funci&oacute;n <code>custom-set-variables</code> funciona de alguna manera
-diferente m&aacute;s de un <code>setq</code>. Mientras yo nunca he aprendido las
-diferencias, yo modifico las expresiones <code>custom-set-variable</code> en
-mi fichero &lsquo;<tt>.emacs</tt>&rsquo; a mano: yo creo los cambios en los que
-aparecen a mi para ser una manera razonable y no tener
-problemas. Otros prefieren usar el comando de Personalizaci&oacute;n y
-permitir a Emacs hacer el trabajo para ellos.
-</p>
-<p>Otra funci&oacute;n <code>custom-set-&hellip;</code> es
-<code>custom-set-faces</code>. Esta funci&oacute;n asigna varios tipos de
-fuentes. A trav&eacute;s del tiempo, yo he asignado un considerable
-n&uacute;mero de tipos. Algo de tiempo, yo las reseteo usando
-<code>customize</code>; otras veces, simplemente edito la expresi&oacute;n
-<code>custom-set-faces</code> en mi fichero &lsquo;<tt>.emacs</tt>&rsquo; en s&iacute;.
-</p>
-<p>El segundo modo de personalizar tu <code>text-mode-hook</code> es asignarte
-a t&iacute; mismo en tu fichero &lsquo;<tt>.emacs</tt>&rsquo; usando c&oacute;digo
-que no tiene nada que hacer con las funciones <code>custom-set-&hellip;</code>.
-</p>
-<p>Cuando se hace esto, y despu&eacute;s usa <code>customize</code>, se ver&aacute; un
-mensaje que dice:
-</p>
-<div class="smallexample">
-<pre class="smallexample">CHANGED fuera de Personalizar; operando dentro aqu&iacute;
-puede ser no confiable.
-</pre></div>
-
-<p>Este mensaje es solo un aviso. Si se puede cliquear en el bot&oacute;n a
-</p>
-<div class="smallexample">
-<pre class="smallexample">Gu&aacute;rdalo para Futuras Sesiones
-</pre></div>
-
-<p>Emacs escribir&aacute; una expresi&oacute;n <code>custom-set-&hellip;</code> cerca del
-fin de tu fichero &lsquo;<tt>.emacs</tt>&rsquo; que ser&aacute; evaluado despu&eacute;s de que
-tu expresi&oacute;n sea escrita a mano. Por esta raz&oacute;n, se
-sobreescribir&aacute; tu expresi&oacute;n escrita a mano. Ning&uacute;n da&ntilde;o ser&aacute;
-hecho. Cuando se haga esto, sin embargo, ten cuidado para recordar que
-expresi&oacute;n est&aacute; activa; si olvidas, puedes confundirte por
-t&iacute; mismo.
-</p>
-<p>Tan largo como se recuerda donde los valores son configurados, no
-habr&aacute; problemas. En cualquier eventos, los valores son siempre
-configurados en tu fichero de inicializaci&oacute;n, que es normalmente
-llamado &lsquo;<tt>.emacs</tt>&rsquo;.
-</p>
-<p>Yo mismo hago un <code>customize</code> para cualquier
-cosa. Mayoritariamente, escribo expresiones por m&iacute;
-mismo.
-</p>
-<a name="index-defsubst"></a>
-<a name="index-defconst"></a>
-<p>Incidentalmente, para ser una definici&oacute;n concerniente m&aacute;s
-completa: <code>defsubst</code> define una funci&oacute;n inline. La sintaxis es
-solo como esta de <code>defun</code>. <code>defconst</code> define un
-s&iacute;mbolo como una constante. El intento es que ning&uacute;n
-programa o usuario cambiar&iacute;an un valor asignado por
-<code>defconst</code>. (Se puede cambiar; el valor asignado es una variable;
-pero por favor no lo haga.)
-</p>
-<hr>
-<a name="Empezando-un-fichero-_002eemacs"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#defcustom" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Texto-y-Autorelleno" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Empieza-por-un-fichero-_002eemacs"></a>
-<h2 class="section">16.3 Empieza por un fichero &lsquo;<tt>.emacs</tt>&rsquo;</h2>
-<a name="index-fichero-_002eemacs_002c-empezando"></a>
-
-<p>Cuando se abre Emacs, se carga tu fichero &lsquo;<tt>.emacs</tt>&rsquo; a menos que
-se cuente que no se especifique &lsquo;<samp>-q</samp>&rsquo; en la l&iacute;nea de
-comandos. (El comando <code>emacs -q</code> tu da un Emacs plano, fuera.)
-</p>
-<p>Un fichero &lsquo;<tt>.emacs</tt>&rsquo; contiene expresiones Lisp. Con frecuencia, no
-hay m&aacute;s expresiones para configura valores; algunas veces esas son
-definiciones de funciones.
-</p>
-<p>See <a href="emacs.html#Fichero-de-Inicio">El Fichero de Inicio &lsquo;<tt>~/.emacs</tt>&rsquo;</a> in <cite>El Manual GNU Emacs</cite>, para una corta descripci&oacute;n de fichero
-de inicializaci&oacute;n.
-</p>
-<p>Este cap&iacute;tulo cubre algo del mismo suelo, pero es un
-paseo entre extractos desde un completo, largamente usado fichero
-&lsquo;<tt>.emacs</tt>&rsquo; &mdash; por m&iacute;.
-</p>
-<p>La primera parte del fichero consiste en comentario: me recuerdo a
-m&iacute; mismo. Por ahora, yo recuerdo estas cosas, pero
-cuando empec&eacute;, no.
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;;; fichero .emacs de Bob
-; Robert J. Chassell
-; 26 de Septiembre de 1985
-</pre></div>
-
-<p>&iexcl;Mira en esta fecha! Yo empec&eacute; este fichero hace mucho
-tiempo. Yo he estado a&ntilde;adiendo cosas desde siempre.
-</p>
-<div class="smallexample">
-<pre class="smallexample">; Cada secci&oacute;n en este fichero es introducido por una
-; l&iacute;nea empezando con cuatro puntos y comas y cada
-; entrada es introducida por una l&iacute;nea empezando con
-; tres puntos y comas.
-</pre></div>
-
-<p>Esto describe las convenciones usuales para comentarios en Emacs
-Lisp. Cada cosa en una l&iacute;nea que sigue un punto y coma
-es un comentario. Dos, tres, y cuatro puntos y coma son usados como
-subsecci&oacute;n y marcas de secci&oacute;n. (See <a href="elisp.html#Comentarios">Comentarios</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>, para m&aacute;s comentarios.)
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;;; La Tecla de Ayuda
-; Control-h es la tecla de ayuda;
-; despu&eacute;s escribiendo control-h, escribe una letra a
-; indica el asunto acerca del que quieres ayuda.
-; Para una explicaci&oacute;n de la facilidad de ayuda,
-; escribe control-h dos veces en una fila.
-</pre></div>
-
-<p>Solo recuerda: escribe <kbd>C-h</kbd> dos veces para ayudar.
-</p>
-<div class="smallexample">
-<pre class="smallexample">; Para informarse acerca de cualquier modo, escribe control-h m
-; mientras est&eacute; en este modo. Por ejemplo, para encontrar
-; acerca del modo correo, introduce el modo correo y entonces
-; escribe control-h m.
-</pre></div>
-
-<p>&lsquo;Modo ayuda&rsquo;, como yo llamo a esto, es muy &uacute;til. Usualmente, se
-cuenta todo lo que se necesita saber.
-</p>
-<p>De acuerdo, no se necesitan incluir comentarios y ficheros como estos
-&lsquo;<tt>.emacs</tt>&rsquo;. Yo los inclu&iacute; en el m&iacute;o
-porque se olvida el Modo ayuda o las convenciones para comentarios &mdash;
-pero era capaz de recordar ver aqu&iacute; record&aacute;rmelo a
-m&iacute; mismo.
-</p>
-<hr>
-<a name="Texto-y-Autorelleno"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Empezando-un-fichero-_002eemacs" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Alias-de-correo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Modo-texto-y-auto-relleno"></a>
-<h2 class="section">16.4 Modo texto y auto relleno</h2>
-
-<p>Ahora regresa a la parte que &lsquo;vuelve&rsquo; al modo Texto y modo Auto Relleno.
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; Modo texto modo Auto Fill
-;; Las siguiente dos l&iacute;neas puestas en Emacs dentro de
-;; modo Texto y en el modo Auto Fill, son para escritores que
-;; quieren empezar a escribir prosa en vez de c&oacute;digo.
-(setq-default major-mode 'text-mode)
-(add-hook 'text-mode-hook 'turn-on-auto-fill)
-</pre></div>
-
-<p>&iexcl;Aqu&iacute; est&aacute; la primera parte de este
-fichero &lsquo;<tt>.emacs</tt>&rsquo; que hace alguna cosa bajo recuerdo de un humano
-olvidado!
-</p>
-<p>La primera de las dos l&iacute;neas entre par&eacute;ntesis cuentan a
-Emacs a cambiar al modo Texto que se encuentra un fichero, <em>a menos
-que</em> el fichero ir&iacute;a dentro de alg&uacute;n otro modo, tal
-como el modo C.
-</p>
-<a name="index-Por-buffer_002c-lista-de-variables-locales"></a>
-<a name="index-Lista-de-variables-locales_002c-por-buffer_002c"></a>
-<a name="index-Seleccion-de-modo-automatico"></a>
-<a name="index-Modo-de-seleccion_002c-automatico"></a>
-<p>Cuando Emacs lee un fichero, eso parece la extensi&oacute;n al nombre del
-fichero. (La extensi&oacute;n es la parte que viene despu&eacute;s de un
-&lsquo;<samp>.</samp>&rsquo;.) Si el fichero finaliza con una extensi&oacute;n &lsquo;<samp>.c</samp>&rsquo; o
-&lsquo;<samp>.h</samp>&rsquo; entonces Emacs cambia al modo C. Tambi&eacute;n, Emacs parece al
-principio una l&iacute;nea no blanca del fichero; si la
-l&iacute;nea dice &lsquo;<samp><span class="nolinebreak">-*-</span>&nbsp;C&nbsp;<span class="nolinebreak">-*-</span></samp>&rsquo;, Emacs cambia al modo
-C. Emacs posee una lista de extensiones y especificaciones que usa
-autom&aacute;ticamente. Adem&aacute;s, Emacs se ve cerca de la &uacute;ltima p&aacute;gina
-por buffer, &ldquo;lista variables locales&rdquo;.
-</p>
-
-<p>Ahora, regresa al fichero &lsquo;<tt>.emacs</tt>&rsquo;.
-</p>
-<p>Aqu&iacute; est&aacute; la l&iacute;nea de nuevo;
-&iquest;c&oacute;mo funciona?
-</p>
-<a name="index-Modo-Texto-activado"></a>
-<div class="smallexample">
-<pre class="smallexample">(setq major-mode 'text-mode)
-</pre></div>
-
-<p>Esta l&iacute;nea es un resumen, pero completa la expresi&oacute;n
-Emacs Lisp.
-</p>
-<p>Ya estamos familiarizados con <code>setq</code>. Eso asigna la siguiente
-variable, <code>major-mode</code>, al subsiguiente valor, que es
-<code>text-mode</code>. La marca de cita simple antes de <code>text-mode</code>
-cuenta a Emacs como tratar directamente con el s&iacute;mbolo,
-no con cualquier cosa que pudiera existir. V&eacute;ase la secci&oacute;n <a href="#set-y-setq">Configurando el Valor de una Variable</a>, por un recuerdo de como
-<code>setq</code> funciona. El principal punto es que no hay diferencia
-entre el procedimiento que se usa para asignar un valor en su fichero
-&lsquo;<tt>.emacs</tt>&rsquo; y el procedimiento que se usa en cualquier lugar m&aacute;s
-en Emacs.
-</p>
-<p>Aqu&iacute; est&aacute; la siguiente l&iacute;nea:
-</p>
-<a name="index-Modo-de-autoajuste-activado"></a>
-<a name="index-add_002dhook"></a>
-<div class="smallexample">
-<pre class="smallexample">(add-hook 'text-mode-hook 'turn-on-auto-fill)
-</pre></div>
-
-<p>En esta l&iacute;nea, el comando <code>add-hook</code> a&ntilde;ade
-<code>turn-on-auto-fill</code> para la variable.
-</p>
-<p>&iexcl;<code>turn-on-auto-fill</code> es el nombre de un programa,
-que se adivina!, cambia al modo Auto Fill.
-</p>
-<p>Cada vez que Emacs cambia al modo texto, Emacs ejecuta el comando
-&lsquo;hooked&rsquo; dentro de modo Texto. As&iacute; que cada vez que
-Emacs cambia al modo Texto, Emacs tambi&eacute;n cambia al modo de
-autoajuste.
-</p>
-<p>En breve, la primera l&iacute;nea causa a Emacs a entrar en
-modo Texto cuando se edite un fichero, a menos que la extensi&oacute;n del
-nombre del fichero, una l&iacute;nea no en blanco, variables
-locales para contar a Emacs de otro modo.
-</p>
-<p>El modo texto entre otras acciones, asigna la tabla de sintaxis para
-trabajar adecuadamente a escritores. En modo texto, Emacs considera un
-ap&oacute;strofe como parte de una palabra como una letra; pero Emacs no
-considera un per&iacute;odo o un espacio como parte de una
-palabra. De este modo, <kbd>M-f</kbd> se mueve hacia t&iacute; a
-trav&eacute;s de &lsquo;<samp>eso</samp>&rsquo;. Por otro lado, en modo C, <kbd>M-f</kbd> para solo
-despu&eacute;s del &lsquo;<samp>t</samp>&rsquo; de &lsquo;<samp>eso</samp>&rsquo;.
-</p>
-<p>La segunda l&iacute;nea causa que Emacs active el modo Auto
-Fill cuando cambia al modo Texto. En modo Auto Fill, Emacs
-autom&aacute;ticamente rompe una l&iacute;nea que es demasiado
-amplio y trae la parte excesivamente amplia de la l&iacute;nea
-de debajo a la siguiente l&iacute;nea. Emacs rompe
-l&iacute;neas entre palabras con ellas.
-</p>
-<p>Cuando el modo Auto Fill est&aacute; desactivado, las l&iacute;neas
-contin&uacute;an a la derecha como se escriben. Dependiendo de como
-configuras el valor de <code>truncate-lines</code>, las palabras que se
-escribe si desaparecen al lado derecho de la pantalla, o lo dem&aacute;s
-son mostradas, en un modo feo e ilegible, como una l&iacute;nea
-de continuaci&oacute;n en la pantalla.
-</p>
-<p>Adem&aacute;s, en esta parte de mi fichero &lsquo;<tt>.emacs</tt>&rsquo;, yo cuento a Emacs
-el ajuste de comandos para insertar dos espacios despu&eacute;s de dos
-puntos:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq colon-double-space t)
-</pre></div>
-
-<hr>
-<a name="Alias-de-correo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Texto-y-Autorelleno" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Indentar-modo-de-tabulaciones" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Alias-de-correo-1"></a>
-<h2 class="section">16.5 Alias de correo</h2>
-
-<p>Aqu&iacute; hay un <code>setq</code> que &lsquo;activa&rsquo; el alias de correo,
-para m&aacute;s ocasiones.
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; Modo Correo
-; Para entrar en el modo correo, escribe `C-x m'
-; Para introducir RMAIL (para leer el correo),
-; escribe `M-x rmail'
-(setq mail-aliases t)
-</pre></div>
-
-<a name="index-Alias-de-correo"></a>
-<p>Este comando <code>setq</code> asigna el valor de la variable
-<code>mail-aliases</code> al <code>t</code>. Desde que <code>t</code> significa cierto,
-la l&iacute;nea dice, en efecto, &ldquo;S&iacute; uso alias
-de correo.&rdquo;
-</p>
-<p>Los alias de correo son nombres cortos convenientes para largas
-direcciones de correo o para listas de direcciones de correo. El
-fichero donde guardar tus &lsquo;aliases&rsquo; es &lsquo;<tt>~/.mailrc</tt>&rsquo;. Se escribe
-un alias como este:
-</p>
-<div class="smallexample">
-<pre class="smallexample">alias geo george@foobar.wiz.edu
-</pre></div>
-
-<p>Cuando se escribe un mensaje a Jorge, la direcci&oacute;n a &lsquo;<samp>geo</samp>&rsquo;; el
-correo autom&aacute;ticamente expandir&aacute; &lsquo;<samp>geo</samp>&rsquo; a la direcci&oacute;n completa.
-</p>
-<hr>
-<a name="Indentar-modo-de-tabulaciones"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Alias-de-correo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Atajos-de-teclado" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Indentar-modo-de-tabulaciones-1"></a>
-<h2 class="section">16.6 Indentar modo de tabulaciones</h2>
-<a name="index-Tabuladores_002c-previniendo"></a>
-<a name="index-indent_002dtabs_002dmode"></a>
-
-<p>Por defecto, Emacs inserta tabulaciones en lugar en m&uacute;ltiples
-espacios cuando se formatea una regi&oacute;n. (Por ejemplo, se
-podr&iacute;an indentar muchas l&iacute;neas de texto
-todo a la vez con el comando <code>indent-region</code>.) Los tabuladores se
-ven bien en un terminal o con impresi&oacute;n ordinaria, pero ellos
-producen mala salida de indentaci&oacute;n cuando se usa TeX o Texinfo
-puesto que TeX ignora tabuladores.
-</p>
-<p>Lo siguiente desactiva el modo de Indentar Tabulaciones:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; Prevenir Tabulaciones Extra&ntilde;as
-(setq-default indent-tabs-mode nil)
-</pre></div>
-
-<p>Note que esta l&iacute;nea usa <code>setq-default</code> en vez de el
-comando <code>setq</code> que hemos visto antes. El comando
-<code>setq-default</code> asigna valores solo en b&uacute;ffers que no tienen sus
-propios valores locales para la variable.
-</p>
-
-<hr>
-<a name="Atajos-de-teclado"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Indentar-modo-de-tabulaciones" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Mapas-de-teclado" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Algunos-atajos"></a>
-<h2 class="section">16.7 Algunos atajos</h2>
-
-<p>Ahora para algunos atajos personales:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; Compara ventanas
-(global-set-key &quot;\C-cw&quot; 'compare-windows)
-</pre></div>
-
-<a name="index-compare_002dwindows"></a>
-<p><code>compare-windows</code> es un comando excelente que compara el texto en
-tu ventana actual con texto de la siguiente ventana. Eso hace la
-comparaci&oacute;n empezando al punto en cada ventana, moviendo a trav&eacute;s
-del texto en cada ventana tan lejos como ellos asocian. Yo uso este
-comando todo el tiempo.
-</p>
-<p>Esto tambi&eacute;n muestra como configurar una tecla globalmente, para
-todo los modos
-</p>
-<a name="index-Configurando-una-tecla-globalmente"></a>
-<a name="index-Asignar-tecla-global"></a>
-<a name="index-Asignando-tecla-globalmente"></a>
-<a name="index-global_002dset_002dkey"></a>
-<p>El comando es <code>global-set-key</code>. Es seguido por el atajo. En un
-fichero &lsquo;<tt>.emacs</tt>&rsquo;, el atajo es escrito como se ve: <code>\C-c</code> que
-se asocia a &lsquo;control-c&rsquo;, que significa &lsquo;presionar la tecla de control
-y la tecla &lt;c&gt; al mismo tiempo&rsquo;. La <code>w</code> significa &lsquo;presionar
-la tecla &lt;w&gt;&rsquo;. El atajo es rodeado por dobles comillas. En la
-documentaci&oacute;n, se escribir&iacute;a esto como <kbd><span class="nolinebreak">C-c</span>&nbsp;w</kbd>. (Si estuviera asociando una tecla &lt;META&gt;, tal como <kbd>M-c</kbd>,
-en vez de una tecla de &lt;CTRL&gt;, se escribir&iacute;a
-<code><span class="nolinebreak">\M-c</span></code> en su fichero &lsquo;<tt>.emacs</tt>&rsquo;. See <a href="emacs.html#Reasociando-Init">Reasociando Teclas en Su Fichero Init</a> in <cite>El Manual de GNU Emacs</cite>,
-para m&aacute;s detalles.)
-</p>
-<p>El comando invocado por las teclas es <code>compare-windows</code>. Note que
-<code>compare-windows</code> es precedido por una comilla simple; de otro
-modo, Emacs primero intentar&iacute;a evaluar el
-s&iacute;mbolo para determinar su valor.
-</p>
-<p>Estas tres cosas, las marcas de dobles comillas, la barra invertida
-antes de la &lsquo;<samp>C</samp>&rsquo;, y la marca de comilla simple son partes
-necesarias de atajos de teclado que tiendo a olvidar. Afortunadamente,
-he llegado a recordar que mirar&iacute;a mi fichero
-&lsquo;<tt>.emacs</tt>&rsquo; existente, y lo adaptar&iacute;a a lo que hay.
-</p>
-<p>Como para el atajo en s&iacute;: <kbd>C-c w</kbd>, combina la tecla
-prefija, <kbd>C-c</kbd>, con un caracter simple, en este caso,
-<kbd>w</kbd>. Este conjunto de teclas, <kbd>C-c</kbd> seguido por un caracter
-simple, es estrictamente reservado para un uso propio
-individual. (Esto se llama teclas &lsquo;propias&rsquo;, puesto que estas son para
-su propio uso). Siempre ser&iacute;a capaz de crear tal atajo
-para el uso propio sin pisar fuerte en alg&uacute;n atajo m&aacute;s. Si siempre
-se escribe una extensi&oacute;n a Emacs, por favor, evite tomar cualquiera
-de estas teclas para uso p&uacute;blico. Se cree que una tecla como
-<kbd>C-c C-w</kbd> en vez de eso. De otra manera, ejecutar&aacute; sin sus
-&lsquo;propias&rsquo; teclas.
-</p>
-<p>Aqu&iacute; hay otro atajo, con un comentario:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; Atajo para `occur'
-; Yo uso mucho occur, as&iacute; permite asignarlo a una tecla:
-(global-set-key &quot;\C-co&quot; 'occur)
-</pre></div>
-
-<a name="index-occur"></a>
-<p>El comando <code>occur</code> muestra todas las l&iacute;neas en el
-buffer actual que contiene un emparejamiento para una expresi&oacute;n
-regular. Asociar las l&iacute;neas que se muestran en un
-b&uacute;ffer llamado &lsquo;<tt>*Occur*</tt>&rsquo;. Este buffer sirve como un menu para
-saltar a ocurrencias.
-</p>
-<a name="index-global_002dunset_002dkey"></a>
-<a name="index-Disociando-la-tecla"></a>
-<a name="index-Desasociar-Tecla-a-Comando"></a>
-<p>Aqu&iacute; se muestra como desasignar una tecla,
-as&iacute; no funciona:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; Desasociar `C-x f'
-(global-unset-key &quot;\C-xf&quot;)
-</pre></div>
-
-<p>Hay una raz&oacute;n para esta no asociaci&oacute;n: Yo encontr&eacute;
-inadvertidamente escrito <kbd><span class="nolinebreak">C-x</span>&nbsp;f</kbd> cuando signific&oacute; escribir
-<kbd>C-x C-f</kbd>. En vez de encontrar un fichero, como se pretende,
-accidentalmente asigna el ancho para el fichero lleno, casi siempre a
-un tama&ntilde;o que no quer&iacute;a. Puesto que duramente se
-resete&oacute; mi ancho por defecto, yo simplemente disoci&eacute; la tecla.
-</p>
-<a name="index-list_002dbuffers_002c-reasociar"></a>
-<a name="index-buffer_002dmenu_002c-asociado-a-tecla"></a>
-<p>Lo siguiente reasocia una tecla existente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; Reasocia `C-x C-b' al `buffer-menu'
-(global-set-key &quot;\C-x\C-b&quot; 'buffer-menu)
-</pre></div>
-
-<p>Por defecto, <kbd>C-x C-b</kbd> ejecute el comando
-<code>list-buffers</code>. Este comando lista sus buffers en <em>otra</em>
-ventana. Desde que casi siempre se quiere hacer alguna cosa en esta
-ventana, se prefiere el comando <code>buffer-menu</code>, que no solo lista
-los buffers, pero mueve el punto dentro de esta ventana.
-</p>
-<hr>
-<a name="Mapas-de-teclado"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Atajos-de-teclado" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Cargando-ficheros" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Mapas-de-teclado-1"></a>
-<h2 class="section">16.8 Mapas de teclado</h2>
-<a name="index-Mapas-de-teclado"></a>
-<a name="index-Reasociando-teclas"></a>
-
-<p>Emacs usa <em>keymaps</em> para grabar qu&eacute; teclas llaman a qu&eacute;
-comandos. Cuando se use <code>global-set-key</code> para asignar los atajos
-de teclados a un simple comando en todo <code>current-global-map</code>.
-</p>
-<p>Modos espec&iacute;ficos, tales como modo C o modo Texto, tiene
-sus propios mapas de teclado; mapas de teclado de modo
-espec&iacute;fico sobreescribe el mapa global que es compartido
-por todos los buffers.
-</p>
-<p>La funci&oacute;n <code>global-set-key</code> asocia, o reasocia, el mapa de
-teclado global. Por ejemplo, las siguientes asociaciones la tecla
-<kbd>C-x C-b</kbd> a la funci&oacute;n <code>buffer-menu</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(global-set-key &quot;\C-x\C-b&quot; 'buffer-menu)
-</pre></div>
-
-<p>Mapas de teclado espec&iacute;fico de modo son asociados usando
-la funci&oacute;n <code>define-key</code>, que toma un mapa de teclado
-espec&iacute;fico como un argumento, tan bien como la tecla y
-el comando. Por ejemplo, mi fichero &lsquo;<tt>.emacs</tt>&rsquo; contiene la
-siguiente expresi&oacute;n asociada al comando
-<code>texinfo-insert-@group</code> comando a <kbd>C-c C-c g</kbd>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(define-key texinfo-mode-map &quot;\C-c\C-cg&quot; 'texinfo-insert-@group)
-</pre></div>
-
-<p>La funci&oacute;n <code>texinfo-insert-@group</code> en s&iacute; es una
-peque&ntilde;a extensi&oacute;n del modo Texinfo que inserta &lsquo;<samp>@group</samp>&rsquo; dentro
-de un fichero Texinfo. Se usa este comando todo el tiempo y se prefieren
-escribir los tres atajos <kbd>C-c C-c g</kbd> en vez de los seis atajos
-<kbd>@ g r o u p</kbd>. (&lsquo;<samp>@group</samp>&rsquo; y su asociaci&oacute;n &lsquo;<samp>@end
-group</samp>&rsquo; son comandos que guarda todo el texto cerrado junto a una
-p&aacute;gina; muchos ejemplos multi-l&iacute;nea en este libro
-est&aacute;n rodeados por &lsquo;<samp>@group &hellip; @end group</samp>&rsquo;.)
-</p>
-<p>Aqu&iacute; est&aacute; la definici&oacute;n de funci&oacute;n
-<code>texinfo-insert-@group</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun texinfo-insert-@group ()
- &quot;Inserta la cadena @group en un b&uacute;ffer Texinfo.&quot;
- (interactive)
- (beginning-of-line)
- (insert &quot;@group\n&quot;))
-</pre></div>
-
-<p>(De acuerdo, podr&iacute;a haber usado el modo Abbrev para
-dejar de escribir, en vez de escribir una funci&oacute;n para insertar una
-palabra; pero prefiero atajos de teclado consitentes con otro modo
-Texinfo para atajos de teclado.)
-</p>
-<p>Ver&aacute; numerosas expresiones <code>define-key</code> en &lsquo;<tt>loaddefs.el</tt>&rsquo;
-tan bien como en varios modos de librer&iacute;as, tal como
-&lsquo;<tt>cc-mode.el</tt>&rsquo; y &lsquo;<tt>lisp-mode.el</tt>&rsquo;.
-</p>
-<p>See <a href="emacs.html#Atajos-de-Teclado">Personalizando Atajos de Teclado</a> in <cite>El Manual GNU Emacs</cite>, y <a href="elisp.html#Mapas-de-Teclado">Mapas de Teclado</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>, para m&aacute;s
-informaci&oacute;n acerca de mapas de teclado.
-</p>
-<hr>
-<a name="Cargando-ficheros"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Mapas-de-teclado" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Autocarga" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Cargando-ficheros-1"></a>
-<h2 class="section">16.9 Cargando ficheros</h2>
-<a name="index-Cargando-ficheros"></a>
-
-<p>Muchas personas en la comunidad de GNU Emacs han escrito extensiones a
-Emacs. Hace tiempo, que estas extensiones son con frecuencia incluidas
-en las nuevas entregas <em>releases</em>. Por ejemplo, los paquetes
-Calendario y Diario son ahora parte del est&aacute;ndar GNU Emacs, como es Calc.
-</p>
-<p>Se puede usar un comando <code>load</code> para evaluar un fichero completo
-que significa instalar todas las funciones y variables en el fichero
-Emacs. Por ejemplo:
-</p>
-
-<div class="smallexample">
-<pre class="smallexample">(load &quot;~/emacs/slowsplit&quot;)
-</pre></div>
-
-<p>Esto eval&uacute;a, por ej. carga, el fichero &lsquo;<tt>slowsplit.el</tt>&rsquo; o si
-eso existe, lo m&aacute;s r&aacute;pido, el fichero compilado
-&lsquo;<tt>slowsplit.elc</tt>&rsquo; desde el subdirectorio &lsquo;<tt>emacs</tt>&rsquo; del
-directorio home. El fichero contiene la funci&oacute;n
-<code>split-window-quietly</code>, que John Robinson escribi&oacute; en 1989.
-</p>
-<p>La funci&oacute;n <code>split-window-quietly</code> divide una ventana con el
-m&iacute;nimo de redisplay. Yo lo instal&eacute; en 1989 porque
-trabaj&oacute; bien con los terminales de 1200 baudios que entonces estaba
-usando. Ahora, ocasionalmente vengo a trav&eacute;s de una conexi&oacute;n
-lenta, pero contin&uacute;a usando la funci&oacute;n porque me gusta el camino
-que deja arriba del b&uacute;ffer en el bajo de las nuevas ventanas y
-arriba en la ventana superior.
-</p>
-<p>Para reemplazar el atajo de teclado por defecto
-<code>split-window-vertically</code>, se debe tambi&eacute;n desasignar esta
-tecla y asociar las teclas a <code>split-window-quietly</code>, como este:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(global-unset-key &quot;\C-x2&quot;)
-(global-set-key &quot;\C-x2&quot; 'split-window-quietly)
-</pre></div>
-
-<a name="index-load_002dpath"></a>
-<p>Si se cargan muchas extensiones, como yo hago, entonces en vez de
-especificar la posici&oacute;n exacta del fichero, como se muestra arriba,
-se puede especificar que directorio como parte del <code>load-path</code> de
-Emacs. Entonces, cuando Emacs carga un fichero, buscar&aacute; que
-directorio tan bien como su lista por defecto de directorios. (La
-lista por defecto es especificada en &lsquo;<tt>paths.h</tt>&rsquo; cuando Emacs se
-construye.)
-</p>
-<p>El comando siguiente a&ntilde;ade tu directorio &lsquo;<tt>~/emacs</tt>&rsquo; a la ruta
-existente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; Ruta Emacs
-(setq load-path (cons &quot;~/emacs&quot; load-path))
-</pre></div>
-
-<p>Incidentalmente, <code>load-library</code> es un interfaz interactivo a la
-funci&oacute;n <code>load</code>. La funci&oacute;n se parece a esto:
-</p>
-<a name="index-load_002dlibrary"></a>
-<div class="smallexample">
-<pre class="smallexample">(defun load-library (library)
- &quot;Carga la librer&iacute;a llamada LIBRARY.
-Esto es una interfaz a la funci&oacute;n `load'.&quot;
- (interactive
- (list (completing-read &quot;Carga la librer&iacute;a: &quot;
- (apply-partially 'locate-file-completion-table
- load-path
- (get-load-suffixes)))))
- (load library))
-</pre></div>
-
-<p>El nombre de la funci&oacute;n, <code>load-libray</code>, viene desde el uso de
-&lsquo;library&rsquo; como un sin&oacute;nimo para &lsquo;file&rsquo;. La fuente para el comando
-<code>load-library</code> est&aacute; en la librer&iacute;a &lsquo;<tt>files.el</tt>&rsquo;.
-</p>
-<p>Otro comando interactivo que hace un trabajo ligeramente diferente es
-<code>load-file</code>. See <a href="emacs.html#Librer_00edas-Lisp">Librer&iacute;as de C&oacute;digo Lisp para Emacs</a> in <cite>El Manual GNU Emacs</cite>, para informaci&oacute;n en la distinci&oacute;n entre
-<code>load-library</code> y este comando.
-</p>
-<hr>
-<a name="Autocarga"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cargando-ficheros" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Extensi_00f3n-simple" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Autoloading"></a>
-<h2 class="section">16.10 Autoloading</h2>
-<a name="index-autoload"></a>
-
-<p>En vez de instalar una funci&oacute;n cargando el fichero que lo contiene,
-o evaluando la definici&oacute;n de funci&oacute;n, se puede hacer la funci&oacute;n
-disponible pero actualmente no se instala hasta la primera vez
-llamada. Este proceso se llama <em>autocarga</em> (<em>autoloading</em>).
-</p>
-<p>Cuando se ejecuta una funci&oacute;n de autocarga, Emacs autom&aacute;ticamente
-eval&uacute;a el fichero que contiene la definici&oacute;n, y entonces llama a
-la funci&oacute;n.
-</p>
-<p>Emacs empieza r&aacute;pido con funciones de autocarga, puesto que sus
-librer&iacute;as no se cargan bien; pero si necesita esperar un
-momento cuando su primer uso tal como una funci&oacute;n, mientras que el
-fichero que lo contiene se eval&uacute;a.
-</p>
-<p>Raramente las funciones usadas son frecuentemente autocargadas. La
-librer&iacute;a &lsquo;<tt>loaddefs.el</tt>&rsquo; coniene cientos de funciones
-autocargadas, desde <code>bookmark-set</code> a <code>wordstar-mode</code>. Si se
-usa una funci&oacute;n &lsquo;rara&rsquo; frecuentemente, se deber&iacute;a
-cargar este fichero de funci&oacute;n con una expresi&oacute;n de <code>load</code> en
-tu fichero &lsquo;<tt>.emacs</tt>&rsquo;.
-</p>
-<p>En mi fichero &lsquo;<tt>.emacs</tt>&rsquo;, se cargan 14 librer&iacute;as que
-contienen funciones que de otro modo ser&iacute;an
-autocargadas. (Actualmente, eso habr&iacute;a sido mejor para
-incluir estos ficheros en mi Emacs &lsquo;volcado&rsquo;, pero se
-olvida. See <a href="elisp.html#Construyendo-Emacs">Construyendo Emacs</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>, y el fichero &lsquo;<tt>INSTALL</tt>&rsquo; para
-m&aacute;s acerca de volcados.)
-</p>
-<p>Se puede tambi&eacute;n querer incluir expresiones autocargadas en tu
-fichero &lsquo;<tt>.emacs</tt>&rsquo;. <code>autoload</code> es una funci&oacute;n construida que
-toma cinco argumento, los tres finales de los que son opcionales. El
-primer argumento es el nombre de la funci&oacute;n para ser autocargada. El
-segundo es el nombre del fichero para ser cargado. El tercer
-argumento es documentaci&oacute;n para la funci&oacute;n, y el cuarto cuenta si
-la funci&oacute;n puede ser llamada interactivmente. El quinto argumento
-cuenta que tipo de objeto &mdash; <code>autoload</code> puede manejar un mapa de
-teclado o macro tan bien como una funci&oacute;n (por defecto es una funci&oacute;n).
-</p>
-<p>Aqu&iacute; hay un ejemplo t&iacute;pico:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(autoload 'html-helper-mode
- &quot;html-helper-mode&quot; &quot;Editar documentos HTML&quot; t)
-</pre></div>
-
-<p>(<code>html-helper-mode</code> es una vieja alternativa a <code>html-mode</code>,
-que es una parte est&aacute;ndar de la distribuci&oacute;n.)
-</p>
-<p>Esta expresi&oacute;n autocarga la funci&oacute;n <code>html-helper-mode</code>. Esto
-se toma desde el fichero &lsquo;<tt>html-helper-mode-el</tt>&rsquo; (o desde la
-versi&oacute;n compilada &lsquo;<tt>html-helper-mode.elc</tt>&rsquo;, si eso existe). El
-fichero debe ser localizado en un directorio espec&iacute;fico
-por <code>load-path</code>. La documentaci&oacute;n dice que esto es un modo para
-ayudar a editar documentos escritos en Lenguaje de Marcas de Hiper
-Texto. Se puede llamar este modo interactivamente escribiendo <kbd>M-x
-html-helper-mode</kbd>. (Se necesitan duplicar las funciones regulares de
-documentaci&oacute;n en la expresi&oacute;n de autocarga porque la funci&oacute;n
-regular no est&aacute; todav&iacute;a cargada, as&iacute; su
-documentaci&oacute;n no est&aacute; disponible.)
-</p>
-<p>See <a href="elisp.html#Autocarga">Autocarga</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>, para m&aacute;s informaci&oacute;n.
-</p>
-<hr>
-<a name="Extensi_00f3n-simple"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Autocarga" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Colores-X11" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Una-extension-simple_003a-line_002dto_002dtop_002dof_002dwindow"></a>
-<h2 class="section">16.11 Una extensi&oacute;n simple: <code>line-to-top-of-window</code></h2>
-<a name="index-line_002dto_002dtop_002dof_002dwindow"></a>
-<a name="index-Extension-simple-en-fichero-_002eemacs"></a>
-
-<p>Aqu&iacute; hay una simple extensi&oacute;n a Emacs que mueve el
-punto de l&iacute;nea arriba de la ventana. Yo uso esto todo el
-tiempo, para hacer f&aacute;cil de leer el texto.
-</p>
-<p>Se puede poner el siguiente c&oacute;digo dentro de un fichero separado y
-entonce cargarlo desde tu fichero &lsquo;<tt>.emacs</tt>&rsquo;, o se puede incluir
-con tu fichero &lsquo;<tt>.emacs</tt>&rsquo;.
-</p>
-<p>Aqu&iacute; est&aacute; la definici&oacute;n
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; L&iacute;nea a lo alto de la ventana;
-;;; reemplaza tres secuencias de atajos de teclado C-u 0 C-l
-(defun line-to-top-of-window ()
- &quot;Mueve la l&iacute;nea que apunta a lo alto de la ventana.&quot;
- (interactive)
- (recenter 0))
-</pre></div>
-
-<p>Ahora el atajo.
-</p>
-<p>En estos d&iacute;as, las teclas de funci&oacute;n as&iacute;
-como los eventos del rat&oacute;n y caracteres no <small>ASCII</small> son escritos
-con corchetes, sin marcas de citas. (En Emacs versi&oacute;n 18 y
-anteriores, se ten&iacute;a que escribir diferentes teclas de
-funci&oacute;n asignadas por cada diferente creaci&oacute;n del terminal.)
-</p>
-<p>Se puede asociar <code>line-to-top-of-window</code> a la tecla de funci&oacute;n
-&lt;F6&gt; as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(global-set-key [f6] 'line-to-top-of-window)
-</pre></div>
-
-<p>Para m&aacute;s informaci&oacute;n, mira <a href="emacs.html#Reasociando-el-Init">Reasociando Teclas en tu fichero init</a> in <cite>El Manual GNU Emacs</cite>.
-</p>
-<a name="index-Condicional-marcaran-estas-dos-versiones-de-Emacs"></a>
-<a name="index-Version-de-Emacs_002c-eligiendo"></a>
-<a name="index-Version-de-Emacs_002c-eligiendo-1"></a>
-<p>Si ejecutas dos versiones de GNU Emacs, tal como las versiones 22 y
-23, y usas un fichero &lsquo;<tt>.emacs</tt>&rsquo;, se puede seleccionar qu&eacute; c&oacute;digo
-eval&uacute;a el siguiente condicional:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(cond
- ((= 22 emacs-major-version)
- ;; eval&uacute;a la version 22
- ( &hellip; ))
- ((= 23 emacs-major-version)
- ;; eval&uacute;a la version 23
- ( &hellip; )))
-</pre></div>
-
-<p>Por ejemplo, en versiones m&aacute;s recientes se ocultan los cursores por
-defecto. Si se odia tal ocultaci&oacute;n se escribe lo siguiente en mi
-fichero &lsquo;<tt>.emacs</tt>&rsquo;<a name="DOCF15" href="#FOOT15">(15)</a>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(when (&gt;= emacs-major-version 21)
- (blink-cursor-mode 0)
- ;; Inserta la nueva l&iacute;nea cuando se presiona `C-n' (next-line)
- ;; al fin del b&uacute;ffer
- (setq next-line-add-newlines t)
-</pre><pre class="smallexample"> ;; Cambia la imagen viendo
- (auto-image-file-mode t)
-</pre><pre class="smallexample"> ;; Activa la barra de menu (esta barra tiene texto)
- ;; (Usa un argumento num&eacute;rico para activarlo)
- (menu-bar-mode 1)
-</pre><pre class="smallexample"> ;; Desactiva la barra de herramientas (esta barra tiene iconos)
- ;; (Usa argumentos num&eacute;ricos para activarlo)
- (tool-bar-mode nil)
-</pre><pre class="smallexample"> ;; Desactiva el modo tooltip para la tool bar
- ;; (Este modo causa explicaciones de iconos al pop up)
- ;; (Usa el argumento num&eacute;rico para activarlo)
- (tooltip-mode nil)
- ;; Si los tooltips activados, crea consejos aparecen en el prompt
- (setq tooltip-delay 0.1) ; por defecto es de 0.7 segundos
- )
-</pre></div>
-
-<hr>
-<a name="Colores-X11"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Extensi_00f3n-simple" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Miscel_00e1nea" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Colores-X11-1"></a>
-<h2 class="section">16.12 Colores X11</h2>
-
-<p>Se pueden especificar colores cuando se usa Emacs con el Sistema de
-Ventanas X del MIT.
-</p>
-<p>Si disgustan los colores por defecto y especifica unos propios.
-</p>
-<p>Aqu&iacute; est&aacute;n las expresiones en un fichero &lsquo;<tt>.emacs</tt>&rsquo;
-que establecen los valores:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;; Asigna el color del cursor
-(set-cursor-color &quot;white&quot;)
-
-;; Asigna el color del rat&oacute;n
-(set-mouse-color &quot;white&quot;)
-
-;; Asigna foreground y background
-(set-foreground-color &quot;white&quot;)
-(set-background-color &quot;darkblue&quot;)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;;; Asigna colores para isearch y drag
-(set-face-foreground 'highlight &quot;white&quot;)
-(set-face-background 'highlight &quot;blue&quot;)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(set-face-foreground 'region &quot;cyan&quot;)
-(set-face-background 'region &quot;blue&quot;)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(set-face-foreground 'secondary-selection &quot;skyblue&quot;)
-(set-face-background 'secondary-selection &quot;darkblue&quot;)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;; Asigna colores al calendario
-(setq calendar-load-hook
- '(lambda ()
- (set-face-foreground 'diary-face &quot;skyblue&quot;)
- (set-face-background 'holiday-face &quot;slate blue&quot;)
- (set-face-foreground 'holiday-face &quot;white&quot;)))
-</pre></div>
-
-<p>Las varias sombras de azul disparan mi ojo y me preveen de ver la
-ventana desplegada.
-</p>
-<p>Alternativamente, se podr&iacute;an haber configurado mis
-especificaciones en varios ficheros inicializaci&oacute;n de X. Por
-ejemplo, se podr&iacute;a asignar el foreground, background,
-cursor y puntero (por ej., rat&oacute;n) colores en mi fichero
-&lsquo;<tt>~/.Xresources</tt>&rsquo; como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">Emacs*foreground: white
-Emacs*background: darkblue
-Emacs*cursorColor: white
-Emacs*pointerColor: white
-</pre></div>
-
-<p>En cualquier evento que no es parte de Emacs, se asigna el color
-ra&iacute;z de mi ventana X en mi fichero &lsquo;<tt>~/.xinitrc</tt>&rsquo;,
-como este<a name="DOCF16" href="#FOOT16">(16)</a>
-</p>
-<div class="smallexample">
-<pre class="smallexample">xsetroot -solid Navy -fg white &amp;
-</pre></div>
-
-<hr>
-<a name="Miscel_00e1nea"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Colores-X11" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Mode-Line" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Configuraciones-miscelaneas-para-un-fichero-_002eemacs"></a>
-<h2 class="section">16.13 Configuraciones miscel&aacute;neas para un fichero &lsquo;<tt>.emacs</tt>&rsquo;</h2>
-
-<p>Aqu&iacute; hay unas pocas configuraciones miscel&aacute;neas:
-</p><br>
-
-<ul class="no-bullet">
-<li>-
-Asigna la forma y color del rat&oacute;n del cursor:
-
-<div class="smallexample">
-<pre class="smallexample">; Formas de Cursor est&aacute;n definidas en
-; `/usr/include/X11/cursorfont.h';
-; por ejemplo, el cursor `objetivo' es n&uacute;mero 128;
-; el cursor `top_left_arrow' es el n&uacute;mero 132.
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">(let ((mpointer (x-get-resource &quot;*mpointer&quot;
- &quot;*emacs*mpointer&quot;)))
- ;; Si no se ha asignado tu puntero de rat&oacute;n
- ;; entonces asignalo, de otro modo, d&eacute;jalo as&iacute;:
- (if (eq mpointer nil)
- (setq mpointer &quot;132&quot;)) ; top_left_arrow
-</pre><pre class="smallexample"> (setq x-pointer-shape (string-to-int mpointer))
- (set-mouse-color &quot;white&quot;))
-</pre></div>
-
-</li><li>-
-O se pueden asignar los valores de una variedad de funcionalidades en
-una alist, como esta:
-
-<div class="smallexample">
-<pre class="smallexample">(setq-default
- default-frame-alist
- '((cursor-color . &quot;white&quot;)
- (mouse-color . &quot;white&quot;)
- (foreground-color . &quot;white&quot;)
- (background-color . &quot;DodgerBlue4&quot;)
- ;; (cursor-type . bar)
- (cursor-type . box)
-</pre><pre class="smallexample"> (tool-bar-lines . 0)
- (menu-bar-lines . 1)
- (width . 80)
- (height . 58)
- (font .
- &quot;-Misc-Fixed-Medium-R-Normal--20-200-75-75-C-100-ISO8859-1&quot;)
- ))
-</pre></div>
-
-</li><li>-
-Convierte <kbd>&lt;CTRL&gt;-h</kbd> dentro &lt;DEL&gt; y &lt;DEL&gt; dentro de
-<kbd>&lt;CTRL&gt;-h</kbd>.<br> (Algunos viejos teclados lo necesitan, aunque yo
-no he visto el problema recientemente.)
-
-<div class="smallexample">
-<pre class="smallexample">;; Traducir `C-h' a &lt;DEL&gt;.
-; (keyboard-translate ?\C-h ?\C-?)
-
-;; Traducir &lt;DEL&gt; a `C-h'.
-(keyboard-translate ?\C-? ?\C-h)
-</pre></div>
-
-</li><li>- &iexcl;Desactiva un cursor oculto!
-
-<div class="smallexample">
-<pre class="smallexample">(if (fboundp 'blink-cursor-mode)
- (blink-cursor-mode -1))
-</pre></div>
-
-<p>o empieza GNU Emacs con el comando <code>emacs -nbc</code>.
-</p>
-</li><li>- Cuando se usa &lsquo;grep&rsquo;<br>
-&lsquo;<samp>-i</samp>&rsquo;&nbsp; Ignore distinciones de letras<br> &lsquo;<samp>-n</samp>&rsquo;&nbsp; El
-prefijo de cada l&iacute;nea de la salida con el n&uacute;mero de
-l&iacute;neas<br> &lsquo;<samp>-H</samp>&rsquo;&nbsp; Imprime el nombre de fichero
-para cada cadena encontrada.<br> &lsquo;<samp>-e</samp>&rsquo;&nbsp; Protege patrones
-empezando con un caracter de gui&oacute;n, &lsquo;<samp>-</samp>&rsquo;
-
-<div class="smallexample">
-<pre class="smallexample">(setq grep-command &quot;grep -i -nH -e &quot;)
-</pre></div>
-
-
-</li><li>- Encuentra un b&uacute;ffer existente, incluso si eso tiene un nombre
-diferente<br>
-Esto evita problemas con enlaces simb&oacute;licos.
-
-<div class="smallexample">
-<pre class="smallexample">(setq find-file-existing-other-name t)
-</pre></div>
-
-</li><li>- Configura tu entorno de lenguaje y el m&eacute;todo de entrada por defecto
-
-<div class="smallexample">
-<pre class="smallexample">(set-language-environment &quot;latin-1&quot;)
-;; Recuerda que se puede habilitar o deshabilitar el texto de lenguaje
-;; multilingüe con el comando <code>toggle-input-method'</code> (<kbd>C-\</kbd>)
-(setq default-input-method &quot;latin-1-prefix&quot;)
-</pre></div>
-
-<p>Si se quiere escribir con el caracter Chino &lsquo;GB&rsquo;, asigna esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(set-language-environment &quot;Chinese-GB&quot;)
-(setq default-input-method &quot;chinese-tonepy&quot;)
-</pre></div>
-</li></ul>
-
-<a name="Arreglando-Atajos-de-Teclados"></a>
-<h4 class="subsubheading">Arreglando Atajos de Teclados</h4>
-<a name="index-Atajos-de-Teclado_002c-arreglando"></a>
-<a name="index-Asociaciones_002c-teclas_002c-arreglando"></a>
-
-<p>Algunos sistemas asocian teclas de maneras no agradables. Algunas
-veces, por ejemplo, la tecla &lt;CTRL&gt; en un modo perverso en vez de
-la lejan&iacute;a a la izquierda de la fila.
-</p>
-<p>Normalmente, cuando las personas arreglan estos atajos de teclado, no
-se cambia su fichero &lsquo;<tt>~/.emacs</tt>&rsquo;. En vez de eso, se asocian las
-teclas apropiadas en sus consolas con los comandos <code>loadkeys</code> o
-<code>install-keymap</code> en su script de inicio y entonces incluyen
-comandos <code>xmodmap</code> en su fichero &lsquo;<tt>.xinitrc</tt>&rsquo; o
-&lsquo;<tt>.Xsession</tt>&rsquo; para X Windows.
-</p>
-<p>Para un script de inicio:
-</p>
-<div class="smallexample">
-<pre class="smallexample">loadkeys /usr/share/keymaps/i386/qwerty/emacs2.kmap.gz
-or
-install-keymap emacs2
-</pre></div>
-
-<p>Para un fichero &lsquo;<tt>.xinitrc</tt>&rsquo; o un fichero &lsquo;<tt>.Xsession</tt>&rsquo; cuando la
-tecla &lt;Caps Lock&gt; es que tan lejos de la fila del home:
-</p>
-<div class="smallexample">
-<pre class="smallexample"># Asocia la tecla etiquetada `Caps Lock' a `Control'
-# (Tal como un interfaz de usuario roto sugiere que el teclado hecho
-# piensa que los ordenadores son m&aacute;quinas de escribir desde 1885.)
-
-xmodmap -e &quot;clear Lock&quot;
-xmodmap -e &quot;add Control = Caps_Lock&quot;
-</pre></div>
-
-<p>En un &lsquo;<tt>.xinitrc</tt>&rsquo; o &lsquo;<tt>.Xsession</tt>&rsquo;, para convertir una tecla
-&lt;ALT&gt; a una tecla &lt;META&gt;:
-</p>
-<div class="smallexample">
-<pre class="smallexample"># Algunos teclados mal dise&ntilde;ados tienen una tecla etiquetada ALT y no Meta
-xmodmap -e &quot;keysym Alt_L = Meta_L Alt_L&quot;
-</pre></div>
-
-<hr>
-<a name="Mode-Line"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Miscel_00e1nea" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Una-linea-modificada"></a>
-<h2 class="section">16.14 Una l&iacute;nea modificada</h2>
-<a name="index-mode_002dline_002dformat"></a>
-<a name="index-Formato-de-Modo-Linea"></a>
-
-<p>Finalmente, una funcionalidad que realmente me gusta: un mode line
-modificado.
-</p>
-<p>Cuando se trabaja a trav&eacute;s de una red, se olvida que m&aacute;quina se
-est&aacute; usando. Tambi&eacute;n, se tiende a perder la traza de donde se
-est&aacute;, y a qu&eacute; l&iacute;nea se apunta.
-</p>
-<p>As&iacute; se resetea mi mode line para que se parezca a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">-:-- foo.texi rattlesnake:/home/bob/ Line 1 (Texinfo Fill) Top
-</pre></div>
-
-<p>Estoy visitando un fichero llamado &lsquo;<tt>foo.texi</tt>&rsquo;, en mi m&aacute;quina
-&lsquo;<tt>rattlesnake</tt>&rsquo; en mi b&uacute;ffer &lsquo;<tt>/home/bob</tt>&rsquo;. Yo estoy en la
-l&iacute;nea 1, en modo Texinfo, y estoy arriba del b&uacute;ffer.
-</p>
-<p>Mi fichero &lsquo;<tt>.emacs</tt>&rsquo; tiene una secci&oacute;n que se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;; Asigna un Mode Line que nos cuente que m&aacute;quina, que directorio,
-;; y que l&iacute;nea estoy on, m&aacute;s la informaci&oacute;n de client.
-(setq-default mode-line-format
- (quote
- (#(&quot;-&quot; 0 1
- (help-echo
- &quot;mouse-1: select window, mouse-2: delete others ...&quot;))
- mode-line-mule-info
- mode-line-modified
- mode-line-frame-identification
- &quot; &quot;
-</pre><pre class="smallexample"> mode-line-buffer-identification
- &quot; &quot;
- (:eval (substring
- (system-name) 0 (string-match &quot;\\..+&quot; (system-name))))
- &quot;:&quot;
- default-directory
- #(&quot; &quot; 0 1
- (help-echo
- &quot;mouse-1: select window, mouse-2: delete others ...&quot;))
- (line-number-mode &quot; Line %l &quot;)
- global-mode-string
-</pre><pre class="smallexample"> #(&quot; %[(&quot; 0 6
- (help-echo
- &quot;mouse-1: select window, mouse-2: delete others ...&quot;))
- (:eval (mode-line-mode-name))
- mode-line-process
- minor-mode-alist
- #(&quot;%n&quot; 0 2 (help-echo &quot;mouse-2: widen&quot; local-map (keymap ...)))
- &quot;)%] &quot;
- (-3 . &quot;%P&quot;)
- ;; &quot;-%-&quot;
- )))
-</pre></div>
-
-<p>Aqu&iacute;, se redefine el mode line por defecto. La
-mayor&iacute;a de las partes son desde el original; pero yo
-creo unos pocos cambios. Yo asigno el formato de mode line
-<em>default</em> as&iacute; como permitir varios modos, tales
-como Info, para sobreescribirlo.
-</p>
-<p>Muchos elementos en la lista son auto-explicativos:
-<code>mode-line-modified</code> es una variable que cuenta si el b&uacute;ffer ha
-sido modificado, <code>mode-name</code> cuenta el nombre del modo, y
-as&iacute;. Sin embargo, el formato parece complicado porque
-las dos funcionalidades no han sido discutidas.
-</p>
-<a name="index-Propiedades_002c-en-el-ejemplo-del-modo-linea"></a>
-<p>The first string in the mode line is a dash or hyphen, &lsquo;<samp>-</samp>&rsquo;. In the old
-days, it would have been specified simply as <code>&quot;-&quot;</code>. But nowadays,
-Emacs can add properties to a string, such as highlighting or, as in this
-case, a help feature. If you place your mouse cursor over the hyphen, some
-help information appears (By default, you must wait seven-tenths of a second
-before the information appears. You can change that timing by changing the
-value of <code>tooltip-delay</code>.)
-</p>
-<p>La nueva cadena de formato tiene una sintaxis especial:
-</p>
-<div class="smallexample">
-<pre class="smallexample">#(&quot;-&quot; 0 1 (help-echo &quot;mouse-1: select window, ...&quot;))
-</pre></div>
-
-<p>El <code>#(</code> empieza una lista. El primer elemento de la lista es la
-cadena en s&iacute;, solo un &lsquo;<samp>-</samp>&rsquo;. El segundo y tercer
-elemento especifica el rango a trav&eacute;s del cuarto elemento
-aplicado. Un rango empieza <em>despu&eacute;s</em> un car&aacute;cter,
-as&iacute; un cero significa el rango que empieza solo
-despu&eacute;s del primer caracter; un 1 significa que el rango finaliza
-solo despu&eacute;s del primer caracter. El tercer elemento es la propiedad
-para el rango. Eso consiste en una lista de propiedades, un nombre de
-propiedad, en este caso, &lsquo;<samp>help-echo</samp>&rsquo;, seguido por un valor, en
-este caso, una cadena. El segundo, tercer y cuarto elemento de este
-nuevo formato de cadena puede ser repetido.
-</p>
-<p>See <a href="elisp.html#Propiedades-de-Texto">Propiedades de Texto</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>, y ver <a href="elisp.html#Formato-Mode-Line">Formato Mode Line</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>,
-para m&aacute;s informaci&oacute;n.
-</p>
-<p><code>mode-line-buffer-identification</code> muestra el nombre del
-buffer. Eso es una lista empezando por <code>(#(&quot;%12b&quot; 0 4
-&hellip;</code>. El <code>#(</code> empieza la lista.
-</p>
-<p>El &lsquo;<samp>&quot;%12b&quot;</samp>&rsquo; muestra el nombre del actual b&uacute;ffer, usando la
-funci&oacute;n <code>buffer-name</code> con la que estamos familiarizados; el
-&lsquo;12&rsquo; especifica el n&uacute;mero m&aacute;ximo de caracteres que ser&aacute;n
-mostrados. Cuando un nombre tiene pocos caracteres, el espacio en
-blanco se a&ntilde;ade para rellenar este n&uacute;mero. (Los nombres del
-b&uacute;ffer puede y con frecuencia ser&aacute;n m&aacute;s largos de 12 caracteres;
-esta longitud funciona bien en la t&iacute;pica ventana de 80
-columnas de ancho.)
-</p>
-<p><code>:eval</code> dice evaluar la siguiente forma y usa el resultado como
-una cadena para mostrarse. En este caso, la expresi&oacute;n muestra el
-primer componente del sistema completo. El fin del primer componente
-es un &lsquo;<samp>.</samp>&rsquo; (&lsquo;periodo&rsquo;), as&iacute; se usa la funci&oacute;n
-<code>string-match</code> para contar el tama&ntilde;o del primer componente. La
-subcadena desde el caracter cero a este tama&ntilde;o del primer
-componente. La subcadena desde el caracter cero a este tama&ntilde;o es el
-nombre de la m&aacute;quina.
-</p>
-<p>Esta es la expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(:eval (substring
- (system-name) 0 (string-match &quot;\\..+&quot; (system-name))))
-</pre></div>
-
-<p>&lsquo;<samp>%[</samp>&rsquo; y &lsquo;<samp>%]</samp>&rsquo; causa un par de corchetes que aparezcan por cada
-edici&oacute;n nivel de edici&oacute;n recursiva editando el nivel. &lsquo;<samp>%n</samp>&rsquo;
-dice &lsquo;Encoger&rsquo; cuando esto puede hacerse. &lsquo;<samp>%P</samp>&rsquo; te cuenta el
-porcentaje del b&uacute;ffer que est&aacute; debajo de la ventana, o &lsquo;arriba&rsquo;,
-&lsquo;abajo&rsquo;, o &lsquo;todo&rsquo;. (Una min&uacute;scula &lsquo;<samp>p</samp>&rsquo; cuenta el porcentaje bajo
-el alto de la ventana.) &lsquo;<samp>%-</samp>&rsquo; inserta suficientes guiones para
-rellenar la l&iacute;nea.
-</p>
-<p>Recuerda, &ldquo;No tiene que gustarte Emacs para que le gustes&rdquo; &mdash; Emacs
-puede tener diferentes colores, diferentes comandos, y diferentes
-teclas que un Emacs por defecto.
-</p>
-<p>Por otro lado, si se quiere traer un plano &lsquo;fuera de la caja&rsquo; Emacs,
-sin personalizaci&oacute;n, escribe:
-</p>
-<div class="smallexample">
-<pre class="smallexample">emacs -q
-</pre></div>
-
-<p>Esto inicializar&aacute; un Emacs que <em>no</em> cargue tu &lsquo;<tt>~/.emacs</tt>&rsquo;
-fichero de inicializaci&oacute;n. Uno plano, el que trae Emacs por
-defecto. Nada m&aacute;s.
-</p>
-<hr>
-<a name="Depurando"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Inicializaci_00f3n-de-Emacs" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Mode-Line" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#depurar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Conclusi_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Depurando-1"></a>
-<h1 class="chapter">17 Depurando</h1>
-<a name="index-depurando"></a>
-
-<p>GNU Emacs tiene dos depuradores, <code>debug</code> y <code>edebug</code>. El
-primero es construido dentro de las tripas de Emacs y est&aacute; siempre
-contigo; el segundo requiere que exista una funci&oacute;n antes de que se
-pueda usar.
-</p>
-<p>Ambos depuradores son descritos extensivamente en <a href="elisp.html#Depurando">Depurando Programas Lisp</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>. En este cap&iacute;tulo, se explicar&aacute; un breve ejemplo
-de esto.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#depurar">17.1 <code>depurar</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo usar el depurador construido.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#debug_002don_002dentry">17.2 <code>debug-on-entry</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Empezar depurando cuando se llama a una
- funci&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#debug_002don_002dquit">17.3 <code>debug-on-quit</code> y <code>(debug)</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Empezar depurando cuando se sale con <kbd>C-g</kbd>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#edebug">17.4 El depurador de nivel de fuentes <code>edebug</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo usar Edebug, un depurador a nivel de
- fuentes.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Ejercicios-de-depuraci_00f3n">17.5 Ejercicios de depuraci&oacute;n</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-</table>
-
-<hr>
-<a name="depurar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Depurando" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#debug_002don_002dentry" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Conclusi_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="depurar-1"></a>
-<h2 class="section">17.1 <code>depurar</code></h2>
-<a name="index-depurar"></a>
-
-<p>Sup&oacute;n que se ha escrito una definici&oacute;n de funci&oacute;n que se
-pretende devolver la suma de los n&uacute;meros 1 a trav&eacute;s de un n&uacute;mero
-dado. (Esta es la funci&oacute;n <code>triangle</code> discutida
-pronto. V&eacute;ase la secci&oacute;n <a href="#Ejemplo-de-Decremento">Ejemplo con Contador de Decremento</a>, para una discusi&oacute;n.)
-</p>
-<p>Sin embargo, tu definici&oacute;n de funci&oacute;n tiene un error. Se ha
-malescrito &lsquo;<samp>1=</samp>&rsquo; por &lsquo;<samp>1-</samp>&rsquo;. Aqu&iacute; est&aacute; la
-definici&oacute;n rota:
-</p>
-<a name="index-triangle_002dbugged"></a>
-<div class="smallexample">
-<pre class="smallexample">(defun triangle-bugged (number)
- &quot;Devuelve suma de n&uacute;meros 1 a trav&eacute;s de NUMBER inclusive.&quot;
- (let ((total 0))
- (while (&gt; number 0)
- (setq total (+ total number))
- (setq number (1= number))) ; <span class="roman">Error aqu&iacute;.</span>
- total))
-</pre></div>
-
-<p>Si se est&aacute; leyendo esto en Info, se puede evaluar esta definici&oacute;n
-en el modo normal. Se ver&aacute; que <code>triangle-bugged</code> aparece en el
-&aacute;rea echo.
-</p>
-<p>Ahora eval&uacute;a la funci&oacute;n <code>triangle-bugged</code> con un argumento de
-4:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(triangle-bugged 4)
-</pre></div>
-
-<p>En un GNU Emacs reciente, se crear&aacute; e introducir&aacute; un b&uacute;ffer
-&lsquo;<tt>*Backtrace*</tt>&rsquo; que dice:
-</p>
-<div class="smallexample">
-<pre class="smallexample">---------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error: (void-function 1=)
- (1= number)
- (setq number (1= number))
- (while (&gt; number 0) (setq total (+ total number))
- (setq number (1= number)))
- (let ((total 0)) (while (&gt; number 0) (setq total ...)
- (setq number ...)) total)
- triangle-bugged(4)
-</pre><pre class="smallexample"> eval((triangle-bugged 4))
- eval-last-sexp-1(nil)
- eval-last-sexp(nil)
- call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-</pre></div>
-
-<p>(Se ha reformateado este ejemplo ligeramente; el depurador no contiene
-muchas l&iacute;neas. As&iacute;, se puede salir del
-depurador escribiendo <kbd>q</kbd> en el buffer &lsquo;<tt>*Backtrace*</tt>&rsquo;.)
-</p>
-<p>En la pr&aacute;ctica, debido a un error tan simple como este, la
-l&iacute;nea de &lsquo;error Lisp&rsquo; explica lo que se necesita saber
-para corregir la definici&oacute;n. La funci&oacute;n <code>1=</code> est&aacute;
-&lsquo;vac&iacute;a&rsquo;.
-</p>
-
-<p>Sin embargo, si no se conoce con bastante certeza lo que est&aacute;
-pasando, se puede leer la traza completa.
-</p>
-<p>En este caso, se necesita ejecutar una versi&oacute;n reciente de GNU
-Emacs, que autom&aacute;ticamente empieza el depurador que pone en el
-b&uacute;ffer &lsquo;<tt>*Backtrace*</tt>&rsquo;; o adem&aacute;s, se necesita para empezar el
-depurador manualmente como se describe debajo.
-</p>
-<p>Lee el b&uacute;ffer &lsquo;<tt>*Backtrace*</tt>&rsquo; de abajo a arriba; eso cuenta lo
-que le hizo a Emacs tener un error. Emacs hace una llamada interactiva
-a <kbd>C-x C-e</kbd> (<code>eval-last-sexp</code>), que lleva a la evaluaci&oacute;n
-de la expresi&oacute;n <code>triangle-bugged</code>. Cada l&iacute;nea de
-debajo cuenta lo que el int&eacute;rprete Lisp evalu&oacute;.
-</p>
-<p>La tercera l&iacute;nea desde lo alto del b&uacute;ffer es
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq number (1= number))
-</pre></div>
-
-<p>Emacs intent&oacute; evaluar esta expresi&oacute;n; para hacerlo
-as&iacute;, se intent&oacute; evaluar la expresi&oacute;n interna para
-ser mostrada en la segunda l&iacute;nea desde arriba:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(1= number)
-</pre></div>
-
-<p>Aqu&iacute; es donde el error ocurre; como se dice en la
-l&iacute;nea de arriba:
-</p>
-<div class="smallexample">
-<pre class="smallexample">Debugger entered--Lisp error: (void-function 1=)
-</pre></div>
-
-<p>Se puede corregir el error, reeval&uacute;a la definici&oacute;n de funci&oacute;n, y
-entonces se puede testear de nuevo.
-</p>
-<hr>
-<a name="debug_002don_002dentry"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Depurando" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#depurar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#debug_002don_002dquit" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Conclusi_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="debug_002don_002dentry-1"></a>
-<h2 class="section">17.2 <code>debug-on-entry</code></h2>
-<a name="index-debug_002don_002dentry"></a>
-
-<p>Un GNU Emacs actual abre el depurador autom&aacute;ticamente cuando la
-funci&oacute;n tiene un error.
-</p>
-
-<p>Incidentalmente, se puede empezar el depurador manualmente para todas
-las versiones de Emacs; la ventaja es que el depurador se ejecuta
-incluso si no se tiene un error en su c&oacute;digo. Algunas veces,
-&iexcl;su c&oacute;digo estar&aacute; libre de errores!
-</p>
-<p>Se puede introducir el depurador cuando se llama a la funci&oacute;n
-llamando <code>debug-on-entry</code>.
-</p>
-<p>Tipo:
-</p>
-<div class="smallexample">
-<pre class="smallexample">M-x debug-on-entry RET triangle-bugged RET
-</pre></div>
-
-<p>Ahora, eval&uacute;a lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(triangle-bugged 5)
-</pre></div>
-
-<p>Todas las versiones de Emacs crear&aacute;n un b&uacute;ffer &lsquo;<tt>*Backtrace*</tt>&rsquo;
-y cuenta tu que eso es el principio para evaluar la funci&oacute;n
-<code>triangle-bugged</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">---------- Buffer: *Backtrace* ----------
-Debugger entered--entering a function:
-* triangle-bugged(5)
- eval((triangle-bugged 5))
-</pre><pre class="smallexample"> eval-last-sexp-1(nil)
- eval-last-sexp(nil)
- call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-</pre></div>
-
-<p>En el b&uacute;ffer &lsquo;<tt>*Backtrace*</tt>&rsquo;, escribe <kbd>d</kbd>. Emacs evaluar&aacute;
-la primera expresi&oacute;n en <code>triangle-bugged</code>; el b&uacute;ffer se
-parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">---------- Buffer: *Backtrace* ----------
-Debugger entered--beginning evaluation of function call form:
-* (let ((total 0)) (while (&gt; number 0) (setq total ...)
- (setq number ...)) total)
-* triangle-bugged(5)
- eval((triangle-bugged 5))
-</pre><pre class="smallexample"> eval-last-sexp-1(nil)
- eval-last-sexp(nil)
- call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-</pre></div>
-
-<p>Ahora, escribe <kbd>d</kbd> de nuevo, ocho veces, lentamente. Cada vez que
-se escribe <kbd>d</kbd> Emacs evaluar&aacute; otra expresi&oacute;n en la
-definici&oacute;n de funci&oacute;n.
-</p>
-<p>Eventualmente, el b&uacute;ffer se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">---------- Buffer: *Backtrace* ----------
-Debugger entered--beginning evaluation of function call form:
-* (setq number (1= number))
-* (while (&gt; number 0) (setq total (+ total number))
- (setq number (1= number)))
-</pre><pre class="smallexample">* (let ((total 0)) (while (&gt; number 0) (setq total ...)
- (setq number ...)) total)
-* triangle-bugged(5)
- eval((triangle-bugged 5))
-</pre><pre class="smallexample"> eval-last-sexp-1(nil)
- eval-last-sexp(nil)
- call-interactively(eval-last-sexp)
----------- Buffer: *Backtrace* ----------
-</pre></div>
-
-<p>Finalmente, despu&eacute;s se escribe <kbd>d</kbd> dos veces m&aacute;s, Emacs lograr&aacute;
-el error y las dos l&iacute;neas superiores del buffer
-&lsquo;<tt>*Backtrace*</tt>&rsquo; se ve as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">---------- Buffer: *Backtrace* ----------
-Debugger entered--Lisp error: (void-function 1=)
-* (1= number)
-&hellip;
----------- Buffer: *Backtrace* ----------
-</pre></div>
-
-<p>Escribiendo <kbd>d</kbd>, ser&iacute;a capaz de pasear a trav&eacute;s de
-la funci&oacute;n.
-</p>
-<p>Se puede salir de un buffer &lsquo;<tt>*Backtrace*</tt>&rsquo; escribiendo <kbd>q</kbd>;
-esto se sale de la traza, pero no cancela <code>debug-on-entry</code>.
-</p>
-<a name="index-cancel_002ddebug_002don_002dentry"></a>
-<p>Para cancelar el efecto de <code>debug-on-entry</code>, llama a
-<code>cancel-debug-on-entry</code> y el nombre de la funci&oacute;n, como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">M-x cancel-debug-on-entry RET triangle-bugged RET
-</pre></div>
-
-<p>(Si est&aacute; leyendo esto en Info, cancela <code>debug-on-entry</code> ahora.)
-</p>
-<hr>
-<a name="debug_002don_002dquit"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Depurando" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#debug_002don_002dentry" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#edebug" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Conclusi_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="debug_002don_002dquit-y-_0028debug_0029"></a>
-<h2 class="section">17.3 <code>debug-on-quit</code> y <code>(debug)</code></h2>
-
-<p>Adici&oacute;n a la configuraci&oacute;n <code>debug-on-error</code> o llamando
-<code>debug-on-entry</code>, hay otros dos caminos para empezar <code>debug</code>.
-</p>
-<a name="index-debug_002don_002dquit"></a>
-<p>Se puede empezar <code>debug</code> siempre y cuando se escribe <kbd>C-g</kbd>
-(<code>keyboard-quit</code>) se configura la variable <code>debug-on-quit</code>
-para <code>t</code>. Esto es &uacute;til para depurar bucles infinitos.
-</p>
-<a name="index-_0028debug_0029-en-codigo"></a>
-<p>O, se puede insertar un l&iacute;nea que dice <code>(debug)</code>
-dentro de tu c&oacute;digo donde se quiere que el depurador empiece,
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun triangle-bugged (number)
- &quot;Devuelve suma de n&uacute;meros 1 a trav&eacute;s de NUMERO inclusive.&quot;
- (let ((total 0))
- (while (&gt; number 0)
- (setq total (+ total number))
- (debug) ; <span class="roman">Empieza el depurador.</span>
- (setq number (1= number))) ; <span class="roman">Error aqu&iacute;.</span>
- total))
-</pre></div>
-
-<p>La funci&oacute;n <code>debug</code> se describe en detalle en <a href="elisp.html#Depurador">El Depurador Lisp</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>.
-</p>
-<hr>
-<a name="edebug"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Depurando" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#debug_002don_002dquit" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicios-de-depuraci_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Conclusi_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-depurador-de-nivel-de-fuentes-edebug"></a>
-<h2 class="section">17.4 El depurador de nivel de fuentes <code>edebug</code></h2>
-<a name="index-Depurador-de-nivel-de-codigo"></a>
-<a name="index-edebug"></a>
-
-<p>Edebug es un depurador a nivel de fuentes Edebug que normalmente
-muestra las fuentes del c&oacute;digo que se est&aacute; depurando, con una
-flecha a la izquierda que muestra que l&iacute;nea se est&aacute;
-actualmente ejecutando.
-</p>
-<p>Se puede pasear a trav&eacute;s de la ejecuci&oacute;n de una funci&oacute;n,
-l&iacute;nea a l&iacute;nea, o ejecutarse r&aacute;pidamente
-hasta lograr un <em>punto de ruptura</em> donde la ejecuci&oacute;n pare.
-</p>
-<p>Edebug se describe en <a href="elisp.html#edebug">Edebug</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>.
-</p>
-<p>Aqu&iacute; hay una funci&oacute;n con errores para
-<code>triangle-recursively</code>. V&eacute;ase la secci&oacute;n <a href="#Funci_00f3n-recursiva-tri_00e1ngulo">Recursi&oacute;n en lugar de un contador</a>, para una revisi&oacute;n de eso.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun triangle-recursively-bugged (number)
- &quot;Devuelve la suma of n&uacute;meros 1 a trav&eacute;s de NUMBER inclusive.
-Usa recursi&oacute;n.&quot;
- (if (= number 1)
- 1
- (+ number
- (triangle-recursively-bugged
- (1= number))))) ; <span class="roman">Error aqu&iacute;.</span>
-</pre></div>
-
-<p>Normalmente, se instalar&iacute;a esta definici&oacute;n
-posicionando su cursor despu&eacute;s de la funci&oacute;n cerrando par&eacute;ntesis
-y escribiendo <kbd>C-x C-e</kbd> (<code>eval-last-sexp</code>) o lo dem&aacute;s
-posicionando tu cursor con la definici&oacute;n y escribiendo <kbd>C-M-x</kbd>
-(<code>eval-defun</code>). (Por defecto, el comando <code>eval-defun</code>
-funciona solo en modo Emacs Lisp o en el modo de interacci&oacute;n de
-Lisp.)
-</p>
-<p>Sin embargo, para preparar esta definici&oacute;n de funci&oacute;n para Edebug,
-se debe primero <em>instrumentar</em> el c&oacute;digo usando un comando
-diferente. Se puede hacer esto posicionando el cursor dentro o
-despu&eacute;s de la definici&oacute;n y escribiendo
-</p>
-<div class="smallexample">
-<pre class="smallexample">M-x edebug-defun RET
-</pre></div>
-
-<p>Esto causar&aacute; que Emacs cargue Edebug autom&aacute;ticamente si eso no
-est&aacute; ya cargado y, apropiadamente prepara la funci&oacute;n.
-</p>
-<p>Despu&eacute;s de preparar la funci&oacute;n, emplaza tu cursor despu&eacute;s
-de la siguiente expresi&oacute;n y escribe <kbd>C-x C-e</kbd> (<code>eval-last-sexp</code>):
-</p>
-<div class="smallexample">
-<pre class="smallexample">(triangle-recursively-bugged 3)
-</pre></div>
-
-<p>Se vuelve a las fuentes de <code>triangle-recursively-bugged</code> y el
-cursor se posiciona al principio del <code>if</code> de la
-l&iacute;nea de la funci&oacute;n. Tambi&eacute;n, se ver&aacute; una flecha
-en la mano izquierda al lado de esta l&iacute;nea donde la
-funci&oacute;n se est&aacute; ejecutando. (En los siguientes ejemplos, se
-muestra la flecha con &lsquo;<samp>=&gt;</samp>&rsquo;; en un sistema de ventanas, se puede
-ver la flecha como un tri&aacute;ngulo s&oacute;lido en el &lsquo;borde&rsquo; de la
-ventana.)
-</p>
-<div class="smallexample">
-<pre class="smallexample">=&gt;&lowast;(if (= number 1)
-</pre></div>
-
-<p>En el ejemplo, la localizaci&oacute;n del punto es mostrado como
-&lsquo;<samp>&lowast;</samp>&rsquo; (en un libro impreso, eso es mostrado con una estrella
-apuntada).
-</p>
-<p>Si ahora se presiona &lt;SPC&gt;, el punto se mover&aacute; a la siguiente
-expresi&oacute;n para ejecutarse; la l&iacute;nea se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">=&gt;(if &lowast;(= number 1)
-</pre></div>
-
-<p>Como se continua presionando &lt;SPC&gt;, el puntero se mover&aacute; desde
-la expresi&oacute;n a la expresi&oacute;n. Al mismo tiempo, siempre y cuando una
-expresi&oacute;n devuelva un valor, este valor ser&aacute; mostrado en el &aacute;rea
-echo. Por ejemplo, despu&eacute;s de mover el punto pasado <code>number</code>,
-se ver&aacute; lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">Resultado: 3 (#o3, #x3, ?\C-c)
-</pre></div>
-
-<p>Esto significa el valor de <code>number</code> es 3, que son tres octales,
-tres hexadecimales, y <small>ASCII</small> &lsquo;control-c&rsquo; (la tercera letra del
-alfabeto, en caso de que se necesite conocer esta informaci&oacute;n).
-</p>
-<p>Uno puede continuar movi&eacute;ndose a trav&eacute;s del c&oacute;digo hasta que
-logre la l&iacute;nea con el error. Antes de la evaluaci&oacute;n,
-esta l&iacute;nea se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">=&gt; &lowast;(1= number))))) ; <span class="roman">Error aqu&iacute;.</span>
-</pre></div>
-
-<p>Cuando se presiona &lt;SPC&gt; una vez de nuevo, se producir&aacute; un
-mensaje de error que dice:
-</p>
-<div class="smallexample">
-<pre class="smallexample">La definici&oacute;n de la funci&oacute;n est&aacute; vac&iacute;o: 1=
-</pre></div>
-
-<p>Este es el error.
-</p>
-<p>Presiona <kbd>q</kbd> para salir de Edebug.
-</p>
-<p>Para eliminar la instrumentaci&oacute;n desde una definici&oacute;n de
-funci&oacute;n, simplemente se reeval&uacute;a con un comando que no lo
-instrumente. Por ejemplo, se podr&iacute;a posicionar su cursor
-despu&eacute;s de la definici&oacute;n cerrando par&eacute;ntesis y escribiendo
-<kbd>C-x C-e</kbd>.
-</p>
-<p>Edebug hace un gran trato antes de entrar en una funci&oacute;n. Se puede
-dirigir as&iacute; mismo, parando solo en un error o en puntos
-espec&iacute;ficos, se puede causar para mostrar los valores
-cambiantes de varias expresiones; se puede encontrar cuantas veces una
-funci&oacute;n se llama, y m&aacute;s.
-</p>
-<p>Edebug se describe en <a href="elisp.html#edebug">Edebug</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>.
-</p>
-<hr>
-<a name="Ejercicios-de-depuraci_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Depurando" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#edebug" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Depurando" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Conclusi_00f3n" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Conclusi_00f3n" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Ejercicios-de-depuracion"></a>
-<h2 class="section">17.5 Ejercicios de depuraci&oacute;n</h2>
-
-<ul>
-<li>
-Instale la funci&oacute;n <code>count-words-example</code> y provoque que se
-introduzca el depurador construido cuando se llame. Ejecute el comando
-en una regi&oacute;n conteniendo dos palabras. Se necesitar&aacute; presionar
-<kbd>d</kbd> un n&uacute;mero remarcable de veces. En el sistema, es un &lsquo;hook&rsquo;
-llamado despu&eacute;s que el comando se finaliza. (Para informaci&oacute;n sobre
-hooks, mira <a href="elisp.html#Resumen-de-Comandos">Resumen del Comando Bucle</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>.)
-
-</li><li>
-Copie <code>count-words-example</code> dentro del b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo;,
-instrumente la funci&oacute;n para Edebug, y navegue a trav&eacute;s de su
-ejecuci&oacute;n. La funci&oacute;n no necesita tener un error, aunque se puede
-introducir uno si se desea. Si a la funci&oacute;n le falta un error, el
-paseo se completa sin problemas.
-
-</li><li>
-Mientras se ejecuta Edebug, escriba <kbd>?</kbd> para ver una lista de todos
-los comandos Edebug. (El <code>global-edebug-prefix</code> normalmente es
-<kbd>C-x X</kbd>, por ej <kbd>&lt;CTRL&gt;-x</kbd> seguido por una tecla
-may&uacute;scula <kbd>X</kbd>; use este prefijo para comandos hechos fuera del
-b&uacute;ffer de depuraci&oacute;n Edebug.)
-
-</li><li>
-En el b&uacute;ffer de depuraci&oacute;n Edebug, usa el comando <kbd>p</kbd>
-(<code>edebug-bounce-point</code>) para ver si <code>count-words-example</code>
-est&aacute; funcionando.
-
-</li><li>
-Mueve el punto a alg&uacute;n sitio debajo de la funci&oacute;n y entonces
-escribe el comando <kbd>h</kbd> (<code>edebug-goto-here</code>) para saltar a
-esta localizaci&oacute;n.
-
-</li><li>
-Usa el comando <kbd>t</kbd> (<code>edebug-trace-mode</code>) para causar que
-Edebug pasee a trav&eacute;s de la funci&oacute;n en s&iacute;; usa una
-letra may&uacute;scula <kbd>T</kbd> para <code>edebug-Trace-fast-mode</code>.
-
-</li><li>
-Asigna un punto de ruptura, entonces ejecuta Edebug en modo Traza
-hasta que se logre el punto de parada.
-</li></ul>
-
-<hr>
-<a name="Conclusi_00f3n"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Depurando" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejercicios-de-depuraci_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#the_002dthe" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#the_002dthe" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Conclusion"></a>
-<h1 class="chapter">18 Conclusi&oacute;n</h1>
-
-<p>Ahora se ha llegado al fin de esta Introducci&oacute;n. Se ha aprendido lo
-suficiente acerca de programaci&oacute;n en Emacs Lisp para asignar
-valores, para escribir ficheros &lsquo;<tt>.emacs</tt>&rsquo; para t&iacute;
-mismo y tus amigos, y escribir personalizaciones simples y extensiones
-a Emacs.
-</p>
-<p>Este es un lugar para parar. O, si se desea, se puede ir adelante, y
-aprender m&aacute;s por uno mismo.
-</p>
-<p>Se han aprendido algunas bases de programaci&oacute;n. Pero solo
-algunas. Todav&iacute;a hay muchas cosas que son f&aacute;ciles de
-usar que no se han tocado.
-</p>
-<p>Otra idea para seguir es leer las fuentes de Emacs o
-<cite>El Manual de Referencia de GNU Emacs</cite>.
-</p>
-<p>Las fuentes de Emacs Lisp son una aventura. Cuando se leen las fuentes
-vienen a trav&eacute;s de una funci&oacute;n o expresi&oacute;n que nos es familiar,
-se necesita imaginar o encontrar qu&eacute; se hace.
-</p>
-<p>Ir al Manual de Referencia. Eso est&aacute; a trav&eacute;s del completo, limpio
-y f&aacute;cil de leer descripci&oacute;n de Emacs Lisp. Est&aacute; escrito no solo
-para expertos, pero s&iacute; para gente que conoce lo que
-usted conoce. (El <cite>Manual de Referencia</cite> viene con la
-distribuci&oacute;n de GNU Emacs. Como esta introducci&oacute;n, viene como un
-fichero fuente Texinfo, as&iacute; se puede leer on-line como
-un libro impreso.)
-</p>
-<p>Ir a otra ayuda on-line que sea parte de GNU Emacs: la documentaci&oacute;n
-on-line para todas las funciones y variables, y <code>find-tag</code>, el
-programa que va a las fuentes.
-</p>
-<p>Aqu&iacute; hay un ejemplo de c&oacute;mo explorar las
-fuentes. Porque su nombre, &lsquo;<tt>simple.el</tt>&rsquo; es el fichero que se vi&oacute;
-primero, hace tiempo. Como eso ocurre alguna de las funciones en
-&lsquo;<tt>simple.el</tt>&rsquo; son complicadas, o al menos parece complicado a
-primera vista. La funci&oacute;n <code>open-line</code>, por ejemplo, parece
-complicada.
-</p>
-<p>Se puede querer pasear a trav&eacute;s de esta funci&oacute;n lentamente, como
-nosotros hicimos la funci&oacute;n
-<code>forward-sentence</code>. (V&eacute;ase la secci&oacute;n <a href="#forward_002dsentence">La funci&oacute;n <code>forward-sentence</code></a>.) O se puede querer salir de esta funci&oacute;n
-y mirar en otra, tal como <code>split-line</code>. No se necesita leer todas
-las funciones. De acuerdo a <code>count-words-in-defun</code>, la funci&oacute;n
-<code>split-line</code> contiene 102 palabras y s&iacute;mbolos.
-</p>
-<p>Incluso aunque sean pocas, <code>split-line</code> contiene expresiones que
-no se han estudiado: <code>skip-chars-forward</code>, <code>indent-to</code>,
-<code>current-column</code> y <code>insert-and-inherit</code>.
-</p>
-<p>Considera la funci&oacute;n <code>skip-chars-forward</code>. (Eso es parte de la
-definici&oacute;n de funci&oacute;n para <code>back-to-indentation</code>, que
-muestra la <a href="#Revisar">Revisar</a>.)
-</p>
-<p>En GNU Emacs, se puede encontrar m&aacute;s acerca de
-<code>skip-chars-forward</code> escribiendo <kbd>C-h f</kbd>
-(<code>describe-function</code>) y el nombre de la funci&oacute;n. Esto te da la
-documentaci&oacute;n de funci&oacute;n.
-</p>
-<p>Se puede ser capaz de adivinar que se hace por una funci&oacute;n bien
-llamada tal como <code>indent-to</code>; o se puede buscar,
-tambi&eacute;n. Incidentalmente, la funci&oacute;n <code>describe-function</code> en
-s&iacute; est&aacute; en &lsquo;<tt>help.el</tt>&rsquo;; esta es una de estas largas,
-pero descifrables funciones. &iexcl;Se puede buscar
-<code>describe-function</code> usando el comando <kbd>C-h f</kbd>!
-</p>
-<p>En esta instancia, desde el c&oacute;digo es Lisp, el b&uacute;ffer
-&lsquo;<tt>*Help*</tt>&rsquo; contiene el nombre de la librer&iacute;a
-conteniendo las fuentes de la funci&oacute;n. Se puede poner el punto a
-trav&eacute;s del nombre de la librer&iacute;a y presiona la tecla
-RET, que est&aacute; en esta situaci&oacute;n est&aacute; asociado a
-<code>help-follow</code>, y se toma directamente de las fuentes, en el mismo
-camino que <kbd>M-.</kbd> (<code>find-tag</code>).
-</p>
-<p>La definici&oacute;n para <code>describe-function</code> ilustra como
-personalizar las expresiones <code>interactive</code> sin usar los c&oacute;digos
-de caracter est&aacute;ndar y eso muestra como crear un b&uacute;ffer temporal.
-</p>
-<p>(La funci&oacute;n <code>indent-to</code> es escrita en C en vez de Emacs Lisp;
-eso es una funci&oacute;n &lsquo;construida&rsquo;. <code>help-follow</code> toma su fuente
-como <code>find-tag</code>, cuando se configura apropiadamente.)
-</p>
-<p>Se puede mirar en las fuentes de la funci&oacute;n usando <code>find-tag</code>,
-que est&aacute; asociado a <kbd>M-.</kbd>. Finalmente, se puede encontrar que el
-Manual de Referencia tiene que decir visitando el manual en Info, y
-escribiendo <kbd>i</kbd> (<code>Info-index</code>) y el nombre de la funci&oacute;n, o
-buscando la funci&oacute;n en el &iacute;ndice a una copia impresa
-del manual.
-</p>
-<p>Similarmente, se puede encontrar que significa por
-<code>insert-and-inherit</code>.
-</p>
-<p>Otros ficheros fuente interesantes incluyen &lsquo;<tt>paragraphs.el</tt>&rsquo;,
-&lsquo;<tt>loaddefs.el</tt>&rsquo; y &lsquo;<tt>loadup.el</tt>&rsquo;. El fichero &lsquo;<tt>paragraphs.el</tt>&rsquo;
-incluye ordenar, funciones f&aacute;cilmente comprendidas tan bien como las
-largas. El fichero &lsquo;<tt>loaddefs.el</tt>&rsquo; contiene muchos autoloads
-est&aacute;ndar y muchos mapas de teclado. Nunca se ha buscado en todo;
-solo en las partes. &lsquo;<tt>loadup.el</tt>&rsquo; es el fichero que carga las
-partes est&aacute;ndar de Emacs; eso cuenta un gran trato acerca de c&oacute;mo
-Emacs est&aacute; construido. (See <a href="elisp.html#Construyendo-Emacs">Construyendo Emacs</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>, para m&aacute;s
-acerca de construcci&oacute;n.)
-</p>
-<p>Como dije, se han aprendido algunas cosas; sin embargo, y de manera
-muy importante, se han tocado fuertes aspectos de la programaci&oacute;n;
-no se ha dicho nada acerca de como ordenar la informaci&oacute;n, excepto
-para usar la funci&oacute;n predefinida <code>sort</code>; no se ha dicho nada
-acerca de c&oacute;mo almacenar la informaci&oacute;n, excepto para usar
-variables y listas; no se ha dicho nada acerca de como escribir
-programas que escriben programas. Esto son asuntos para otro tipo
-diferente de libro, un diferente tipo de aprendizaje.
-</p>
-<p>Lo que se ha hecho es aprender lo suficiente para hacer mucho trabajo
-pr&aacute;ctico con GNU Emacs. Lo que se ha hecho es comenzar. Este es el
-fin del principio de una gran amistad.
-</p>
-
-<hr>
-<a name="the_002dthe"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Conclusi_00f3n" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Conclusi_00f3n" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Kill-Ring" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Kill-Ring" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-the_002dthe"></a>
-<h1 class="appendix">Appendix A La funci&oacute;n <code>the-the</code></h1>
-<a name="index-the_002dthe"></a>
-<a name="index-Funcion-de-palabras-duplicadas"></a>
-<a name="index-Palabras_002c-duplicadas"></a>
-
-<p>Algunas veces cuando se se escribe texto, se duplican palabras &mdash; como
-con &ldquo;se se&rdquo; cerca del principio de esta frase. Se encuentra que lo
-m&aacute;s frecuente, es duplicar &ldquo;el&rdquo;; aqu&iacute;, se llama a la
-funci&oacute;n para detectar las palabras duplicadas, <code>the-the</code>.
-</p>
-<p>Como primer paso, se podr&iacute;an usar las siguientes
-expresiones regulares para buscar duplicados:
-</p>
-<div class="smallexample">
-<pre class="smallexample">\\(\\w+[ \t\n]+\\)\\1
-</pre></div>
-
-<p>Este regexp asocia uno o m&aacute;s caracteres que constituyen palabras
-seguidas por uno o m&aacute;s espacios, tabuladores, o nuevas
-l&iacute;neas. Sin embargo, eso no detecta palabras duplicadas
-en diferentes l&iacute;neas, desde la finalizaci&oacute;n de la
-primera palabra, el fin de la l&iacute;nea, es diferente desde
-el fin de la segunda palabra, un espacio. (Para m&aacute;s informaci&oacute;n
-acerca de expresiones regulares, mira el <a href="#Buscar-regexp">B&uacute;squedas de Expresiones Regulares</a>, tan bien como la <a href="emacs.html#Regexps">Sintaxis de Expresiones Regulares</a> in <cite>El Manual de GNU Emacs</cite>, y la
-<a href="elisp.html#Expresiones-Regulares">Expresiones Regulares</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>.)
-</p>
-<p>Se podr&iacute;an intentar buscar caracteres duplicados pero no
-si el patr&oacute;n detecta dobles tales como las dos ocurrencias de &lsquo;th&rsquo;
-en &lsquo;with the&rsquo;.
-</p>
-<p>Otro posible regexp busca caracteres constituyentes de palabras
-seguidos por caracteres de no palabras constituyentes,
-reduplicadas. Aqu&iacute;, &lsquo;<samp>\\w+</samp>&rsquo; asocia a una o m&aacute;s
-caracteres de palabras constituyente y &lsquo;<samp>\\W*</samp>&rsquo; asocia cero o
-m&aacute;s caracteres que no constituyen palabras.
-</p>
-<div class="smallexample">
-<pre class="smallexample">\\(\\(\\w+\\)\\W*\\)\\1
-</pre></div>
-
-<p>De nuevo, no &uacute;til.
-</p>
-<p>Aqu&iacute; est&aacute; el patr&oacute;n que uso. No es perfecto, pero
-suficientemente bueno. &lsquo;<samp>\\b</samp>&rsquo; asocia la cadena
-vac&iacute;a provista al principio o fin de una palabra;
-&lsquo;<samp>[^@&nbsp;\n\t]+</samp>&rsquo; asocia una o m&aacute;s ocurrencias de qu&eacute;
-caracteres que <em>no</em> son un @-signo, espacio, nueva
-l&iacute;nea, o tabulador.
-</p>
-<div class="smallexample">
-<pre class="smallexample">\\b\\([^@ \n\t]+\\)[ \n\t]+\\1\\b
-</pre></div>
-
-<p>Uno puede escribir expresiones m&aacute;s complicadas, pero esta
-expresi&oacute;n es suficientemente buena as&iacute;.
-</p>
-<p>Aqu&iacute; est&aacute; la funci&oacute;n <code>the-the</code>, como se incluye
-en mi fichero &lsquo;<tt>.emacs</tt>&rsquo;, a lo largo de un atajo global manejable:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun the-the ()
- &quot;Busca hacia adelante para una palabra duplicada.&quot;
- (interactive)
- (message &quot;Buscando palabras duplicadas ...&quot;)
- (push-mark)
-</pre><pre class="smallexample"> ;; Este regexp no es perfecto
- ;; pero es limpiamente bueno a pesar de todo:
- (if (re-search-forward
- &quot;\\b\\([^@ \n\t]+\\)[ \n\t]+\\1\\b&quot; nil 'move)
- (message &quot;Palabra encontrada duplicada.&quot;)
- (message &quot;Fin de b&uacute;ffer&quot;)))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;; Asocia `the-the' a C-c \
-(global-set-key &quot;\C-c\\&quot; 'the-the)
-</pre></div>
-
-<br>
-<p>Aqu&iacute; est&aacute; el test del texto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">uno dos tres cuatro cinco
-cinco seis siete
-</pre></div>
-
-<p>Se pueden sustituir las otras expresiones regulares mostradas debajo en
-la definici&oacute;n de funci&oacute;n y se prueba cada una de ellas en esta lista.
-</p>
-<hr>
-<a name="Kill-Ring"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#the_002dthe" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#the_002dthe" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Qu_00e9-hace-el-anillo-de-la-muerte" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Manejando-el-anillo-de-la-muerte"></a>
-<h1 class="appendix">Appendix B Manejando el anillo de la muerte</h1>
-<a name="index-Manejando-el-anillo-de-la-muerte"></a>
-<a name="index-Manejando-el-anillo-de-la-muerte-1"></a>
-<a name="index-Anillo_002c-creando-un-lista-como-un"></a>
-
-<p>El anillo de la muerte es una lista que es transformada dentro de un
-anillo que trabaja con la funci&oacute;n <code>current-kill</code>. Los comandos
-<code>yank</code> y <code>yank-pop</code> usan la funci&oacute;n <code>current-kill</code>.
-</p>
-<p>Este ap&eacute;ndice describe la funci&oacute;n <code>current-kill</code> y los
-comandos <code>yank</code> y <code>yank-pop</code>, pero primero, considere los
-trabajo del kill ring.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Qu_00e9-hace-el-anillo-de-la-muerte">Qu&eacute; hace el anillo de la muerte</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-<tr><td align="left" valign="top"><a href="#current_002dkill">B.1 La funci&oacute;n <code>current-kill</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> current-kill
-</td></tr>
-<tr><td align="left" valign="top"><a href="#pegar">B.2 <code>pegar</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Pegar una copia de un elemento ya cortado.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#yank_002dpop">B.3 <code>yank-pop</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Insertar elemento apuntado.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#fichero-anillo">B.4 El fichero &lsquo;<tt>ring.el</tt>&rsquo;</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> fichero anillo
-</td></tr>
-</table>
-
-<hr>
-<a name="Qu_00e9-hace-el-anillo-de-la-muerte"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Kill-Ring" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Kill-Ring" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Kill-Ring" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#current_002dkill" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Que-hace-el-anillo-de-la-muerte"></a>
-<h2 class="unnumberedsec">Qu&eacute; hace el anillo de la muerte</h2>
-
-<p>El anillo de la muerte <em>kill ring</em> tiene el tama&ntilde;o m&aacute;ximo de
-sesenta elementos; hacer una explicaci&oacute;n con este n&uacute;mero m&aacute;ximo
-quedar&iacute;a demasiado larga. En vez de eso, pensemos qu&eacute;
-ocurre si se as&iacute;gna a cuatro. Por favor, eval&uacute;e lo
-siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq old-kill-ring-max kill-ring-max)
-(setq kill-ring-max 4)
-</pre></div>
-
-<p>Entonces, por favor, copie cada l&iacute;nea del siguiente
-ejemplo indentado dentro del anillo de la muerte <em>kill ring</em>. Se
-puede cortar cada l&iacute;nea con <kbd>C-k</kbd> o marcarla y
-copiarla con <kbd>M-w</kbd>.
-</p>
-<p>(En un b&uacute;ffer de solo lectura, tal como el b&uacute;ffer &lsquo;<tt>*info*</tt>&rsquo;, el
-comando kill, <kbd>C-k</kbd> (<code>kill-line</code>), no eliminar&aacute; el texto,
-solamente lo mueve al anillo de la muerte <em>kill ring</em>. Sin
-embargo, el ordenador puede avisar con un beep. Alternativamente, para
-silenciar, se puede copiar la regi&oacute;n de cada l&iacute;nea con
-el comando <kbd>M-w</kbd> (<code>kill-ring-save</code>). Se debe marcar cada
-l&iacute;nea de este comando para tener &eacute;xito, pero no
-importa si al final se posiciona en el punto o la marca).
-</p>
-<p>Por favor, invoque las llamadas en orden, de modo que los cinco
-elementos rellenen el anillo de la muerte <em>kill ring</em>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">primero algo de texto
-segunda pieza de texto
-tercera l&iacute;nea
-cuarta l&iacute;nea de texto
-quinto bit de texto
-</pre></div>
-
-<p>Entonces encuentra el valor de <code>kill-ring</code> evaluando
-</p>
-<div class="smallexample">
-<pre class="smallexample">kill-ring
-</pre></div>
-
-<p>Eso es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(&quot;quinto bit de texto&quot; &quot;cuarta l&iacute;nea de texto&quot;
-&quot;tercera l&iacute;nea&quot; &quot;segunda pieza de texto&quot;)
-</pre></div>
-
-<p>El primer elemento, &lsquo;<samp>primero algo de texto</samp>&rsquo;, fu&eacute; borrado.
-</p>
-<p>Para devolver el viejo valor para el tama&ntilde;o del kill ring, eval&uacute;e:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq kill-ring-max old-kill-ring-max)
-</pre></div>
-
-<hr>
-<a name="current_002dkill"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Kill-Ring" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Qu_00e9-hace-el-anillo-de-la-muerte" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Kill-Ring" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#C_00f3digo-para-current_002dkill" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-current_002dkill"></a>
-<h2 class="appendixsec">B.1 La funci&oacute;n <code>current-kill</code></h2>
-<a name="index-current_002dkill"></a>
-
-<p>La funci&oacute;n <code>current-kill</code> cambia el elemento en el anillo de la
-muerte <em>kill ring</em> para el que el <code>kill-ring-yank-pointer</code>
-apunta. (Tambi&eacute;n, la funci&oacute;n <code>kill-new</code> asigna
-<code>kill-ring-yank-pointer</code> para apuntar al &uacute;ltimo elemento del
-anillo de la muerte <em>kill ring</em>. La funci&oacute;n <code>kill-new</code> se
-usa directamente o indirectamente por <code>kill-append</code>,
-<code>copy-region-as-kill</code>, <code>kill-ring-save</code>, <code>kill-line</code>, y
-<code>kill-region</code>.)
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#C_00f3digo-para-current_002dkill">El c&oacute;digo <code>current-kill</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;digo para current-kill
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Comprendiendo-current_002dkill"><code>current-kill</code> en outline</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Comprendiendo current-kill
-</td></tr>
-</table>
-
-<hr>
-<a name="C_00f3digo-para-current_002dkill"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Kill-Ring" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#current_002dkill" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#current_002dkill" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Comprendiendo-current_002dkill" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-codigo-current_002dkill"></a>
-<h3 class="unnumberedsubsec">El c&oacute;digo <code>current-kill</code></h3>
-
-
-<p>La funci&oacute;n <code>current-kill</code> es usada por <code>yank</code> y por
-<code>yank-pop</code>. Aqu&iacute; est&aacute; el c&oacute;digo para
-<code>current-kill</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun current-kill (n &amp;optional do-not-move)
-&quot;Rota el punto de pegue por N lugares, y entonces devuelve lo cortado.
-Si N es cero, `interprogram-paste-function' se asigna, y si se llama
-devuelve una cadena, entonces esta cadena se a&ntilde;ade al frente del
-anillo de la muerte <em>kill ring</em> y devuelve el &uacute;ltimo corte.
-</pre><pre class="smallexample">Si el argumento opcional DO-NOT-MOVE es no nulo, entonces no muevas el
-punto de pegue; solo devuelve el Nth corte hacia adelante.
- (let ((interprogram-paste (and (= n 0)
- interprogram-paste-function
- (funcall interprogram-paste-function)))))
-</pre><pre class="smallexample"> (if interprogram-paste
- (progn
- ;; Deshabilita el programa de la funci&oacute;n de corte cuando se
- ;; a&ntilde;ade el nuevo texto al anillo de la muerte <em>kill ring</em>,
- ;; as&iacute; Emacs no intenta poseer la selecci&oacute;n
- ;; con id&eacute;ntico texto.
- (let ((interprogram-cut-function nil))
- (kill-new interprogram-paste))
- interprogram-paste)
-</pre><pre class="smallexample"> (or kill-ring (error &quot;Kill ring is empty&quot;))
- (let ((ARGth-kill-element
- (nthcdr (mod (- n (length kill-ring-yank-pointer))
- (length kill-ring))
- kill-ring)))
- (or do-not-move
- (setq kill-ring-yank-pointer ARGth-kill-element))
- (car ARGth-kill-element)))))
-</pre></div>
-
-<p>Recuerde tambi&eacute;n que la funci&oacute;n <code>kill-new</code> asigna
-<code>kill-ring-yank-pointer</code> al &uacute;ltimo elemento del anillo de la
-muerte <em>kill ring</em>, que significa que todas las funciones lo
-llaman y asigna el valor de manera indirecta: <code>kill-append</code>,
-<code>copy-region-as-kill</code>, <code>kill-ring-save</code>, <code>kill-line</code> y
-<code>kill-region</code>.
-</p>
-<p>Aqu&iacute; est&aacute; la l&iacute;nea en <code>kill-new</code>,
-que se explica en la <a href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code></a>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq kill-ring-yank-pointer kill-ring)
-</pre></div>
-
-<hr>
-<a name="Comprendiendo-current_002dkill"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Kill-Ring" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#C_00f3digo-para-current_002dkill" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#current_002dkill" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Cuerpo-de-current_002dkill" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="current_002dkill-en-outline"></a>
-<h3 class="unnumberedsubsec"><code>current-kill</code> en outline</h3>
-
-<p>La funci&oacute;n <code>current-kill</code> parece compleja, pero usual, eso
-puede ser comprendido tom&aacute;ndolo aparte pieza por pieza. Primero
-m&iacute;ralo en la forma esquel&eacute;tica:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun current-kill (n &amp;optional do-not-move)
- &quot;Rota el punto a pegar por N lugares, y entonces devuelve el texto cortado.&quot;
- (let <var>varlist</var>
- <var>body</var>&hellip;)
-</pre></div>
-
-<p>Esta funci&oacute;n tiene dos argumentos, uno es opcional. Hay una cadena
-de documentaci&oacute;n. <em>No</em> es una funci&oacute;n interactiva.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Cuerpo-de-current_002dkill">El cuerpo de <code>current-kill</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Cuerpo de current-kill
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Disgresi_00f3n-concerniente-de-error">Disgresi&oacute;n acerca de la palabra &lsquo;error&rsquo;</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo confundir humanos, pero no
- ordenadores.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Determinando-el-elemento">Determinando el elemento</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"></td></tr>
-</table>
-
-<hr>
-<a name="Cuerpo-de-current_002dkill"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Kill-Ring" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Comprendiendo-current_002dkill" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Comprendiendo-current_002dkill" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Disgresi_00f3n-concerniente-de-error" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-cuerpo-de-current_002dkill"></a>
-<h4 class="unnumberedsubsubsec">El cuerpo de <code>current-kill</code></h4>
-
-<p>El cuerpo de la definici&oacute;n de funci&oacute;n es una expresi&oacute;n
-<code>let</code>, que por s&iacute; misma tiene tanto un cuerpo como
-una <var>varlist</var>.
-</p>
-<p>La expresi&oacute;n <code>let</code> declara una variable que ser&aacute; solo usable
-con las asociaciones de esta funci&oacute;n. Esta variable se llama
-<code>interprogram-paste</code> y se copia a otro programa. No se copia con
-esta instancia de GNU Emacs. La mayor&iacute;a de los sistemas
-de ventanas proveen una facilidad para pegar el
-interprograma. Tristemente, esta facilidad normalmente provee solo el
-&uacute;ltimo elemento. La mayor&iacute;a de los sistemas de
-ventanas no han adoptado un anillo de muchas posibilidades, incluso
-aunque Emacs haya provisto esto durante d&eacute;cadas.
-</p>
-<p>La expresi&oacute;n <code>if</code> tiene dos partes, una si existe
-<code>interprogram-paste</code> y otra si no.
-</p>
-<p>Perm&iacute;tenos considerar el &lsquo;si no&rsquo; o la parte else de la
-funci&oacute;n <code>current-kill</code>. (La parte then usa la funci&oacute;n
-<code>kill-new</code>, que ya hemos descrito. V&eacute;ase la secci&oacute;n <a href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code>.</a>)
-</p>
-<div class="smallexample">
-<pre class="smallexample">(or kill-ring (error &quot;El Kill ring est&aacute; vac&iacute;o&quot;))
-(let ((ARGth-kill-element
- (nthcdr (mod (- n (length kill-ring-yank-pointer))
- (length kill-ring))
- kill-ring)))
- (or do-not-move
- (setq kill-ring-yank-pointer ARGth-kill-element))
- (car ARGth-kill-element))
-</pre></div>
-
-<p>El c&oacute;digo primero chequea si el kill ring <em>anillo de la muerte</em>
-tiene contenido; de otro modo se&ntilde;ala un error.
-</p>
-<p>Note que la expresi&oacute;n <code>or</code> es muy similar para testear el
-tama&ntilde;o con un <code>if</code>:
-</p>
-<a name="index-zerop"></a>
-<a name="index-error"></a>
-<div class="smallexample">
-<pre class="smallexample">(if (zerop (length kill-ring)) ; <span class="roman">parte-si</span>
- (error &quot;Anillo de la muerte vac&iacute;o&quot;)) ; <span class="roman">parte-entonces</span>
- ;; No hay parte-resto
-</pre></div>
-
-<p>Si no hay nada en el kill ring <em>anillo de la muerte</em>, su tama&ntilde;o
-debe ser cero y un mensaje de error se env&iacute;a al usuario:
-&lsquo;<samp>El kill ring est&aacute; vac&iacute;o</samp>&rsquo;. La funci&oacute;n
-<code>current-kill</code> usa una expresi&oacute;n <code>or</code> que es simple. Pero
-una expresi&oacute;n <code>if</code> recuerda lo que lleva.
-</p>
-<p>Esta expresi&oacute;n <code>if</code> usa la funci&oacute;n <code>zerop</code> que devuelve
-cierto si el valor que se chequea es cero. Cuando <code>zerop</code> chequea
-cierto, la parte then del <code>if</code> se eval&uacute;a. La parte then es una
-lista empezando con la funci&oacute;n <code>error</code>, que es una funci&oacute;n
-que es similar a la funci&oacute;n <code>message</code> (v&eacute;ase la secci&oacute;n <a href="#message">La Funci&oacute;n <code>message</code></a>) que imprime un mensaje de una
-l&iacute;nea en el &aacute;rea echo. Sin embargo, adem&aacute;s de
-imprimir un mensaje, <code>error</code> tambi&eacute;n eval&uacute;a la funci&oacute;n que
-est&aacute; embebida. Esto significa que el resto de la funci&oacute;n no ser&aacute;
-evaluada si el tama&ntilde;o del anillo de la muerte <em>kill ring</em> es
-cero.
-</p>
-<p>Entonces la funci&oacute;n <code>current-kill</code> selecciona el elemento a
-devolver. La selecci&oacute;n depende del n&uacute;mero de lugares que
-<code>current-kill</code> rota y donde <code>kill-ring-yank-pointer</code> apunta.
-</p>
-<p>Lo siguiente, si el argumento <code>do-not-move</code> opcional es verdadero
-o el actual valor de <code>kill-ring-yank-pointer</code> se establece al
-punto de la lista. Finalmente, otra expresi&oacute;n devuelve el primer
-elemento de la lista incluso si el argumento <code>do-not-move</code> es
-verdadero.
-</p>
-<hr>
-<a name="Disgresi_00f3n-concerniente-de-error"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Kill-Ring" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Cuerpo-de-current_002dkill" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Comprendiendo-current_002dkill" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Determinando-el-elemento" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Disgresion-acerca-de-la-palabra-_0060error_0027"></a>
-<h4 class="unnumberedsubsubsec">Disgresi&oacute;n acerca de la palabra &lsquo;error&rsquo;</h4>
-
-<p>En mi opini&oacute;n, es ligeramente err&oacute;neo, al menos para humanos, usar
-el t&eacute;rmino &lsquo;error&rsquo; como el nombre de la funci&oacute;n <code>error</code>. Un
-t&eacute;rmino mejor ser&iacute;a &lsquo;cancelar&rsquo;. Estrictamente
-hablando, de acuerdo, no se puede apuntar, mucho menos rotar un
-puntero a una lista que no tiene tama&ntilde;o, as&iacute; desde el
-punto de vista del ordenador, la palabra &lsquo;error&rsquo; es correcta. Pero un
-humano espera intentar algo, si solo si se encuentra el anillo de la
-muerte <em>kill ring</em> est&eacute; lleno o vac&iacute;o. Esto es un
-acto de exploraci&oacute;n.
-</p>
-<p>Desde el punto de vista humano, el acto de exploraci&oacute;n y
-descubrimiento no es necesariamente un error, y por esta raz&oacute;n no
-ser&iacute;a etiquetado como tal, incluso las vocales de un
-ordenador. Como tal, el c&oacute;digo en Emacs implica que un humano que
-est&aacute; actuando virtuosamente, explorando su entorno, est&aacute; teniendo
-un error. Esto est&aacute; mal. Incluso aunque el ordenador tome los mismos
-pasos como cuando hay &lsquo;error&rsquo;, un t&eacute;rmino tal como &lsquo;cancelar&rsquo;
-tendr&iacute;a una clara connotaci&oacute;n.
-</p>
-<hr>
-<a name="Determinando-el-elemento"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Kill-Ring" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Disgresi_00f3n-concerniente-de-error" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Comprendiendo-current_002dkill" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#pegar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Determinando-el-elemento-1"></a>
-<h4 class="unnumberedsubsubsec">Determinando el elemento</h4>
-
-<p>Entre otras acciones, la else-part de la expresi&oacute;n <code>if</code> asigna
-el valor de <code>kill-ring-yank-pointer</code> a <code>ARGth-kill-element</code>
-cuando el kill ring <em>anillo de la muerte</em> tiene alguna cosa
-dentro y el valor de <code>do-not-move</code> es <code>nil</code>.
-</p>
-<p>El c&oacute;digo se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(nthcdr (mod (- n (length kill-ring-yank-pointer))
- (length kill-ring))
- kill-ring)))
-</pre></div>
-
-<p>Esto necesita alg&uacute;n examen. A menos que no se suponga mover el
-puntero, la funci&oacute;n <code>current-kill</code> cambia donde
-<code>kill-ring-yank-pointer</code> apunta. Esto es lo que la expresi&oacute;n
-<code>(setq&nbsp;<span class="nolinebreak">kill-ring-yank-pointer</span>&nbsp;<span class="nolinebreak">ARGth-kill-element)</span></code>
-hace. Tambi&eacute;n, claramente, <code>ARGth-kill-element</code> est&aacute; siendo
-asignado para ser igual a alg&uacute;n <small>CDR</small> del anillo de la muerte
-<em>kill ring</em>, usando la funci&oacute;n <code>nthcdr</code> que est&aacute;
-descrita en una secci&oacute;n temprana. (V&eacute;ase la secci&oacute;n <a href="#copy_002dregion_002das_002dkill"><code>copy-region-as-kill</code></a>.)
-¿C&oacute;mo se hace?
-</p>
-<p>Como se ha visto antes (v&eacute;ase la secci&oacute;n <a href="#nthcdr"><code>nthcdr</code></a>), la funci&oacute;n <code>nthcdr</code>
-funciona repetidamente tomando el <small>CDR</small> de una lista &mdash; eso toma
-el <small>CDR</small>, del <small>CDR</small>, del <small>CDR</small>, &hellip;
-</p>
-<p>Las siguientes dos expresiones producen el mismo resultado:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq kill-ring-yank-pointer (cdr kill-ring))
-
-(setq kill-ring-yank-pointer (nthcdr 1 kill-ring))
-</pre></div>
-
-<p>Sin embargo, la expresi&oacute;n <code>nthcdr</code> es m&aacute;s complicada. Usa la
-funci&oacute;n <code>mod</code> para determinar que <small>CDR</small> para seleccionar.
-</p>
-<p>(Se recordar&aacute; buscar funciones propias primero, en vez de esto,
-tendremos que ir dentro del <code>mod</code>.)
-</p>
-<p>La funci&oacute;n <code>mod</code> devuelve el valor de su primer argumento
-m&oacute;dulo el segundo; que es decir, eso devuelve el resto despu&eacute;s de
-dividir el primer argumento por el segundo. El valor devuelto tiene el
-mismo signo que el segundo argumento.
-</p>
-<p>De este modo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(mod 12 4)
- &rArr; 0 ;; <span class="roman">porque no hay resto</span>
-(mod 13 4)
- &rArr; 1
-</pre></div>
-
-<p>En este caso, el primer argumento es con frecuencia peque&ntilde;o que el
-segundo. Que est&aacute; bien.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(mod 0 4)
- &rArr; 0
-(mod 1 4)
- &rArr; 1
-</pre></div>
-
-<p>Se puede adivinar lo que la funci&oacute;n <code>-</code> hace. Eso es como
-<code>+</code> pero sustrae en vez de a&ntilde;adir; la funci&oacute;n <code>-</code>
-sustrae su segundo argumento desde el primero. Tambi&eacute;n, ya se sabe
-que la funci&oacute;n <code>length</code> hace (v&eacute;ase la secci&oacute;n <a href="#length">Encuentra el tama&ntilde;o de una lista: <code>length</code></a>). Eso devuelve el
-tama&ntilde;o de una lista.
-</p>
-<p>Y <code>n</code> es el nombre del argumento requerido a la funci&oacute;n
-<code>current-kill</code>.
-</p>
-<p>As&iacute; cuando el primer argumento a <code>nthcdr</code> es cero,
-la expresi&oacute;n <code>nthcdr</code> devuelve la lista entera, como se puede
-ver evaluando lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;; kill-ring-yank-pointer <span class="roman">and</span> kill-ring <span class="roman">tener un tama&ntilde;o de cuatro</span>
-;; <span class="roman">and</span> (mod (- 0 4) 4) &rArr; 0
-(nthcdr (mod (- 0 4) 4)
- '(&quot;cuarta l&iacute;nea de texto&quot;
- &quot;tercera l&iacute;nea&quot;
- &quot;segunda pieza de texto&quot;
- &quot;primero algo de texto&quot;))
-</pre></div>
-
-<p>Cuando el primer argumento a la funci&oacute;n <code>current-kill</code> es uno,
-la expresi&oacute;n <code>nthcdr</code> devuelve la lista sin su primer elemento.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(nthcdr (mod (- 1 4) 4)
- '(&quot;cuarta l&iacute;nea de texto&quot;
- &quot;tercera l&iacute;nea&quot;
- &quot;segunda pieza de texto&quot;
- &quot;primero algo de texto&quot;))
-</pre></div>
-
-<a name="index-variable-global-definida"></a>
-<a name="index-variable_002c-global_002c-definida"></a>
-<p>Incidentalmente, tanto <code>kill-ring</code> y
-<code>kill-ring-yank-pointer</code> son <em>variables globales</em>. Esto
-significa que cualquier expresi&oacute;n en Emacs Lisp puede acceder a
-ellas. Ellas no son como las variables locales asignadas por
-<code>let</code> o como los s&iacute;mbolos en una lista de
-argumentos. Las variables locales pueden solo ser accedidas con el
-<code>let</code> que los define o la funci&oacute;n que los especifica en una
-lista de argumentos (y con expresiones llamadas por ellos).
-</p>
-
-<hr>
-<a name="pegar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Kill-Ring" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Determinando-el-elemento" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Kill-Ring" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#yank_002dpop" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="pegar-1"></a>
-<h2 class="appendixsec">B.2 <code>pegar</code></h2>
-<a name="index-pegar-1"></a>
-
-<p>Despu&eacute;s de aprender acerca de <code>current-kill</code>, el c&oacute;digo para
-la funci&oacute;n <code>yank</code> es casi f&aacute;cil.
-</p>
-<p>La funci&oacute;n <code>yank</code> no usa la variable <code>kill-ring-yank-pointer</code>
-directamente. Eso llama a <code>insert-for-yank</code> que llama a
-<code>current-kill</code> que asigna la variable <code>kill-ring-yank-pointer</code>.
-</p>
-<p>El c&oacute;digo se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun yank (&amp;optional arg)
- &quot;Reinserta (\&quot;pega\&quot;) el &uacute;ltimo logro del texto cortado.
-M&aacute;s precisamente, reinserta el texto cortado m&aacute;s recientemente.
-Pon el punto al final, y asigna la marca al principio.
-Solo con \\[universal-argument] como argumento, lo mismo pero pon el
-punto al principio (y la marca al final). Con el argumento N, reinserta
-el N m&aacute;s recientemente cortado.
-Cuando este comando inserta texto cortado dentro del b&uacute;ffer, eso
-honra a `yank-excluded-properties' y `yank-handler' como se describe
-la cadena de documentaci&oacute;n para `insert-for-yank-1', que se ve.
-
-Ver tambi&eacute;n el comando \\[yank-pop].&quot;
-</pre><pre class="smallexample"> (interactive &quot;*P&quot;)
- (setq yank-window-start (window-start))
- ;; Si no tenemos todo el camino a trav&eacute;s, crea last-command que
- ;; indique esto para el siguiente comando.
- (setq this-command t)
- (push-mark (point))
-</pre><pre class="smallexample"> (insert-for-yank (current-kill (cond
- ((listp arg) 0)
- ((eq arg '-) -2)
- (t (1- arg)))))
- (if (consp arg)
- ;; Esto es como like exchange-point-and-mark,
- ;; pero no activa la marca.
- ;; Es limpio evitar la activaci&oacute;n, incluso aunque el comando
- ;; loop would desactivar&iacute;a la marca porque se
- ;; insertara el texto.
- (goto-char (prog1 (mark t)
- (set-marker (mark-marker) (point) (current-buffer)))))
-</pre><pre class="smallexample"> ;; Si tenemos todo el camino, haz que this-command lo indique.
- (if (eq this-command t)
- (setq this-command 'yank))
- nil)
-</pre></div>
-
-<p>La expresi&oacute;n clave es <code>insert-for-yank</code>, que inserta la cadena
-devuelta por <code>current-kill</code>, pero elimina algo de propiedades de
-texto desde eso.
-</p>
-<p>Sin embargo, antes de tener esta expresi&oacute;n, la funci&oacute;n asigna el
-valor de <code>yank-window-start</code> a la posici&oacute;n devuelta por la
-expresi&oacute;n <code>(window-start)</code>, la posici&oacute;n que muestra lo
-que actualmente empieza. La funci&oacute;n <code>yank</code> tambi&eacute;n asigna
-<code>this-command</code> y empuja la marca.
-</p>
-<p>Despu&eacute;s de pegar el elemento apropiado, si el argumento opcional es
-un <small>CONS</small> en vez de un n&uacute;mero o nada, se pone el punto al principio
-del texto pegado y se marca al final.
-</p>
-<p>(La funci&oacute;n <code>prog1</code> es como <code>progn</code> pero devuelve el valor
-de su primer argumento en vez del valor de su &uacute;ltimo argumento. Su
-primer argumento fuerza devolver la marca del b&uacute;ffer como un
-entero. Se puede ver la documentaci&oacute;n para estas funciones
-emplazando el punto a trav&eacute;s de ellas en este b&uacute;ffer y entonces
-escribiendo <kbd>C-h f</kbd> (<code>describe-function</code>) seguido por un
-<kbd>RET</kbd>; por defecto es la funci&oacute;n.)
-</p>
-<p>La &uacute;ltima parte de la funci&oacute;n cuenta que hacer cuando eso sucede.
-</p>
-<hr>
-<a name="yank_002dpop"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Kill-Ring" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#pegar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Kill-Ring" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#fichero-anillo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="yank_002dpop-1"></a>
-<h2 class="appendixsec">B.3 <code>yank-pop</code></h2>
-<a name="index-yank_002dpop"></a>
-
-<p>Despu&eacute;s de comprender <code>yank</code> y <code>current-kill</code>, se conoce
-como enfocar la funci&oacute;n <code>yank-pop</code>. Dejando fuera la
-documentaci&oacute;n para guardar el espacio, se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun yank-pop (&amp;optional arg)
- &quot;&hellip;&quot;
- (interactive &quot;*p&quot;)
- (if (not (eq last-command 'yank))
- (error &quot;El comando previo no fu&eacute; un corte&quot;))
-</pre><pre class="smallexample"> (setq this-command 'yank)
- (unless arg (setq arg 1))
- (let ((inhibit-read-only t)
- (before (&lt; (point) (mark t))))
-</pre><pre class="smallexample"> (if before
- (funcall (or yank-undo-function 'delete-region) (point) (mark t))
- (funcall (or yank-undo-function 'delete-region) (mark t) (point)))
- (setq yank-undo-function nil)
-</pre><pre class="smallexample"> (set-marker (mark-marker) (point) (current-buffer))
- (insert-for-yank (current-kill arg))
- ;; Asigna la ventana a volver donde estaba el comando yank,
- ;; si es posible
- (set-window-start (selected-window) yank-window-start t)
-</pre><pre class="smallexample"> (if before
- ;; Esto es como exchange-point-and-mark,
- ;; pero no activa la marca.
- ;; Es limpio evitar la activaci&oacute;n, incluso aunque el comando
- ;; desactivase la marca porque se insertara el texto.
- (goto-char (prog1 (mark t)
- (set-marker (mark-marker)
- (point)
- (current-buffer))))))
- nil)
-</pre></div>
-
-<p>La funci&oacute;n es interactive con una peque&ntilde;a &lsquo;<samp>p</samp>&rsquo;
-as&iacute; el argumento prefijo es procesado y pasado a la
-funci&oacute;n. El comando puede solo ser usado despu&eacute;s del yank previo;
-de otro modo un mensaje de error se env&iacute;a. Este chequeo
-usa la variable <code>last-command</code> que se asigna por <code>yank</code> y
-discutida de alg&uacute;n modo. (V&eacute;ase la secci&oacute;n <a href="#copy_002dregion_002das_002dkill"><code>copy-region-as-kill</code></a>.)
-</p>
-<p>La cl&aacute;usula <code>let</code> asigna la variable <code>before</code> a cierto o
-falso dependiendo de si el punto est&aacute; antes o despu&eacute;s de la marca
-y entonce la regi&oacute;n entre punto y marca se borra. Esta es la
-regi&oacute;n que fu&eacute; insertada por el yank previo y eso es este texto
-que ser&aacute; reemplazado.
-</p>
-<p><code>funcall</code> llama a su primer argumento como una funci&oacute;n, pasando
-los argumentos que permanecen. El primer argumento es el que la
-expresi&oacute;n <code>or</code> devuelve. Los dos argumentos que permanecen son
-las posiciones de punto y marca asignadas por el comando <code>yank</code>
-precedente.
-</p>
-<p>Hay m&aacute;s, pero esta es la parte m&aacute;s dura.
-</p>
-<hr>
-<a name="fichero-anillo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Kill-Ring" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#yank_002dpop" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Kill-Ring" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-fichero-ring_002eel"></a>
-<h2 class="appendixsec">B.4 El fichero &lsquo;<tt>ring.el</tt>&rsquo;</h2>
-<a name="index-fichero-ring_002eel"></a>
-
-<p>De manera interesante, GNU Emacs posee un fichero llamado
-&lsquo;<tt>ring.el</tt>&rsquo; que provee muchas de las funcionalidades que ahora se
-discuten. Pero las funciones tales como <code>kill-ring-yank-pointer</code>
-no usan esta librer&iacute;a, posiblemente porque fueron
-escritas pronto.
-</p>
-<hr>
-<a name="Grafo-completo"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Kill-Ring" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#fichero-anillo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-etiquetado" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Un-grafo-con-ejes-etiquetados"></a>
-<h1 class="appendix">Appendix C Un grafo con ejes etiquetados</h1>
-
-<p>Los ejes impresos ayudan a comprender un grafo. Para crear escalas. En
-un cap&iacute;tulo anterior (v&eacute;ase la secci&oacute;n <a href="#Leyendo-un-grafo">Leyendo un grafo</a>), se escribi&oacute; el c&oacute;digo para imprimir el cuerpo de un
-grafo. Aqu&iacute; se escribe el c&oacute;digo para imprimir y
-etiquetar ejes horizontales y verticales, a lo largo del cuerpo en
-s&iacute;.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Ejemplo-etiquetado">Grafo de ejemplo etiquetado</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejemplo etiquetado
-</td></tr>
-<tr><td align="left" valign="top"><a href="#print_002dgraph-Varlist">C.1 La varlist <code>print-graph</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Expresi&oacute;n <code>let</code> en <code>print-graph</code>.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#print_002dY_002daxis">C.2 La funci&oacute;n <code>print-Y-axis</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Imprimir una etiqueta para los ejes verticales.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#print_002dX_002daxis">C.3 La funci&oacute;n <code>print-X-axis</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Imprimir una etiqueta horizontal.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Imprimir-Grafo-Entero">C.4 Imprimiendo el grafo completo</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> La funci&oacute;n para imprimir un grafo completo.
-</td></tr>
-</table>
-
-<hr>
-<a name="Ejemplo-etiquetado"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dgraph-Varlist" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Grafo-de-ejemplo-etiquetado"></a>
-<h2 class="unnumberedsec">Grafo de ejemplo etiquetado</h2>
-
-<p>Puesto que las inserciones rellenan un b&uacute;ffer a la derecha y debajo
-del punto, el nuevo grafo imprime la funci&oacute;n que primero
-imprimir&iacute;a el eje vertical Y, despu&eacute;s el cuerpo del
-grafo, y finalmente el eje horizontal X. Esta secuencia nos da los
-contenidos de la funci&oacute;n:
-</p>
-<ol>
-<li>
-Configura c&oacute;digo.
-
-</li><li>
-Imprime el eje Y.
-
-</li><li>
-Imprime el cuerpo del grafo.
-
-</li><li>
-Imprime el eje X.
-</li></ol>
-
-<p>Aqu&iacute; hay un ejemplo de como se ve un grafo finalizado:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> 10 -
- *
- * *
- * **
- * ***
- 5 - * *******
- * *** *******
- *************
- ***************
- 1 - ****************
- | | | |
- 1 5 10 15
-</pre></div>
-
-<p>En este grafo, en ambos ejes vertical y horizontal se etiquetan con
-n&uacute;meros. Sin embargo, en algunos grafos, el eje horizontal es tiempo
-y estar&iacute;a mejor etiquetarlo con meses,
-as&iacute;:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> 5 - *
- * ** *
- *******
- ********** **
- 1 - **************
- | ^ |
- Enero Junio Enero
-</pre></div>
-
-<p>Dentro, con un peque&ntilde;o pensamiento, se puede f&aacute;cilmente venir con
-una variedad de esquemas de etiquetado verticales y
-horizontales. Nuestra tarea podr&iacute;a llegar a ser
-complicada. Pero las complicaciones generan confusi&oacute;n. En vez de
-permitir esto, es mejor elegir un simple esquema de etiquetado para
-nuestro primer esfuerzo, y modificarlo o reemplazarlo despu&eacute;s.
-</p>
-<p>Estas consideraciones sugieren el siguiente outline para la funci&oacute;n
-<code>print-graph</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun print-graph (numbers-list)
- &quot;<var>documentation</var>&hellip;&quot;
- (let ((height &hellip;
- &hellip;))
-</pre><pre class="smallexample"> (print-Y-axis height &hellip; )
- (graph-body-print numbers-list)
- (print-X-axis &hellip; )))
-</pre></div>
-
-<p>Nosotros podemos trabajar en cada parte de la definici&oacute;n de funci&oacute;n
-<code>print-graph</code>.
-</p>
-<hr>
-<a name="print_002dgraph-Varlist"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Ejemplo-etiquetado" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dY_002daxis" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-varlist-print_002dgraph"></a>
-<h2 class="appendixsec">C.1 La varlist <code>print-graph</code></h2>
-<a name="index-print_002dgraph-varlist"></a>
-
-<p>Para escribir la funci&oacute;n <code>print-graph</code>, la primera tarea es
-escribir la varlist en la expresi&oacute;n <code>let</code>. (Nosotros dejaremos
-por ahora cualquier pensamiento acerca de hacer la funci&oacute;n
-interactive o acerca de los contenidos de su cadena de documentaci&oacute;n.)
-</p>
-<p>La varlist asignar&iacute;a varios valores. Claramente, la
-etiqueta superior del eje vertical debe ser al menos la altura del
-grafo, que significa que debe obtener esta informaci&oacute;n
-aqu&iacute;. Note que la funci&oacute;n <code>print-graph-body</code>
-tambi&eacute;n requiere esta informaci&oacute;n. No hay raz&oacute;n para calcular la
-altura del grafo en dos lugares diferentes, as&iacute;
-cambiar&iacute;a <code>print-graph-body</code> desde el camino que
-definimos pronto para tomar ventaja del c&aacute;lculo.
-</p>
-<p>De manera similar, tanto la funci&oacute;n para imprimir la etiqueta del
-eje X y la funci&oacute;n <code>print-graph-body</code> se necesita aprender el
-valor del ancho de cada s&iacute;mbolo. Se puede desarrollar el
-c&aacute;lculo aqu&iacute; y cambiar la definici&oacute;n para
-<code>print-graph-body</code> desde el camino que se defini&oacute; en el
-cap&iacute;tulo previo.
-</p>
-<p>El tama&ntilde;o de la etiqueta para el eje horizontal debe ser al menos
-tan largo como el grafo. Sin embargo, esta informaci&oacute;n es usada solo
-en la funci&oacute;n que imprime el eje horizontal, as&iacute; no
-necesita calcularse aqu&iacute;.
-</p>
-<p>Estos pensamientos nos llevan directamente a la siguiente forma para
-la varlist en el <code>let</code> para <code>print-graph</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(let ((height (apply 'max numbers-list)) ; <span class="roman">Primera versi&oacute;n.</span>
- (symbol-width (length graph-blank)))
-</pre></div>
-
-<p>Como se ver&aacute;, esta expresi&oacute;n no es bastante correcta.
-</p>
-<hr>
-<a name="print_002dY_002daxis"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dgraph-Varlist" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dY_002daxis-en-Detalle" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-print_002dY_002daxis"></a>
-<h2 class="appendixsec">C.2 La funci&oacute;n <code>print-Y-axis</code></h2>
-<a name="index-Ejes_002c-imprimir-vertical"></a>
-<a name="index-imprimiendo-eje-Y"></a>
-<a name="index-Imprimiendo-Ejes-Verticales"></a>
-<a name="index-Imprimir-eje-vertical"></a>
-
-<p>El trabajo de la funci&oacute;n <code>print-Y-axis</code> es imprimir una etiqueta
-para el eje vertical que se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> 10 -
-
-
-
-
- 5 -
-
-
-
- 1 -
-</pre></div>
-
-<p>La funci&oacute;n se pasar&iacute;a a lo alto del grafo, y
-as&iacute;
-construyen e insertan los n&uacute;meros y marcas apropiados.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#print_002dY_002daxis-en-Detalle">La funci&oacute;n <code>print-Y-axis</code> en detalle</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> print-Y-axis en Detalle
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Altura-de-etiqueta">&iquest;A qu&eacute; altura se deber&iacute;a etiquetar?</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iquest;Qu&eacute; altura para el eje Y?
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Calcular-un-resto">C.2.1 Viaje lateral: Calcula un resto</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo calcular el resto de una divisi&oacute;n.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Elemento-del-Eje-Y">C.2.2 Construye un elemento del eje Y</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Construir una l&iacute;nea para el eje
- Y.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Y_002daxis_002dcolumn">C.2.3 Crea un eje de la columna Y</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Generar una lista de etiquetas del eje Y.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Pen_00faltimo-print_002dY_002daxis">C.2.4 La versi&oacute;n no demasiado final de <code>print-Y-axis</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Una versi&oacute;n no muy final.
-</td></tr>
-</table>
-
-<hr>
-<a name="print_002dY_002daxis-en-Detalle"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dY_002daxis" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dY_002daxis" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Altura-de-etiqueta" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-print_002dY_002daxis-en-detalle"></a>
-<h3 class="unnumberedsubsec">La funci&oacute;n <code>print-Y-axis</code> en detalle</h3>
-
-<p>Es suficientemente f&aacute;cil ver en la figura que la etiqueta del eje Y
-pero se puede decir en palabras, y entonces escribir una definici&oacute;n
-de funci&oacute;n para hacer el trabajo es otra materia. No es bastante
-verdad decir que se quiere un n&uacute;mero y un tic cada cinco
-l&iacute;neas: solo hay tres l&iacute;neas entre el
-&lsquo;<samp>1</samp>&rsquo; y el &lsquo;<samp>5</samp>&rsquo; (l&iacute;neas 2, 3 y 4), pero cuatro
-l&iacute;neas entre el &lsquo;<samp>5</samp>&rsquo; y el &lsquo;<samp>10</samp>&rsquo;
-(l&iacute;neas 6, 7, 8 y 9). Es mejor decir que se quiere un
-n&uacute;mero y un tic en la quinta l&iacute;nea desde abajo a cada
-l&iacute;nea que es un m&uacute;ltiplo de cinco.
-</p>
-<hr>
-<a name="Altura-de-etiqueta"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dY_002daxis-en-Detalle" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dY_002daxis" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Calcular-un-resto" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="g_t_00bfA-que-altura-se-deberia-etiquetar_003f"></a>
-<h3 class="unnumberedsubsec">&iquest;A qu&eacute; altura se deber&iacute;a etiquetar?</h3>
-
-<p>La siguiente cuesti&oacute;n es a que altura se
-etiquetar&iacute;a. Sup&oacute;n que la m&aacute;xima altura de la columna
-mayor del grafo es siete. La etiqueta superior en el eje Y
-ser&iacute;a &lsquo;<samp>5 -</samp>&rsquo;, ¿y el grafo se pegar&iacute;a
-debajo de la etiqueta?, ¿o la etiqueta superior ser&iacute;a
-&lsquo;<samp>7 -</samp>&rsquo;, y marcar la vertical del grafo? ¿o ser&iacute;a la
-etiqueta superior <code>10 -</code>, que es m&uacute;ltiplo de cinco, y es
-superior al valor m&aacute;s alto del grafo?
-</p>
-<p>La &uacute;ltima forma es preferida. La mayor&iacute;a de los grafos
-son rect&aacute;ngulos cuyos lados son un n&uacute;mero integral de pasos a lo
-largo &mdash; 5, 10, 15, y as&iacute; para un paso a distancia de
-cinco. Pero tan pronto se decide usar un paso alto para el eje
-vertical, se descubre que la expresi&oacute;n simple en la varlist para la
-altura de la computaci&oacute;n es err&oacute;nea. La expresi&oacute;n es
-<code>(apply 'max numbers-list)</code>. Esto devuelve la altura precisa, no
-la altura m&aacute;xima m&aacute;s de lo que es necesario para redondear el
-m&uacute;ltiplo de cinco. Una expresi&oacute;n m&aacute;s compleja es requerida.
-</p>
-<p>Como es normal en casos como este, un problema complejo llega a ser
-simple si est&aacute; dividido en varios problemas peque&ntilde;os.
-</p>
-<p>Primero, considere el caso cuando el valor superior del grafo es un
-m&uacute;ltiplo integral de cinco &mdash; cuando eso es 5, 10, 15, o alg&uacute;n
-m&uacute;ltiplo de cinco. Se puede usar este valor como la altura del eje Y.
-</p>
-<p>Un camino simple y limpio para determinar si un n&uacute;mero es m&uacute;ltiplo
-de cinco se divide por cinco y mira si la divisi&oacute;n devuelve
-resto. Si no hay resto, el n&uacute;mero es un m&uacute;ltiplo de cinco. De este
-modo, siete dividido tiene un resto de dos, y siete no es un entero
-m&uacute;ltiplo de cinco. Dicho de otra manera, recordando la escuela,
-cinco entre siete es uno y me llevo dos. Sin embargo, diez entre dos,
-no tiene resto: diez es un m&uacute;ltiplo entero de cinco.
-</p>
-<hr>
-<a name="Calcular-un-resto"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Altura-de-etiqueta" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dY_002daxis" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Elemento-del-Eje-Y" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Viaje-lateral_003a-Calcula-un-resto"></a>
-<h3 class="appendixsubsec">C.2.1 Viaje lateral: Calcula un resto</h3>
-
-<a name="index-_0025-_0028funcion-resto_0029"></a>
-<a name="index-Funcion-resto_002c-_0025"></a>
-<p>En Lisp, la funci&oacute;n para calcular un resto es <code>%</code>. La funci&oacute;n
-devuelve el resto de su primer argumento dividido por su segundo
-argumento. Como ocurre, <code>%</code> es una funci&oacute;n en Emacs Lisp que no
-se puede implementar usando <code>apropos</code>: no se puede encontrar nada si
-se escribe <kbd>M-x apropos &lt;RET&gt; resto &lt;RET&gt;</kbd>. El &uacute;nico
-camino para aprender la existencia de <code>%</code> es leer acerca de eso
-en un libro tal como este o en las fuentes de Emacs Lisp.
-</p>
-<p>Se puede probar la funci&oacute;n <code>%</code> evaluando las siguientes dos
-expresiones:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(% 7 5)
-
-(% 10 5)
-</pre></div>
-
-<p>La primera expresi&oacute;n devuelve 2 y la segunda expresi&oacute;n devuelve 0.
-</p>
-<p>Para chequear si el valor devuelto es cero o alg&uacute;n otro n&uacute;mero, se
-puede usar la funci&oacute;n <code>zerop</code>. Esta funci&oacute;n devuelve <code>t</code>
-si su argumento debe ser un n&uacute;mero, es cero.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(zerop (% 7 5))
- &rArr; nil
-
-(zerop (% 10 5))
- &rArr; t
-</pre></div>
-
-<p>De este modo, la siguiente expresi&oacute;n devolver&aacute; <code>t</code> si la
-altura del grafo es divisible por cinco:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(zerop (% height 5))
-</pre></div>
-
-<p>(El valor de <code>height</code>, de acuerdo, puede ser encontrado desde
-<code>(apply 'max numbers-list)</code>.)
-</p>
-<p>Por otro lado, si el valor de <code>height</code> no es un m&uacute;ltiplo de
-cinco, nosotros queremos resetear el valor al siguiente m&uacute;ltiplo de
-cinco. Esta es la aritm&eacute;tica sencilla usando funciones con las que
-ya se est&aacute; familiarizado. Primero, se divide el valor de
-<code>height</code> por cinco para determinar cuantas veces cinco va dentro
-del n&uacute;mero. De este modo, cinco va dentro doce veces. Si se a&ntilde;ade
-uno a este cociente y se multiplica por cinco, obtendremos el valor
-del siguiente m&uacute;ltiplo de cinco que es m&aacute;s largo que el
-mayor. Cinco va dentro de doce dos veces. A&ntilde;ade uno a dos, y
-multiplica por cinco; el resultado es quince, que es el siguiente
-m&uacute;ltiplo de cinco que es mayor de doce. La expresi&oacute;n Lisp para
-esto es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(* (1+ (/ height 5)) 5)
-</pre></div>
-
-<p>Por ejemplo, si se eval&uacute;a lo siguiente, el resultado es 15:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(* (1+ (/ 12 5)) 5)
-</pre></div>
-
-<p>Todo a trav&eacute;s de esta discusi&oacute;n, se ha estado usando &lsquo;cinco&rsquo; como
-el valor para las etiquetas espaciadas en el eje Y; pero se puede
-querer usar alg&uacute;n otro valor. Generalmente,
-reemplazar&iacute;a &lsquo;cinco&rsquo; con una variable a la que poder
-asignar un valor. El mejor nombre que puedo pensar para esta variable
-es <code>Y-axis-label-spacing</code>.
-</p>
-<p>Usando este t&eacute;rmino, y una expresi&oacute;n <code>if</code>, se produce lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(if (zerop (% height Y-axis-label-spacing))
- height
- ;; <span class="roman">else</span>
- (* (1+ (/ height Y-axis-label-spacing))
- Y-axis-label-spacing))
-</pre></div>
-
-<p>Esta expresi&oacute;n devuelve el valor de <code>height</code> en
-s&iacute; si la altura es incluso un m&uacute;ltiplo del valor del
-<code>Y-axis-label-spacing</code> o lo dem&aacute;s computa y devuelve un valor
-de <code>height</code> que es igual al siguiente m&uacute;ltiplo mayor del valor
-del <code>Y-axis-label-spacing</code>.
-</p>
-<p>Se puede ahora incluir esta expresi&oacute;n en la expresi&oacute;n <code>let</code>
-de la funci&oacute;n <code>print-graph</code> (despu&eacute;s de la primera
-configuraci&oacute;n del valor de <code>Y-axis-label-spacing</code>):
-<a name="index-Y_002daxis_002dlabel_002dspacing"></a>
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defvar Y-axis-label-spacing 5
- &quot;N&uacute;mero de l&iacute;neas desde una etiqueta del eje Y al siguiente.&quot;)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">&hellip;
-(let* ((height (apply 'max numbers-list))
- (height-of-top-line
- (if (zerop (% height Y-axis-label-spacing))
- height
-</pre><pre class="smallexample"> ;; <span class="roman">else</span>
- (* (1+ (/ height Y-axis-label-spacing))
- Y-axis-label-spacing)))
- (symbol-width (length graph-blank))))
-&hellip;
-</pre></div>
-
-<p>(Note que el uso de la funci&oacute;n <code>let*</code>: el valor inicial de la
-altura es calculada una vez por la expresi&oacute;n <code>(apply 'max
-numbers-list)</code> y entonces el valor resultado de <code>height</code> es
-usado para computar su valor final. V&eacute;ase la secci&oacute;n <a href="#fwd_002dpara-let">La expresi&oacute;n <code>let*</code></a>, para m&aacute;s acerca de <code>let*</code>.)
-</p>
-<hr>
-<a name="Elemento-del-Eje-Y"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Calcular-un-resto" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dY_002daxis" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Y_002daxis_002dcolumn" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Construye-un-elemento-del-eje-Y"></a>
-<h3 class="appendixsubsec">C.2.2 Construye un elemento del eje Y</h3>
-
-<p>Cuando se imprime el eje vertical, se quieren insertar cadenas tales
-como &lsquo;<samp>5&nbsp;<span class="nolinebreak">-</span></samp>&rsquo; y &lsquo;<samp>10&nbsp;<span class="nolinebreak">-</span>&nbsp;</samp>&rsquo; cada cinco
-l&iacute;neas. M&aacute;s all&aacute;, se quieren los n&uacute;meros agitados
-para alinear, as&iacute; pocos n&uacute;meros deben ser acu&ntilde;ados
-con espacios de gu&iacute;a. Si alguna de las cadenas usan dos
-d&iacute;gitos, las cadenas con un simple d&iacute;gito
-deben incluir una gu&iacute;a en blanco antes del n&uacute;mero.
-</p>
-<a name="index-number_002dto_002dstring"></a>
-<p>Para figurarse el tama&ntilde;o del n&uacute;mero, se usa la funci&oacute;n
-<code>length</code>. Pero la funci&oacute;n <code>length</code> funciona solo con una
-cadena, no con un n&uacute;mero. As&iacute; el n&uacute;mero tiene que
-ser convertido desde un n&uacute;mero a una cadena. Esto se hace con la
-funci&oacute;n <code>number-to-string</code>. Por ejemplo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(length (number-to-string 35))
- &rArr; 2
-
-(length (number-to-string 100))
- &rArr; 3
-</pre></div>
-
-<p>(<code>number-to-string</code> se llama <code>int-to-string</code>; se ver&aacute; este
-nombre alternativo en varias fuentes.)
-</p>
-<p>Adem&aacute;s, en cada etiqueta, cada n&uacute;mero es seguido por una cadena
-tal como &lsquo;<samp>&nbsp;<span class="nolinebreak">-</span>&nbsp;</samp>&rsquo;, que llamar&aacute; al marcador
-<code>Y-axis-tic</code>. Esta variable est&aacute; definida con <code>defvar</code>:
-</p>
-<a name="index-Y_002daxis_002dtic"></a>
-<div class="smallexample">
-<pre class="smallexample">(defvar Y-axis-tic &quot; - &quot;
- &quot;La Cadena que sigue el n&uacute;mero en una etiqueta del eje Y.&quot;)
-</pre></div>
-
-<p>El tama&ntilde;o de la etiqueta Y es la suma del tama&ntilde;o del eje Y y el
-tama&ntilde;o del n&uacute;mero del alto del grafo.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(length (concat (number-to-string height) Y-axis-tic)))
-</pre></div>
-
-<p>Este valor ser&aacute; calculado por la funci&oacute;n <code>print-graph</code> en su
-varlist como <code>full-Y-label-width</code> y se pasa dentro. (Note que no
-se pensaba en incluir esto en el varlist cuando se propuso.)
-</p>
-<p>Para crear un eje vertical completo, una marca de tic es concatenada
-con un n&uacute;mero; y los dos juntos pueden ser precedidos por uno o
-m&aacute;s espacios dependiendo de c&oacute;mo de largo es el n&uacute;mero. La
-etiqueta consiste de tres partes: los espacios que se lideran
-(opcional), el n&uacute;mero, y la marca tic. La funci&oacute;n se pasa al
-valor del n&uacute;mero para la fila espec&iacute;fica, y el valor
-del ancho de la l&iacute;nea de arriba, que es calculada (solo
-una vez) por <code>print-graph</code>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun Y-axis-element (number full-Y-label-width)
- &quot;Construye una etiqueta NUMERADA
-Un elemento numerado se parece a esto ` 5 - ',
-y est&aacute; tan acu&ntilde;ado como se necesita as&iacute; todo se
-alinea con el elemento para el n&uacute;mero mayor.&quot;
-</pre><pre class="smallexample"> (let* ((leading-spaces
- (- full-Y-label-width
- (length
- (concat (number-to-string number)
- Y-axis-tic)))))
-</pre><pre class="smallexample"> (concat
- (make-string leading-spaces ? )
- (number-to-string number)
- Y-axis-tic)))
-</pre></div>
-
-<p>La funci&oacute;n <code>Y-axis-element</code> concatena junto los espacios que se
-lideran si cualquiera; el n&uacute;mero, como una cadena; y la marca tic.
-</p>
-<p>Para imaginarnos cuantos espacios gu&iacute;a la etiqueta
-necesita, la funci&oacute;n sustrae el tama&ntilde;o de la etiqueta &mdash; el
-tama&ntilde;o del n&uacute;mero m&aacute;s el tama&ntilde;o de la marca tic &mdash; desde el
-ancho de la etiqueta deseada.
-</p>
-<a name="index-make_002dstring"></a>
-<p>Los espacios en blanco se insertan usando la funci&oacute;n
-<code>make-string</code>. Esta funci&oacute;n tiene dos argumentos: lo primero
-cuenta como de larga ser&aacute; a cadena y el segundo es un
-s&iacute;mbolo para el caracter a insertar, en un formato
-espcial. El formato es una marca de pregunta seguida por un espacio en
-blanco, como este, &lsquo;<samp>?</samp>&rsquo;. See <a href="elisp.html#Tipo-de-Caracter">Tipo de Caracter</a> in <cite>El Manual de Referencia Emacs Lisp</cite>, para una
-descripci&oacute;n de la sintaxis para caracteres. (De acuerdo, se
-podr&iacute;a querer reemplazar el espacio en blanco por
-alg&uacute;n otro caracter &hellip;. Tu sabes qu&eacute; hacer.)
-</p>
-<p>La funci&oacute;n <code>number-to-string</code> es usada en la expresi&oacute;n de
-concatenaci&oacute;n, para convertir el n&uacute;mero a una cadena que es
-concatenada con los espacios que se lideran y la marca de tic.
-</p>
-<hr>
-<a name="Y_002daxis_002dcolumn"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Elemento-del-Eje-Y" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dY_002daxis" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Pen_00faltimo-print_002dY_002daxis" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Crea-un-eje-de-la-columna-Y"></a>
-<h3 class="appendixsubsec">C.2.3 Crea un eje de la columna Y</h3>
-
-<p>Las funciones precedentes proporcionan todas las herramientas
-necesarias para construir una funci&oacute;n que genera una lista de
-cadenas enumeradas y en blanco para inserta como la etiqueta para el
-eje vertical:
-</p>
-<a name="index-Y_002daxis_002dcolumn"></a>
-<div class="smallexample">
-<pre class="smallexample">(defun Y-axis-column (height width-of-label)
- &quot;Construye la lista de ejes Y etiquetadas y cadenas en blanco.
-Para height <em>la altura</em> de la l&iacute;nea de debajo y width-of-label.&quot;
- (let (Y-axis)
-</pre><pre class="smallexample"> (while (&gt; height 1)
- (if (zerop (% height Y-axis-label-spacing))
- ;; <span class="roman">Insertar etiqueta.</span>
- (setq Y-axis
- (cons
- (Y-axis-element height width-of-label)
- Y-axis))
-</pre><pre class="smallexample"> ;; <span class="roman">Else, insertar blancos.</span>
- (setq Y-axis
- (cons
- (make-string width-of-label ? )
- Y-axis)))
- (setq height (1- height)))
- ;; <span class="roman">Insertar la l&iacute;nea base.</span>
- (setq Y-axis
- (cons (Y-axis-element 1 width-of-label) Y-axis))
- (nreverse Y-axis)))
-</pre></div>
-
-<p>En esta funci&oacute;n, nosotros empezamos con el valor de <code>height</code> y
-repetitivamente sustrae uno desde su valor. Despu&eacute;s de cada
-sustraci&oacute;n, se chequea para ver si el valor es una integral
-m&uacute;ltiple del <code>Y-axis-label-spacing</code>. Si eso es, se construye
-una etiqueta numerada usando la funci&oacute;n <code>Y-axis-element</code>; si
-no, se construye una etiqueta blanca usando la funci&oacute;n
-<code>make-string</code>. La l&iacute;nea base consiste del n&uacute;mero
-uno seguido por una marca tic.
-</p>
-<hr>
-<a name="Pen_00faltimo-print_002dY_002daxis"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Y_002daxis_002dcolumn" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dY_002daxis" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dX_002daxis" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-version-no-demasiado-final-de-print_002dY_002daxis"></a>
-<h3 class="appendixsubsec">C.2.4 La versi&oacute;n no demasiado final de <code>print-Y-axis</code></h3>
-
-<p>La lista construida por la funci&oacute;n <code>Y-axis-column</code> est&aacute; pasada
-a la funci&oacute;n <code>print-Y-axis</code>, que inserta la lista como una columna.
-</p>
-<a name="index-print_002dY_002daxis"></a>
-<div class="smallexample">
-<pre class="smallexample">(defun print-Y-axis (height full-Y-label-width)
- &quot;Inserta el eje Y usando HEIGHT y FULL-Y-LABEL-WIDTH.
-La altura debe ser la m&aacute;xima altura del grafo.
-El ancho completo es el ancho del mayor elemento de la
-etiqueta&quot;
-;; El valor del alto y full-Y-label-width
-;; son pasadas por `print-graph'.
-</pre><pre class="smallexample"> (let ((start (point)))
- (insert-rectangle
- (Y-axis-column height full-Y-label-width))
- ;; <span class="roman">Posiciona el punto listo para inserta el grafo.</span>
- (goto-char start)
- ;; <span class="roman">Mueve el punto hacia adelante por valor de</span> full-Y-label-width
- (forward-char full-Y-label-width)))
-</pre></div>
-
-<p>El <code>print-Y-axis</code> usa la funci&oacute;n <code>insert-rectangle</code> para
-inserta el eje Y creado por la funci&oacute;n
-<code>Y-axis-column</code>. Adem&aacute;s, eso emplaza el punto en la posici&oacute;n
-correcta para imprimir el cuerpo del grafo.
-</p>
-<p>Se puede chequear <code>print-Y-axis</code>:
-</p>
-<ol>
-<li>
-Instalar
-
-<div class="smallexample">
-<pre class="smallexample">Y-axis-label-spacing
-Y-axis-tic
-Y-axis-element
-Y-axis-column
-print-Y-axis
-</pre></div>
-
-</li><li>
-Copia la siguiente expresi&oacute;n:
-
-<div class="smallexample">
-<pre class="smallexample">(print-Y-axis 12 5)
-</pre></div>
-
-</li><li>
-Cambia al b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; y emplaza el cursor donde se
-quiere el eje etiquetado para empezar.
-
-</li><li>
-Escribe <kbd>M-:</kbd> (<code>eval-expression</code>).
-
-</li><li>
-Pega la expresi&oacute;n <code>graph-body-print</code> dentro del minib&uacute;ffer con
-<kbd>C-y</kbd> (<code>yank</code>).
-
-</li><li>
-Presiona &lt;RET&gt; para evaluar la expresi&oacute;n
-</li></ol>
-
-<p>Emacs imprimir&aacute; etiquetas verticalmente, el primero siendo
-&lsquo;<samp>10&nbsp;<span class="nolinebreak">-</span>&nbsp;</samp>&rsquo;. (La funci&oacute;n <code>print-graph</code> pasar&aacute; el
-valor de <code>height-of-top-line</code>, que en este caso finalizar&aacute; en
-15, por esto lo que se obtiene podr&iacute;a aparecer como un error.)
-</p>
-<hr>
-<a name="print_002dX_002daxis"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Pen_00faltimo-print_002dY_002daxis" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Diferencias-similares" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-print_002dX_002daxis"></a>
-<h2 class="appendixsec">C.3 La funci&oacute;n <code>print-X-axis</code></h2>
-<a name="index-Ejes_002c-imprime-horizontal"></a>
-<a name="index-imprimiendo-eje-X"></a>
-<a name="index-Imprime-eje-horizontal"></a>
-<a name="index-Imprimiendo-eje-horizontal"></a>
-
-<p>Las etiquetas del eje X son como las etiquetas del eje Y, excepto que
-los ticks son un l&iacute;nea debajo de los n&uacute;meros. Las
-etiquetas se parece como esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> | | | |
- 1 5 10 15
-</pre></div>
-
-<p>El primer tic est&aacute; bajo la primera columna del grafo y est&aacute;
-precedido por varios espacios en blanco. Estos espacios proporcionan
-la habitaci&oacute;n en filas de debajo para las etiquetas del eje Y. El
-segundo, tercer, cuarto, y subsiguientes ticks son todos espaciados
-igualmente, de acuerdo al valor de <code>X-axis-label-spacing</code>.
-</p>
-<p>La segunda fila del eje X consiste de n&uacute;meros, precedidos por varios
-espacios en blanco y tambi&eacute;n separado de acuerdo al valor de la
-variable <code>X-axis-label-spacing</code>.
-</p>
-<p>El valor de la variable <code>X-axis-label-spacing</code>
-ser&iacute;a medido en unidades de <code>symbol-width</code>, puesto
-que se puede querer cambiar el ancho de los s&iacute;mbolos que
-est&aacute;s usando para imprimir el cuerpo del grafo sin cambiar los
-caminos del grafo que est&aacute; etiquetado.
-</p>
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#Diferencias-similares">Similaridades y diferencias</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Mucho como <code>print-Y-axis</code>, pero no
- exactamente.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Eje-X-marca-tic">C.3.1 Eje X marca tic</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Crear marcas de tic para los ejes horizontales.
-</td></tr>
-</table>
-
-<hr>
-<a name="Diferencias-similares"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dX_002daxis" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dX_002daxis" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Eje-X-marca-tic" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Similaridades-y-diferencias"></a>
-<h3 class="unnumberedsubsec">Similaridades y diferencias</h3>
-
-<p>La funci&oacute;n <code>print-X-axis</code> est&aacute; construida m&aacute;s o menos del
-mismo modo como que la funci&oacute;n <code>print-Y-axis</code> excepto que tiene
-dos l&iacute;neas: la l&iacute;nea de marcas tic y los
-n&uacute;meros. Nosotros escribiremos una funci&oacute;n separado a imprimir
-cada l&iacute;nea y entonces combinarlo con la funci&oacute;n
-<code>print-X-axis</code>.
-</p>
-<p>Esto es un proceso de tres pasos:
-</p>
-<ol>
-<li>
-Escribe una funci&oacute;n para imprimir el eje X marca tic,
-<code>print-X-axis-tic-line</code>.
-
-</li><li>
-Escribe una funci&oacute;n imprime los n&uacute;meros X,
-<code>print-X-axis-numbered-line</code>.
-
-</li><li>
-Escribe una funci&oacute;n para imprimir ambas l&iacute;neas, la
-funci&oacute;n <code>print-X-axis</code>, usando <code>print-X-axis-tic-line</code> y
-<code>print-X-axis-numbered-line</code>.
-</li></ol>
-
-<hr>
-<a name="Eje-X-marca-tic"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Diferencias-similares" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#print_002dX_002daxis" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Imprimir-Grafo-Entero" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Eje-X-marca-tic-1"></a>
-<h3 class="appendixsubsec">C.3.1 Eje X marca tic</h3>
-
-<p>La primera funci&oacute;n imprimir&iacute;a las marcas de tic del eje
-X. Se deben especificar las marcas en s&iacute; y su espacio:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defvar X-axis-label-spacing
- (if (boundp 'graph-blank)
- (* 5 (length graph-blank)) 5)
- &quot;N&uacute;meros de unidades desde un eje X al siguiente.&quot;)
-</pre></div>
-
-<p>(Note que el valor de <code>graph-blank</code> est&rsquo;a asignado por otro
-<code>defvar</code>. El predicado <code>boundp</code> chequea si ya ha sido
-asignado; <code>boundp</code> devuelve <code>nil</code> si no lo tiene. Si
-<code>graph-blank</code> fuera disociado y no usara esta construcci&oacute;n
-condicional, en un GNU Emacs reciente, se introducir&iacute;a
-el depurador y mirar&aacute; un mensaje de error diciendo &lsquo;<samp>Debugger&nbsp;<span class="nolinebreak">entered--Lisp</span>&nbsp;error: <span class="nolinebreak">(void-variable</span>&nbsp;<span class="nolinebreak">graph-blank)</span></samp>&rsquo;
-</p>
-<p>Aqu&iacute; est&aacute; el <code>defvar</code> para <code>X-axis-tic-symbol</code>:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defvar X-axis-tic-symbol &quot;|&quot;
- &quot;Cadena para insertar para apuntar a una columna en el eje X.&quot;)
-</pre></div>
-
-<p>El objetivo es crear una l&iacute;nea que se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> | | | |
-</pre></div>
-
-<p>El primer tic es indentado as&iacute; que est&aacute; bajo la
-primera columna, que es indentado para proveer espacio para las
-etiquetas del eje Y.
-</p>
-<p>Un elemento tic consiste en espacios en blanco que se extienden desde
-un tic al siguiente m&aacute;s un s&iacute;mbolo tic. El n&uacute;mero de
-espacios en blanco se determinan por el ancho del
-s&iacute;mbolo tic y el <code>X-axis-label-spacing</code>.
-</p>
-<p>El c&oacute;digo se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;;; X-axis-tic-element
-&hellip;
-(concat
- (make-string
- ;; <span class="roman">Crea una cadena de blancos.</span>
- (- (* symbol-width X-axis-label-spacing)
- (length X-axis-tic-symbol))
- ? )
- ;; <span class="roman">Concatena blancos con s&iacute;mbolos.</span>
- X-axis-tic-symbol)
-&hellip;
-</pre></div>
-
-<p>Lo siguiente, determina cuantos espacios en blanco son necesarios para
-indentar la primera marca tic a la primera del grafo. Esto usa el
-valor de <code>full-Y-label-width</code> pasaba por la funci&oacute;n
-<code>print-graph</code>.
-</p>
-<p>El c&oacute;digo para crear <code>X-axis-leading-spaces</code> se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;; X-axis-leading-spaces
-&hellip;
-(make-string full-Y-label-width ? )
-&hellip;
-</pre></div>
-
-<p>Tambi&eacute;n necesita determinar el tama&ntilde;o del eje horizontal, que es
-el tama&ntilde;o de la lista de n&uacute;meros, y el n&uacute;mero de ticks en el eje
-horizontal:
-</p>
-<div class="smallexample">
-<pre class="smallexample">;; X-length
-&hellip;
-(length numbers-list)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;; tic-width
-&hellip;
-(* symbol-width X-axis-label-spacing)
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">;; number-of-X-ticks
-(if (zerop (% (X-length tic-width)))
- (/ (X-length tic-width))
- (1+ (/ (X-length tic-width))))
-</pre></div>
-
-<p>Todo esto lidera directamente a la funci&oacute;n para imprimir el eje X:
-</p>
-<a name="index-print_002dX_002daxis_002dtic_002dline"></a>
-<div class="smallexample">
-<pre class="smallexample">(defun print-X-axis-tic-line
- (number-of-X-tics X-axis-leading-spaces X-axis-tic-element)
- &quot;Imprime ticks para el eje X.&quot;
- (insert X-axis-leading-spaces)
- (insert X-axis-tic-symbol) ; <span class="roman">En la primera columna.</span>
-</pre><pre class="smallexample"> ;; <span class="roman">Inserta el segundo tic en el lugar adecuado.</span>
- (insert (concat
- (make-string
- (- (* symbol-width X-axis-label-spacing)
- ;; <span class="roman">Inserta el espacio en blanco al segundo s&iacute;mbolo tic.</span>
- (* 2 (length X-axis-tic-symbol)))
- ? )
- X-axis-tic-symbol))
-</pre><pre class="smallexample"> ;; <span class="roman">Inserta los ticks que permanecen.</span>
- (while (&gt; number-of-X-tics 1)
- (insert X-axis-tic-element)
- (setq number-of-X-tics (1- number-of-X-tics))))
-</pre></div>
-
-<p>La l&iacute;nea de n&uacute;meros es igualmente simple:
-</p>
-<p>Primero, creamos un elemento numerado con espacios en blanco antes de
-cada n&uacute;mero:
-</p>
-<a name="index-X_002daxis_002delement"></a>
-<div class="smallexample">
-<pre class="smallexample">(defun X-axis-element (number)
- &quot;Construye un elemento del eje X numerado.&quot;
- (let ((leading-spaces
- (- (* symbol-width X-axis-label-spacing)
- (length (number-to-string number)))))
- (concat (make-string leading-spaces ? )
- (number-to-string number))))
-</pre></div>
-
-<p>Lo siguiente, se crea la funci&oacute;n para imprimir la
-l&iacute;nea numerada, empezando con el n&uacute;mero &ldquo;1&rdquo; para la
-primera columna:
-</p>
-<a name="index-print_002dX_002daxis_002dnumbered_002dline"></a>
-<div class="smallexample">
-<pre class="smallexample">(defun print-X-axis-numbered-line
- (number-of-X-tics X-axis-leading-spaces)
- &quot;Imprime la l&iacute;neas de n&uacute;meros del eje X&quot;
- (let ((number X-axis-label-spacing))
- (insert X-axis-leading-spaces)
- (insert &quot;1&quot;)
-</pre><pre class="smallexample"> (insert (concat
- (make-string
- ;; <span class="roman">Inserta espacios en blanco al siguiente n&uacute;mero.</span>
- (- (* symbol-width X-axis-label-spacing) 2)
- ? )
- (number-to-string number)))
-</pre><pre class="smallexample"> ;; <span class="roman">Insertar n&uacute;meros.</span>
- (setq number (+ number X-axis-label-spacing))
- (while (&gt; number-of-X-tics 1)
- (insert (X-axis-element number))
- (setq number (+ number X-axis-label-spacing))
- (setq number-of-X-tics (1- number-of-X-tics)))))
-</pre></div>
-
-<p>Finalmente, se necesita escribir lo que <code>print-X-axis</code> que usa
-<code>print-X-axis-tic-line</code> y <code>print-X-axis-numbered-line</code>.
-</p>
-<p>La funci&oacute;n debe determinar los valores locales de las variables
-usadas por <code>print-X-axis-tic-line</code> y
-<code>print-X-axis-numbered-line</code>, y entonces eso debe
-llamarlas. Tambi&eacute;n, debe imprimir el retorno de carro que separe las
-dos l&iacute;neas.
-</p>
-<p>La funci&oacute;n consiste de una varlist que especifica cinco variables
-locales, y llama cada una de las dos l&iacute;neas imprimiendo
-funciones:
-</p>
-<a name="index-print_002dX_002daxis"></a>
-<div class="smallexample">
-<pre class="smallexample">(defun print-X-axis (numbers-list)
- &quot;Imprime el eje X etique al tama&ntilde;o de NUMBERS-LIST.&quot;
- (let* ((leading-spaces
- (make-string full-Y-label-width ? ))
-</pre><pre class="smallexample"> ;; symbol-width <span class="roman">se provee por</span> graph-body-print
- (tic-width (* symbol-width X-axis-label-spacing))
- (X-length (length numbers-list))
-</pre><pre class="smallexample"> (X-tic
- (concat
- (make-string
-</pre><pre class="smallexample"> ;; <span class="roman">Crea una cadena de espacios en blanco.</span>
- (- (* symbol-width X-axis-label-spacing)
- (length X-axis-tic-symbol))
- ? )
-</pre><pre class="smallexample"> ;; <span class="roman">Concatena espacio en blanco con s&iacute;mbolos
- tic.</span>
- X-axis-tic-symbol))
-</pre><pre class="smallexample"> (tic-number
- (if (zerop (% X-length tic-width))
- (/ X-length tic-width)
- (1+ (/ X-length tic-width)))))
-</pre><pre class="smallexample"> (print-X-axis-tic-line tic-number leading-spaces X-tic)
- (insert &quot;\n&quot;)
- (print-X-axis-numbered-line tic-number leading-spaces)))
-</pre></div>
-
-<p>Se puede testear <code>print-X-axis</code>:
-</p>
-<ol>
-<li>
-Instale <code>X-axis-tic-symbol</code>, <code>X-axis-label-spacing</code>,
-<code>print-X-axis-tic-line</code>, tanto como <code>X-axis-element</code>,
-<code>print-X-axis-numbered-line</code>, y <code>print-X-axis</code>.
-
-</li><li>
-Copia la siguiente expresi&oacute;n:
-
-<div class="smallexample">
-<pre class="smallexample">(progn
- (let ((full-Y-label-width 5)
- (symbol-width 1))
- (print-X-axis
- '(1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16))))
-</pre></div>
-
-</li><li>
-Cambia al b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; y emplaza el cursor donde se
-quiere el eje etiquetado para empezar.
-
-</li><li>
-Escribe <kbd>M-:</kbd> (<code>eval-expression</code>).
-
-</li><li>
-Pegue la expresi&oacute;n de test dentro del minibuffer con <kbd>C-y</kbd>
-(<code>yank</code>).
-
-</li><li>
-Presiona &lt;RET&gt; para evaluar la expresi&oacute;n
-</li></ol>
-
-<p>Emacs imprimir&aacute; el eje horizontal as&iacute;
-</p><br>
-
-<div class="smallexample">
-<pre class="smallexample"> | | | | |
- 1 5 10 15 20
-</pre></div>
-
-<hr>
-<a name="Imprimir-Grafo-Entero"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Eje-X-marca-tic" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-completo" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#La-versi_00f3n-final" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Imprimiendo-el-grafo-completo"></a>
-<h2 class="appendixsec">C.4 Imprimiendo el grafo completo</h2>
-<a name="index-Imprimiendo-el-grafo-entero"></a>
-<a name="index-Imprimiendo-el-grafo-entero-1"></a>
-<a name="index-Grafo_002c-imprimiendo-todo"></a>
-
-<p>Ahora estamos listos para imprimir el grafo completo.
-</p>
-<p>La funci&oacute;n para imprimir el grafo con las etiquetas apropiadas sigue
-el esquema que creamos antes (v&eacute;ase la secci&oacute;n <a href="#Grafo-completo">Un Grafo con Ejes Etiquetados</a>), pero con adiciones.
-</p>
-<p>Aqu&iacute; est&aacute; el esquema:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun print-graph (numbers-list)
- &quot;<var>documentation</var>&hellip;&quot;
- (let ((height &hellip;
- &hellip;))
-</pre><pre class="smallexample"> (print-Y-axis height &hellip; )
- (graph-body-print numbers-list)
- (print-X-axis &hellip; )))
-</pre></div>
-
-<table class="menu" border="0" cellspacing="0">
-<tr><td align="left" valign="top"><a href="#La-versi_00f3n-final">Cambios para la versi&oacute;n final</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Unos pocos cambios
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Testear-print_002dgraph">C.4.1 Testeando <code>print-graph</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejecutar un r&aacute;pido test.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Graficar-palabras-en-funciones">C.4.2 Creando gr&aacute;ficas de n&uacute;meros de palabras y s&iacute;mbolos</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Ejecutando el c&oacute;digo final.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#lambda">C.4.3 Una expresi&oacute;n <code>lambda</code>: Anonimicidad &uacute;til</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> C&oacute;mo escribir una funci&oacute;n an&oacute;nima.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#mapcar">C.4.4 La funci&oacute;n <code>mapcar</code></a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Aplicar una funci&oacute;n a elementos de una lista.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Otro-Error">C.4.5 Otro error &hellip; m&aacute;s insidioso</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> Todav&iacute;a otro error &hellip; m&aacute;s
- insidioso.
-</td></tr>
-<tr><td align="left" valign="top"><a href="#Grafo-impreso-final">C.4.6 El gr&aacute;fico impreso</a></td><td>&nbsp;&nbsp;</td><td align="left" valign="top"> &iexcl;El grafo en s&iacute;!
-</td></tr>
-</table>
-
-<hr>
-<a name="La-versi_00f3n-final"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Imprimir-Grafo-Entero" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Imprimir-Grafo-Entero" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Testear-print_002dgraph" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Cambios-para-la-version-final"></a>
-<h3 class="unnumberedsubsec">Cambios para la versi&oacute;n final</h3>
-
-<p>La versi&oacute;n final es diferente desde que se planea en dos caminos:
-primero, contiene los valores adicionales calculadas una vez que en la
-varlist; segundo, eso trae una opci&oacute;n para espec&iacute;ficar
-las etiquetas se incrementa la fila. Esta &uacute;ltima funcionalidad
-cambia a ser esencial; de otro modo, un grafo puede tener m&aacute;s filas
-que ajustarse en una muestra o en una hoja de papel.
-</p>
-<p>Esta nueva funcionalidad requiere un cambio a la funci&oacute;n
-<code>Y-axis-column</code>, para a&ntilde;adir <code>vertical-step</code> para
-eso. Esta funci&oacute;n es parece a esto:
-</p>
-<a name="index-Y_002daxis_002dcolumn-Version-Final_002e"></a>
-<div class="smallexample">
-<pre class="smallexample">;;; <span class="roman">Versi&oacute;n Final.</span>
-(defun Y-axis-column
- (height width-of-label &amp;optional vertical-step)
- &quot;Construye una lista de etiquetas para el eje Y.
-HEIGHT es la m&aacute;xima altura del grafo.
-WIDTH-OF-LABEL es el m&aacute;ximo ancho de la etiqueta.
-VERTICAL-STEP, una opci&oacute;n, es un entero positivo
-que especifica cuanto una etiqueta de eje Y incrementa
-cada l&iacute;nea. Por ejemplo, un paso de 5
-significa que cada l&iacute;nea es cinco unidades
-del grafo.&quot;
-</pre><pre class="smallexample"> (let (Y-axis
- (number-per-line (or vertical-step 1)))
- (while (&gt; height 1)
- (if (zerop (% height Y-axis-label-spacing))
-</pre><pre class="smallexample"> ;; <span class="roman">Inserta etiqueta.</span>
- (setq Y-axis
- (cons
- (Y-axis-element
- (* height number-per-line)
- width-of-label)
- Y-axis))
-</pre><pre class="smallexample"> ;; <span class="roman">Else, inserta espacios en blanco.</span>
- (setq Y-axis
- (cons
- (make-string width-of-label ? )
- Y-axis)))
- (setq height (1- height)))
-</pre><pre class="smallexample"> ;; <span class="roman">Inserta l&iacute;nea base.</span>
- (setq Y-axis (cons (Y-axis-element
- (or vertical-step 1)
- width-of-label)
- Y-axis))
- (nreverse Y-axis)))
-</pre></div>
-
-<p>Los valores para la m&aacute;xima altura del grafo y el ancho de un
-s&iacute;mbolo se computan por <code>print-graph</code> es su
-expresi&oacute;n <code>let</code>; as&iacute; <code>graph-body-print</code> debe
-ser cambiado para aceptarlos.
-</p>
-<a name="index-graph_002dbody_002dprint-Version-Final_002e"></a>
-<div class="smallexample">
-<pre class="smallexample">;;; <span class="roman">Versi&oacute;n Final.</span>
-(defun graph-body-print (numbers-list height symbol-width)
- &quot;Imprime una gr&aacute;fica de barras del NUMBERS-LIST.
-El numbers-list consiste en los valores del eje Y.
-HEIGHT es la m&aacute;xisma altura del grafo.
-SYMBOL-WIDTH es el n&uacute;mero de cada columna.&quot;
-</pre><pre class="smallexample"> (let (from-position)
- (while numbers-list
- (setq from-position (point))
- (insert-rectangle
- (column-of-graph height (car numbers-list)))
- (goto-char from-position)
- (forward-char symbol-width)
-</pre><pre class="smallexample"> ;; <span class="roman">Dibuja el grafo columna por columna.</span>
- (sit-for 0)
- (setq numbers-list (cdr numbers-list)))
- ;; <span class="roman">Posiciona el punto para las etiquetas del eje X.</span>
- (forward-line height)
- (insert &quot;\n&quot;)))
-</pre></div>
-
-<p>Finalmente, el c&oacute;digo para la funci&oacute;n <code>print-graph</code>:
-</p>
-<a name="index-print_002dgraph-Version-Final_002e"></a>
-<div class="smallexample">
-<pre class="smallexample">;;; <span class="roman">Versi&oacute;n Final.</span>
-(defun print-graph
- (numbers-list &amp;optional vertical-step)
- &quot;El gr&aacute;fico de barras etiquetadas del NUMBERS-LIST.
-El numbers-list consiste en los valores de eje Y.
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">Opcionalmente, VERTICAL-STEP, un entero positivo, especifica cuanto el
-eje Y incrementa cada l&iacute;nea. Por ejemplo, un paso de 5
-significa que cada fila es de cinco unidades.
-</pre><pre class="smallexample"> (let* ((symbol-width (length graph-blank))
- ;; <code>height</code> <span class="roman">en ambos es el n&uacute;mero m&aacute;s largo</span>
- ;; <span class="roman">y el n&uacute;mero con la mayor&iacute;a de los digitos.</span>
- (height (apply 'max numbers-list))
-</pre><pre class="smallexample"> (height-of-top-line
- (if (zerop (% height Y-axis-label-spacing))
- height
- ;; <span class="roman">else</span>
- (* (1+ (/ height Y-axis-label-spacing))
- Y-axis-label-spacing)))
-</pre><pre class="smallexample"> (vertical-step (or vertical-step 1))
- (full-Y-label-width
- (length
-</pre><pre class="smallexample"> (concat
- (number-to-string
- (* height-of-top-line vertical-step))
- Y-axis-tic))))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> (print-Y-axis
- height-of-top-line full-Y-label-width vertical-step)
-</pre><pre class="smallexample"> (graph-body-print
- numbers-list height-of-top-line symbol-width)
- (print-X-axis numbers-list)))
-</pre></div>
-
-<hr>
-<a name="Testear-print_002dgraph"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#La-versi_00f3n-final" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Imprimir-Grafo-Entero" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Graficar-palabras-en-funciones" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Testeando-print_002dgraph"></a>
-<h3 class="appendixsubsec">C.4.1 Testeando <code>print-graph</code></h3>
-
-<p>Se puede chequear la funci&oacute;n <code>print-graph</code> con una lista
-ordenada de n&uacute;meros:
-</p>
-<ol>
-<li>
-Instala las versiones finales de <code>Y-axis-column</code>,
-<code>graph-body-print</code>, y <code>print-graph</code> (adem&aacute;s del resto del
-c&oacute;digo.)
-
-</li><li>
-Copia la siguiente expresi&oacute;n:
-
-<div class="smallexample">
-<pre class="smallexample">(print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1))
-</pre></div>
-
-</li><li>
-Cambia al b&uacute;ffer &lsquo;<tt>*scratch*</tt>&rsquo; y emplaza el cursor donde se
-quiere el eje etiquetado para empezar.
-
-</li><li>
-Escribe <kbd>M-:</kbd> (<code>eval-expression</code>).
-
-</li><li>
-Pegue la expresi&oacute;n de test dentro del minibuffer con <kbd>C-y</kbd>
-(<code>yank</code>).
-
-</li><li>
-Presiona &lt;RET&gt; para evaluar la expresi&oacute;n
-</li></ol>
-
-<p>Emacs imprimir&aacute; un grafo que se parece a:
-</p>
-<div class="smallexample">
-<pre class="smallexample">10 -
-
-
- *
- ** *
- 5 - **** *
- **** ***
- * *********
- ************
- 1 - *************
-
- | | | |
- 1 5 10 15
-</pre></div>
-
-<p>Por otro lado, si se pasa a <code>print-graph</code> un <code>vertical-step</code>
-valor de 2, evaluando esta expresi&oacute;n:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(print-graph '(3 2 5 6 7 5 3 4 6 4 3 2 1) 2)
-</pre></div>
-
-<p>El grafo se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">20 -
-
-
- *
- ** *
-10 - **** *
- **** ***
- * *********
- ************
- 2 - *************
-
- | | | |
- 1 5 10 15
-</pre></div>
-
-<p>(Una pregunta: ¿es el &lsquo;2&rsquo; debajo del eje vertical un error o una
-funcionalidad? Si se piensa que es un error, y ser&iacute;a un
-&lsquo;1&rsquo;, (o incluso un &lsquo;0&rsquo;), se pueden modificar las fuentes.)
-</p>
-<hr>
-<a name="Graficar-palabras-en-funciones"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Testear-print_002dgraph" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Imprimir-Grafo-Entero" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#lambda" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Creando-graficas-de-numeros-de-palabras-y-simbolos"></a>
-<h3 class="appendixsubsec">C.4.2 Creando gr&aacute;ficas de n&uacute;meros de palabras y s&iacute;mbolos</h3>
-
-<p>Ahora para el gr&aacute;fico para el que todo este c&oacute;digo fu&eacute; escrito:
-un gr&aacute;fico que muestra cuantas definiciones de funci&oacute;n contienen
-unas pocas 10 palabras y s&iacute;mbolos, cuantas contienen
-entre 10 y 19 palabras y s&iacute;mbolos, cuantos contienen
-entre 20 y 29 palabras y s&iacute;mbolos, y as&iacute;.
-</p>
-<p>Esto es un proceso de m&uacute;ltiples pasos. Primero aseg&uacute;rate que has
-cargado todo el requisito del c&oacute;digo.
-</p>
-<p>Eso es una buena idea para eliminar el valor de <code>top-of-ranges</code>
-en caso de que has asignado a alg&uacute;n valor diferente. Se puede
-evaluar lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq top-of-ranges
- '(10 20 30 40 50
- 60 70 80 90 100
- 110 120 130 140 150
- 160 170 180 190 200
- 210 220 230 240 250
- 260 270 280 290 300)
-</pre></div>
-
-<p>Lo siguiente crea una lista del n&uacute;mero de palabras y
-s&iacute;mbolos en cada rango.
-</p>
-<p>Eval&uacute;a lo siguiente:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq list-for-graph
- (defuns-per-range
- (sort
- (recursive-lengths-list-many-files
- (directory-files &quot;/usr/local/emacs/lisp&quot;
- t &quot;.+el$&quot;))
- '&lt;)
- top-of-ranges))
-</pre></div>
-
-<p>En mi vieja m&aacute;quina, esto lleva como una hora. Se parece a 303
-ficheros Lisp en mi copia de Emacs version 19.23. Despu&eacute;s de toda
-esta computaci&oacute;n, el <code>list-for-graph</code> ten&iacute;a este
-valor:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(537 1027 955 785 594 483 349 292 224 199 166 120 116 99
-90 80 67 48 52 45 41 33 28 26 25 20 12 28 11 13 220)
-</pre></div>
-
-<p>Esto significa que mi copia de Emacs tiene 537 definiciones de
-funciones con poco menos de 10 palabras o s&iacute;mbolos en
-s&iacute;, 1027 definiciones de funci&oacute;n con 10 a 19 palabras
-o s&iacute;mbolos dentro, 955 definiciones de funci&oacute;n con 20
-a 29 palabras o s&iacute;mbolos dentro, y as&iacute;.
-</p>
-<p>Claramente, solo buscando esta lista se puede ver que la
-mayor&iacute;a de definiciones de funci&oacute;n contienen de diez a
-treinta palabras y s&iacute;mbolos.
-</p>
-<p>Ahora para imprimir. Nosotros <em>no</em> queremos imprimir un grafo que
-es de 1030 l&iacute;neas de alto &hellip;. En vez de eso,
-imprimir&iacute;a un grafo que es mejor que venticinco
-l&iacute;neas de alto. Un grafo cuya altura puede ser mostrada
-en casi cualquier monitor, y f&aacute;cilmente impreso en una hoja de papel.
-</p>
-<p>Esto significa que cada valor en <code>list-for-graph</code> debe ser
-reducido a un quinceavo de su valor presente.
-</p>
-<p>Aqu&iacute; hay una corta funci&oacute;n para hacer esto, usando dos
-funciones que no se han visto todav&iacute;a, <code>mapcar</code> y
-<code>lambda</code>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun one-fiftieth (full-range)
- &quot;Devuelve la lista, con el cincuenteavo de cada elemento.&quot;
- (mapcar '(lambda (arg) (/ arg 50)) full-range))
-</pre></div>
-
-<hr>
-<a name="lambda"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Graficar-palabras-en-funciones" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Imprimir-Grafo-Entero" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#mapcar" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Una-expresion-lambda_003a-Anonimicidad-util"></a>
-<h3 class="appendixsubsec">C.4.3 Una expresi&oacute;n <code>lambda</code>: Anonimicidad &uacute;til</h3>
-<a name="index-Funcion-Anonima"></a>
-<a name="index-lambda"></a>
-
-<p><code>lambda</code> es el s&iacute;mbolo para una funci&oacute;n
-an&oacute;nima, una funci&oacute;n sin un nombre. Cada vez que se use una
-funci&oacute;n an&oacute;nima, se necesita incluir su cuerpo completo.
-</p>
-<p>De este modo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(lambda (arg) (/ arg 50))
-</pre></div>
-
-<p>es una definici&oacute;n de funci&oacute;n que dice &lsquo;devuelve el valor
-resultante de dividir cualquier cosa que es pasada como <code>arg</code> por
-50&rsquo;.
-</p>
-<p>Pronto, por ejemplo, se ten&iacute;a una funci&oacute;n
-<code>multiply-by-seven</code>; se multiplica su argumento por 7. Esta
-funci&oacute;n es similar, excepto que divide su argumento por 50; y, no
-tiene nombre. El equivalente an&oacute;nimo de <code>multiply-by-seven</code> es:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(lambda (number) (* 7 number))
-</pre></div>
-
-<p>(V&eacute;ase la secci&oacute;n <a href="#defun">La forma especial <code>defun</code></a>.)
-</p>
-<p>Si queremos multiplicar 3 por 7, podemos escribir:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(multiply-by-seven 3)
- \_______________/ ^
- | |
- funci&oacute;n argumento
-</pre></div>
-<br>
-<br>
-
-<p>Esta expresi&oacute;n devuelve 21.
-</p>
-<p>De manera similar, se puede escribir:
-</p>
-<div class="smallexample">
-<pre class="smallexample">((lambda (number) (* 7 number)) 3)
- \____________________________/ ^
- | |
- funci&oacute;n an&oacute;nima argumento
-</pre></div>
-<br>
-<br>
-
-<p>Si queremos dividir 100 por 50, se puede escribir:
-</p>
-<div class="smallexample">
-<pre class="smallexample">((lambda (arg) (/ arg 50)) 100)
- \______________________/ \_/
- | |
- funci&oacute;n an&oacute;nima argumento
-</pre></div>
-<br>
-<br>
-
-<p>Esta expresi&oacute;n devuelve 2. El 100 es pasado para la funci&oacute;n, que
-divide este n&uacute;mero por 50.
-</p>
-<p>See <a href="elisp.html#Expresiones-Lambda">Expresiones Lambda</a> in <cite>El Manual de Referencia GNU Emacs Lisp</cite>, para m&aacute;s acerca de <code>lambda</code>. Lisp y
-expresiones Lambda se derivan del C&aacute;lculo Lambda.
-</p>
-<hr>
-<a name="mapcar"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#lambda" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Imprimir-Grafo-Entero" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Otro-Error" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="La-funcion-mapcar"></a>
-<h3 class="appendixsubsec">C.4.4 La funci&oacute;n <code>mapcar</code></h3>
-<a name="index-mapcar"></a>
-
-<p><code>mapcar</code> es una funci&oacute;n que llama a su primer argumento con
-cada elemento de su segundo argumento. El segundo argumento debe ser
-una secuencia.
-</p>
-<p>La parte &lsquo;<samp>map</samp>&rsquo; del nombre viene de la frase matem&aacute;tica,
-&lsquo;mapeando a trav&eacute;s de un dominio&rsquo;, significa hace apply a una
-funci&oacute;n a cada uno de los elementos en un dominio. La frase
-matem&aacute;tica est&aacute; basada en la met&aacute;fora de un superviviente
-paseando, un paso en un momento, a trav&eacute;s de un &aacute;rea &eacute;l est&aacute;
-mapeando. Y &lsquo;<samp>car</samp>&rsquo;, de acuerdo, viene desde la noci&oacute;n Lisp del
-primero de una lista.
-</p>
-<p>Por ejemplo,
-</p>
-<div class="smallexample">
-<pre class="smallexample">(mapcar '1+ '(2 4 6))
- &rArr; (3 5 7)
-</pre></div>
-
-<p>La funci&oacute;n <code>1+</code> a&ntilde;ade uno a su argumento, es ejecutada en
-<em>each</em> de la lista, y una nueva lista es devuelta.
-</p>
-<p>En contraste con esto <code>apply</code>, se aplica su primer argumento a todo
-lo que permanece. (V&eacute;ase la secci&oacute;n <a href="#Leyendo-un-grafo">Leyendo un grafo</a>, para
-una explicaci&oacute;n de <code>apply</code>.)
-</p>
-<p>En la definici&oacute;n de <code>one-fiftieth</code>, el primer argumento es la
-funci&oacute;n an&oacute;nima:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(lambda (arg) (/ arg 50))
-</pre></div>
-
-<p>y el segundo argumento es <code>full-range</code>, que ser&aacute; asociado para
-<code>list-for-graph</code>.
-</p>
-<p>La expresi&oacute;n completa se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(mapcar (lambda (arg) (/ arg 50)) full-range))
-</pre></div>
-
-<p>See <a href="elisp.html#Funciones-de-Mapeo">Mapeando Funciones</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>, para m&aacute;s acerca de <code>mapcar</code>.
-</p>
-<p>Usando la funci&oacute;n <code>one-fiftieth</code>, se puede generar una lista en
-el que cada elemento es un cincuenteavo del tama&ntilde;o del
-correspondiente elemento en <code>list-for-graph</code>.
-</p>
-<div class="smallexample">
-<pre class="smallexample">(setq fiftieth-list-for-graph
- (one-fiftieth list-for-graph))
-</pre></div>
-
-<p>La lista resultante se parece a esto:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(10 20 19 15 11 9 6 5 4 3 3 2 2
-1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 4)
-</pre></div>
-
-<p>As&iacute;, &iexcl;ya estamos casi listos para imprimir!
-(Tambi&eacute;n se notifica la p&eacute;rdida de informaci&oacute;n: muchos de los
-rangos superiores son 0, esto significa que menos de 50 funciones
-ten&iacute;an muchas palabras o s&iacute;mbolos &mdash; pero
-no necesariamente significando que niguna ten&iacute;a muchas
-palabras o s&iacute;mbolos.)
-</p>
-<hr>
-<a name="Otro-Error"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#mapcar" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Imprimir-Grafo-Entero" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-impreso-final" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Otro-error-_2026-mas-insidioso"></a>
-<h3 class="appendixsubsec">C.4.5 Otro error &hellip; m&aacute;s insidioso</h3>
-<a name="index-Error_002c-del-tipo-mas-insidioso"></a>
-<a name="index-Insidioso-tipo-de-error"></a>
-
-<p>&iexcl;Se dijo &lsquo;casi listo para imprimir&rsquo;! De acuerdo, hay un
-error en la funci&oacute;n <code>print-graph</code> &hellip;. Esta tiene una
-opci&oacute;n <code>vertical-step</code>, pero no una opci&oacute;n
-<code>horizontal-step</code>. La escala <code>top-of-range</code> va desde 10 a
-300 por decenas. Pero la funci&oacute;n <code>print-graph</code> imprimir&aacute; solo
- uno por uno.
-</p>
-<p>Esto es un ejemplo cl&aacute;sico de lo que algunos consideramos el tipo
-m&aacute;s insidioso de error, el error de omisi&oacute;n. Este no es el tipo de
-error que se puede encontrar estudiando el c&oacute;digo, para eso no es el
-c&oacute;digo; es una funcionalidad omitida. Tus mejores acciones son
-probar tu programa pronto y con frecuencia; e intentar poner en orden,
-tanto como se pueda, escribir c&oacute;digo que sea f&aacute;cil de comprender y
-f&aacute;cil de cambiar. Intenta ser consciente, siempre y cuando se pueda,
-esto es siempre que tengas que escribir, <em>ser&aacute;</em> reescrito, si
-no pronto, eventualmente. Un m&aacute;ximo duro de seguir.
-</p>
-<p>Esta es la funci&oacute;n <code>print-X-axis-numbered-line</code> que necesita el
-trabajo; y entonces el <code>print-X-axis</code> y la funci&oacute;n
-<code>print-graph</code> necesita ser adaptada. No se necesita mucho para
-ser hecho; hay uno simp&aacute;tico: los n&uacute;meros podr&iacute;an
-alinearse con marcas de tic. Esto toma un peque&ntilde;o pensamiento.
-</p>
-<p>Aqu&iacute; est&aacute; el <code>print-X-axis-numbered-line</code> corregido:
-</p>
-<div class="smallexample">
-<pre class="smallexample">(defun print-X-axis-numbered-line
- (number-of-X-tics X-axis-leading-spaces
- &amp;optional horizontal-step)
- &quot;Imprime la l&iacute;neas de n&uacute;meros X-axis&quot;
- (let ((number X-axis-label-spacing)
- (horizontal-step (or horizontal-step 1)))
-</pre><pre class="smallexample"> (insert X-axis-leading-spaces)
- ;; <span class="roman">Elimina espacios extra de gu&iacute;a.</span>
- (delete-char
- (- (1-
- (length (number-to-string horizontal-step)))))
- (insert (concat
- (make-string
-</pre><pre class="smallexample"> ;; <span class="roman">Inserta espacio en blanco.</span>
- (- (* symbol-width
- X-axis-label-spacing)
- (1-
- (length
- (number-to-string horizontal-step)))
- 2)
- ? )
- (number-to-string
- (* number horizontal-step))))
-</pre><pre class="smallexample"> ;; <span class="roman">Insertar los n&uacute;meros que permanecen.</span>
- (setq number (+ number X-axis-label-spacing))
- (while (&gt; number-of-X-tics 1)
- (insert (X-axis-element
- (* number horizontal-step)))
- (setq number (+ number X-axis-label-spacing))
- (setq number-of-X-tics (1- number-of-X-tics)))))
-</pre></div>
-
-<p>Si se est&aacute; leyendo esto en Info, se pueden ver las nuevas versiones
-<code>print-X-axis</code> y <code>print-graph</code> y los evaluarlas. Si se
-est&aacute; leyendo esto en un libro impreso, se pueden ver las
-l&iacute;neas cambiadas aqu&iacute; (el texto completo
-es mucho para imprimir).
-</p>
-
-<div class="smallexample">
-<pre class="smallexample">(defun print-X-axis (numbers-list horizontal-step)
- &quot;Imprime etiquetas del eje X a la longitud de NUMBERS-LIST.
-Opcionalmente, HORIZONTAL-STEP, un entero positivo,
-especifica cuanto una etiqueta del eje X incrementa
-cada columna.&quot;
-</pre><pre class="smallexample">;; Valor del s&iacute;mbolo symbol-width and full-Y-label-width
-;; se pasan por `print-graph'.
- (let* ((leading-spaces
- (make-string full-Y-label-width ? ))
- ;; symbol-width <span class="roman">is provided by</span> graph-body-print
- (tic-width (* symbol-width X-axis-label-spacing))
- (X-length (length numbers-list))
-</pre><pre class="smallexample"> (X-tic
- (concat
- (make-string
- ;; <span class="roman">Crea una cadena de espacios en blanco.</span>
- (- (* symbol-width X-axis-label-spacing)
- (length X-axis-tic-symbol))
- ? )
-</pre><pre class="smallexample"> ;; <span class="roman">Concatena espacios en blanco con el
- s&iacute;mbolo tic.</span>
- X-axis-tic-symbol))
- (tic-number
- (if (zerop (% X-length tic-width))
- (/ X-length tic-width)
- (1+ (/ X-length tic-width)))))
-</pre><pre class="smallexample">
-</pre><pre class="smallexample"> (print-X-axis-tic-line
- tic-number leading-spaces X-tic)
- (insert &quot;\n&quot;)
- (print-X-axis-numbered-line
- tic-number leading-spaces horizontal-step)))
-</pre></div>
-
-<div class="smallexample">
-<pre class="smallexample">(defun print-graph
- (numbers-list &amp;optional vertical-step horizontal-step)
- &quot;Imprime el gr&aacute;fico de barras etiquetada de los NUMBERS-LIST.
-Los numbers-list consisten en los valores del eje Y.&quot;
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">Opcionalmente, VERTICAL-STEP, un entero positivo, especifica cuanto un
-eje Y se incrementa por cada l&iacute;nea. Por ejemplo, un paso
-de 5 significa que cada fila es de cinco unidades.
-</pre><pre class="smallexample">
-</pre><pre class="smallexample">Opcionalmente, HORIZONTAL-STEP, un entero positivo,
-especifica cuanto se incrementa en un eje X cada columna.&quot;
- (let* ((symbol-width (length graph-blank))
- ;; <code>height</code> <span class="roman">es ambos el n&uacute;mero m&aacute;s largo</span>
- ;; <span class="roman">y el n&uacute;mero con la mayor&iacute;a de los d&iacute;gitos.</span>
- (height (apply 'max numbers-list))
-</pre><pre class="smallexample"> (height-of-top-line
- (if (zerop (% height Y-axis-label-spacing))
- height
- ;; <span class="roman">else</span>
- (* (1+ (/ height Y-axis-label-spacing))
- Y-axis-label-spacing)))
-</pre><pre class="smallexample"> (vertical-step (or vertical-step 1))
- (full-Y-label-width
- (length
- (concat
- (number-to-string
- (* height-of-top-line vertical-step))
- Y-axis-tic))))
-</pre><pre class="smallexample"> (print-Y-axis
- height-of-top-line full-Y-label-width vertical-step)
- (graph-body-print
- numbers-list height-of-top-line symbol-width)
- (print-X-axis numbers-list horizontal-step)))
-</pre></div>
-
-
-
-<hr>
-<a name="Grafo-impreso-final"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Otro-Error" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Imprimir-Grafo-Entero" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="El-grafico-impreso"></a>
-<h3 class="appendixsubsec">C.4.6 El gr&aacute;fico impreso</h3>
-
-<p>Cuando est&eacute; hecho e instalado, se puede llamar al comando
-<code>print-graph</code> como esto:
-</p><br>
-
-<div class="smallexample">
-<pre class="smallexample">(print-graph fiftieth-list-for-graph 50 10)
-</pre></div>
-<br>
-
-<p>Aqu&iacute; est&aacute; el gr&aacute;fico:
-</p><br>
-<br>
-
-<div class="smallexample">
-<pre class="smallexample">1000 - *
- **
- **
- **
- **
- 750 - ***
- ***
- ***
- ***
- ****
- 500 - *****
- ******
- ******
- ******
- *******
- 250 - ********
- ********* *
- *********** *
- ************* *
- 50 - ***************** * *
- | | | | | | | |
- 10 50 100 150 200 250 300 350
-</pre></div>
-
-<br>
-<br>
-
-<p>El grupo largo de funciones contienen de 10 a 19 palabras y
-s&iacute;mbolos.
-</p>
-<hr>
-<a name="Software-Libre-y-Manuales-Libres"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Grafo-completo" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Grafo-impreso-final" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#GNU-Free-Documentation-License" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#GNU-Free-Documentation-License" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Software-Libre-y-Manuales-Libres-1"></a>
-<h1 class="appendix">Appendix D Software Libre y Manuales Libres</h1>
-
-<p><strong>por Richard M. Stallman</strong>
-</p><br>
-
-<p>La mayor deficiencia en sistemas operativos libres no est&aacute; en el
-software &mdash; es la falta de buenos manuales libres que se puedan
-incluir en estos sistemas. Muchos de nuestros programas m&aacute;s
-importantes no vienen con manuales completos. La documentaci&oacute;n es
-una parte esencial de cualquier paquete de software; cuando un paquete
-de software libre no viene con un manual libre, es una brecha
-mayor. Nosotros tenemos muchas brechas hoy.
-</p>
-<p>&Eacute;rase una vez, hace muchos a&ntilde;os, se piensa que
-aprender&iacute;a Perl. Se tiene una copia de un manual libre,
-pero se encontr&oacute; dif&iacute;cil de leer. Cuando pregunto a
-los usuarios de Perl acerca de alternativas, me contaron que
-ser&iacute;an mejor los manuales introductorios &mdash; pero estos
-no eran libres.
-</p>
-<p>¿Por qu&eacute; era esto? Los autores de los buenos manuales
-los hab&iacute;an escrito para O&rsquo;Reilly Associates, que los
-publicaron con t&eacute;rminos restrictivos &mdash; no copiando, no
-modificando, los ficheros fuentes est&aacute;n disponibles &mdash; que los
-excluyen desde la comunidad de software libre.
-</p>
-<p>No era la primera vez que esto ocurr&iacute;a, y (para
-nuestra comunidad es una gran p&eacute;rdida) eso est&aacute; lejos desde el
-&uacute;ltimo. Las editoriales de manuales privativos han logrado que
-muchos autores restrinjan sus manuales desde entonces. Muchas veces se
-ha oido que un usuario de GNU h&aacute;bil me cuente que un manual que
-est&aacute; escribiendo, con el que &eacute;l espera ayudar al proyecto GNU &mdash;
-y entonces ten&iacute;a mis esperanzas frustradas, como se ha
-procedi&oacute; a explicar que &eacute;l ten&iacute;a que haber firmado
-un contrato con una editorial que restringir&iacute;a eso,
-as&iacute; que no puede usarlo.
-</p>
-<p>Debido a que escribir buen ingl&eacute;s es una habilidad rara entre
-programadores, se pueden perder manuales por este motivo.
-</p>
-<p>La documentaci&oacute;n, como el software, es una cuesti&oacute;n de libertad,
-no de precio. El problema con estos manuales no eran que O&rsquo;Reilly
-Associates impusiera un precio por las copias impresas &mdash; que en
-s&iacute; estaban bien. La Free Software Foundation
-<em>Fundaci&oacute;n por el Software Libre</em> <a href="http://shop.fsf.org">vende copias impresas</a> de <a href="http://www.gnu.org/doc/doc.html">manuales libres de GNU</a>, tambi&eacute;n. Pero los manuales de GNU est&aacute;n
-disponibles en forma de c&oacute;digo fuente, mientras que estos manuales
-est&aacute;n disponibles solo en papel. Los manuales de GNU vienen con
-permiso para copiar y modificar; los manuales de Perl no. Estas
-restricciones son un problema.
-</p>
-<p>El criterio para un manual libre es parecido al del software libre: es
-una cuesti&oacute;n de dar a todos los usuarios ciertas libertades. La
-redistribuci&oacute;n (incluyendo redistribuci&oacute;n comercial) debe ser
-permitida, as&iacute; el manual puede acompa&ntilde;ar cada copia
-del programa, en l&iacute;ne o en papel. El permiso para modificar
-es crucial tambi&eacute;n.
-</p>
-<p>Como regla general, no se cree que sea esencial para la gente tener
-permisos para modificar todas las partes de art&iacute;culos y
-libro. Las cuestiones para escritos no son necesariamente las mismas
-como estas para el software. Por ejemplo, no se sabe si se est&aacute;
-obligado a dar permisos para modificar art&iacute;culos como
-este, que describen nuestras acciones y nuestras vistas.
-</p>
-<p>Pero hay una raz&oacute;n particular de por qu&eacute; la libertad de modificar
-es crucial para la documentaci&oacute;n de software libre. Cuando las
-personas ejercita su derecho a modificar el software, y a&ntilde;adir o
-cambiar sus funcionalidades, si son consciente ellos cambiar&aacute;n el
-manual tambi&eacute;n &mdash; as&iacute; se puede proveer
-documentaci&oacute;n usable y cuidada con el programa modificado. Un manual
-que prohibe a los programadores ser consciente y finalizar el trabajo,
-o m&aacute;s precisamente requiere escribir un nuevo manual desde cero si
-ellos cambian el programa, no se ajusta a las necesidades de nuestra
-comunidad.
-</p>
-<p>Mientras una serie de prohibiciones en la modificaci&oacute;n es
-inaceptable, algunos tipos de l&iacute;mites en el m&eacute;todo de
-modificar no tiene tanto problema. Por ejemplo, los requisitos para
-preservar la noticia de autores del copyright, los t&eacute;rminos de
-distribuci&oacute;n, o la lista de autores, est&eacute;n ok. Eso es tambi&eacute;n no
-da problemas para requerir versiones modificadas para incluir
-notificar que fueron modificadas, incluso tienen secciones enteras que
-puede no ser eliminadas o cambiadas, tan largo como estas secciones
-tratan con asuntos no t&eacute;cnicos. (Algunos manuales de GNU los tienen).
-</p>
-<p>Estos tipos de restricciones no son un problema porque, como materia
-pr&aacute;ctica, no para al programador consciente desde la adaptaci&oacute;n
-del manual para ajustar el programa modificado. En otras palabras, no
-se bloquea la comunidad del software libre haciendo el uso completo
-del manual.
-</p>
-<p>Sin embargo, debe ser posible modificar todo el contenido t&eacute;cnico
-del manual, y entonces se distribuye el resultado en todos los medios
-usuales, a trav&eacute;s de todos los canales usuales; de otro modo, las
-restricciones bloquean la comunidad, el manual no es libre, y
-as&iacute; no se necesita otro manual.
-</p>
-<p>Desafortunadamente, con frecuencia es duro encontrar a alguien a
-escribir otro manual cuando un manual privativo. El obst&aacute;culo es que
-muchos usuario piensan que un manual privativo es suficientemente
-bueno &mdash; as&iacute; ellos no ven la necesidad de escribir un
-manual libre. Ellos no ven que el sistema operativo tiene un gazapo
-que necesita se rellenado.
-</p>
-<p>&iquest;Por qu&eacute; los usuarios piensan que los manuales
-privativos son suficientemente buenos? Algunos no han considerado la
-cuesti&oacute;n. Espero que este art&iacute;culo har&aacute; alguna cosa
-para cambiar esto.
-</p>
-<p>Otros usuarios considera manuales privativos aceptables para la misma
-raz&oacute;n as&iacute; muchas personas software privativo
-aceptable: ellos judgan en t&eacute;rminos puramente pr&aacute;cticos, no usando
-la liberta como un criterio. Estas personas son tituladas a sus
-opiniones, pero desde que estas opciones crezcan desde valores que no
-incluyen libertad, ellas no est&aacute;n guiadas por esto quienes valoran
-la libertad.
-</p>
-<p>Por favor, populariza esta cuesti&oacute;n. Se contin&uacute;a a perder manuales
-para publicaci&oacute;n privativa. Si se populariza que los manuales
-privativos no son suficientes, quiz&aacute;s la siguiente persona que
-quiere ayudar a GNU escribiendo documentaci&oacute;n realizar&aacute;, antes de
-que sea demasiado tarde, lo que &eacute;l debe que todo sea libre.
-</p>
-<p>Se puede tambi&eacute;n animar editoriales comerciales a vender manuales
-libres o con copyleft en vez de uno privativo. Un camino que se puede
-ayudar esto chequea los t&eacute;rminos de la distribuci&oacute;n de un manual
-antes de que se compre, y preferimos manuales copyleft a los no copyleft.
-</p>
-<br>
-<br>
-<p>Note: La Fundaci&oacute;n para el Software Libre mantiene una p&aacute;gina en
-su sitio Web que liste libros libres disponibles desde otras
-editoriales:<br> <a href="http://www.gnu.org/doc/other-free-books.html">http://www.gnu.org/doc/other-free-books.html</a>
-</p>
-<hr>
-<a name="GNU-Free-Documentation-License"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Software-Libre-y-Manuales-Libres" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="GNU-Free-Documentation-License-1"></a>
-<h1 class="appendix">Appendix E GNU Free Documentation License</h1>
-
-<a name="index-FDL_002c-GNU-Free-Documentation-License"></a>
-<p align="center">Version 1.3, 3 November 2008
-</p>
-
-<div class="display">
-<pre class="display">Copyright &copy; 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
-<a href="http://fsf.org/">http://fsf.org/</a>
-
-Everyone is permitted to copy and distribute verbatim copies
-of this license document, but changing it is not allowed.
-</pre></div>
-
-<ol>
-<li>
-PREAMBLE
-
-<p>The purpose of this License is to make a manual, textbook, or other
-functional and useful document <em>free</em> in the sense of freedom: to
-assure everyone the effective freedom to copy and redistribute it,
-with or without modifying it, either commercially or noncommercially.
-Secondarily, this License preserves for the author and publisher a way
-to get credit for their work, while not being considered responsible
-for modifications made by others.
-</p>
-<p>This License is a kind of &ldquo;copyleft&rdquo;, which means that derivative
-works of the document must themselves be free in the same sense. It
-complements the GNU General Public License, which is a copyleft
-license designed for free software.
-</p>
-<p>We have designed this License in order to use it for manuals for free
-software, because free software needs free documentation: a free
-program should come with manuals providing the same freedoms that the
-software does. But this License is not limited to software manuals;
-it can be used for any textual work, regardless of subject matter or
-whether it is published as a printed book. We recommend this License
-principally for works whose purpose is instruction or reference.
-</p>
-</li><li>
-APPLICABILITY AND DEFINITIONS
-
-<p>This License applies to any manual or other work, in any medium, that
-contains a notice placed by the copyright holder saying it can be
-distributed under the terms of this License. Such a notice grants a
-world-wide, royalty-free license, unlimited in duration, to use that
-work under the conditions stated herein. The &ldquo;Document&rdquo;, below,
-refers to any such manual or work. Any member of the public is a
-licensee, and is addressed as &ldquo;you&rdquo;. You accept the license if you
-copy, modify or distribute the work in a way requiring permission
-under copyright law.
-</p>
-<p>A &ldquo;Modified Version&rdquo; of the Document means any work containing the
-Document or a portion of it, either copied verbatim, or with
-modifications and/or translated into another language.
-</p>
-<p>A &ldquo;Secondary Section&rdquo; is a named appendix or a front-matter section
-of the Document that deals exclusively with the relationship of the
-publishers or authors of the Document to the Document&rsquo;s overall
-subject (or to related matters) and contains nothing that could fall
-directly within that overall subject. (Thus, if the Document is in
-part a textbook of mathematics, a Secondary Section may not explain
-any mathematics.) The relationship could be a matter of historical
-connection with the subject or with related matters, or of legal,
-commercial, philosophical, ethical or political position regarding
-them.
-</p>
-<p>The &ldquo;Invariant Sections&rdquo; are certain Secondary Sections whose titles
-are designated, as being those of Invariant Sections, in the notice
-that says that the Document is released under this License. If a
-section does not fit the above definition of Secondary then it is not
-allowed to be designated as Invariant. The Document may contain zero
-Invariant Sections. If the Document does not identify any Invariant
-Sections then there are none.
-</p>
-<p>The &ldquo;Cover Texts&rdquo; are certain short passages of text that are listed,
-as Front-Cover Texts or Back-Cover Texts, in the notice that says that
-the Document is released under this License. A Front-Cover Text may
-be at most 5 words, and a Back-Cover Text may be at most 25 words.
-</p>
-<p>A &ldquo;Transparent&rdquo; copy of the Document means a machine-readable copy,
-represented in a format whose specification is available to the
-general public, that is suitable for revising the document
-straightforwardly with generic text editors or (for images composed of
-pixels) generic paint programs or (for drawings) some widely available
-drawing editor, and that is suitable for input to text formatters or
-for automatic translation to a variety of formats suitable for input
-to text formatters. A copy made in an otherwise Transparent file
-format whose markup, or absence of markup, has been arranged to thwart
-or discourage subsequent modification by readers is not Transparent.
-An image format is not Transparent if used for any substantial amount
-of text. A copy that is not &ldquo;Transparent&rdquo; is called &ldquo;Opaque&rdquo;.
-</p>
-<p>Examples of suitable formats for Transparent copies include plain
-<small>ASCII</small> without markup, Texinfo input format, LaTeX input
-format, <acronym>SGML</acronym> or <acronym>XML</acronym> using a publicly available
-<acronym>DTD</acronym>, and standard-conforming simple <acronym>HTML</acronym>,
-PostScript or <acronym>PDF</acronym> designed for human modification. Examples
-of transparent image formats include <acronym>PNG</acronym>, <acronym>XCF</acronym> and
-<acronym>JPG</acronym>. Opaque formats include proprietary formats that can be
-read and edited only by proprietary word processors, <acronym>SGML</acronym> or
-<acronym>XML</acronym> for which the <acronym>DTD</acronym> and/or processing tools are
-not generally available, and the machine-generated <acronym>HTML</acronym>,
-PostScript or <acronym>PDF</acronym> produced by some word processors for
-output purposes only.
-</p>
-<p>The &ldquo;Title Page&rdquo; means, for a printed book, the title page itself,
-plus such following pages as are needed to hold, legibly, the material
-this License requires to appear in the title page. For works in
-formats which do not have any title page as such, &ldquo;Title Page&rdquo; means
-the text near the most prominent appearance of the work&rsquo;s title,
-preceding the beginning of the body of the text.
-</p>
-<p>The &ldquo;publisher&rdquo; means any person or entity that distributes copies
-of the Document to the public.
-</p>
-<p>A section &ldquo;Entitled XYZ&rdquo; means a named subunit of the Document whose
-title either is precisely XYZ or contains XYZ in parentheses following
-text that translates XYZ in another language. (Here XYZ stands for a
-specific section name mentioned below, such as &ldquo;Acknowledgements&rdquo;,
-&ldquo;Dedications&rdquo;, &ldquo;Endorsements&rdquo;, or &ldquo;History&rdquo;.) To &ldquo;Preserve the Title&rdquo;
-of such a section when you modify the Document means that it remains a
-section &ldquo;Entitled XYZ&rdquo; according to this definition.
-</p>
-<p>The Document may include Warranty Disclaimers next to the notice which
-states that this License applies to the Document. These Warranty
-Disclaimers are considered to be included by reference in this
-License, but only as regards disclaiming warranties: any other
-implication that these Warranty Disclaimers may have is void and has
-no effect on the meaning of this License.
-</p>
-</li><li>
-VERBATIM COPYING
-
-<p>You may copy and distribute the Document in any medium, either
-commercially or noncommercially, provided that this License, the
-copyright notices, and the license notice saying this License applies
-to the Document are reproduced in all copies, and that you add no other
-conditions whatsoever to those of this License. You may not use
-technical measures to obstruct or control the reading or further
-copying of the copies you make or distribute. However, you may accept
-compensation in exchange for copies. If you distribute a large enough
-number of copies you must also follow the conditions in section 3.
-</p>
-<p>You may also lend copies, under the same conditions stated above, and
-you may publicly display copies.
-</p>
-</li><li>
-COPYING IN QUANTITY
-
-<p>If you publish printed copies (or copies in media that commonly have
-printed covers) of the Document, numbering more than 100, and the
-Document&rsquo;s license notice requires Cover Texts, you must enclose the
-copies in covers that carry, clearly and legibly, all these Cover
-Texts: Front-Cover Texts on the front cover, and Back-Cover Texts on
-the back cover. Both covers must also clearly and legibly identify
-you as the publisher of these copies. The front cover must present
-the full title with all words of the title equally prominent and
-visible. You may add other material on the covers in addition.
-Copying with changes limited to the covers, as long as they preserve
-the title of the Document and satisfy these conditions, can be treated
-as verbatim copying in other respects.
-</p>
-<p>If the required texts for either cover are too voluminous to fit
-legibly, you should put the first ones listed (as many as fit
-reasonably) on the actual cover, and continue the rest onto adjacent
-pages.
-</p>
-<p>If you publish or distribute Opaque copies of the Document numbering
-more than 100, you must either include a machine-readable Transparent
-copy along with each Opaque copy, or state in or with each Opaque copy
-a computer-network location from which the general network-using
-public has access to download using public-standard network protocols
-a complete Transparent copy of the Document, free of added material.
-If you use the latter option, you must take reasonably prudent steps,
-when you begin distribution of Opaque copies in quantity, to ensure
-that this Transparent copy will remain thus accessible at the stated
-location until at least one year after the last time you distribute an
-Opaque copy (directly or through your agents or retailers) of that
-edition to the public.
-</p>
-<p>It is requested, but not required, that you contact the authors of the
-Document well before redistributing any large number of copies, to give
-them a chance to provide you with an updated version of the Document.
-</p>
-</li><li>
-MODIFICATIONS
-
-<p>You may copy and distribute a Modified Version of the Document under
-the conditions of sections 2 and 3 above, provided that you release
-the Modified Version under precisely this License, with the Modified
-Version filling the role of the Document, thus licensing distribution
-and modification of the Modified Version to whoever possesses a copy
-of it. In addition, you must do these things in the Modified Version:
-</p>
-<ol>
-<li>
-Use in the Title Page (and on the covers, if any) a title distinct
-from that of the Document, and from those of previous versions
-(which should, if there were any, be listed in the History section
-of the Document). You may use the same title as a previous version
-if the original publisher of that version gives permission.
-
-</li><li>
-List on the Title Page, as authors, one or more persons or entities
-responsible for authorship of the modifications in the Modified
-Version, together with at least five of the principal authors of the
-Document (all of its principal authors, if it has fewer than five),
-unless they release you from this requirement.
-
-</li><li>
-State on the Title page the name of the publisher of the
-Modified Version, as the publisher.
-
-</li><li>
-Preserve all the copyright notices of the Document.
-
-</li><li>
-Add an appropriate copyright notice for your modifications
-adjacent to the other copyright notices.
-
-</li><li>
-Include, immediately after the copyright notices, a license notice
-giving the public permission to use the Modified Version under the
-terms of this License, in the form shown in the Addendum below.
-
-</li><li>
-Preserve in that license notice the full lists of Invariant Sections
-and required Cover Texts given in the Document&rsquo;s license notice.
-
-</li><li>
-Include an unaltered copy of this License.
-
-</li><li>
-Preserve the section Entitled &ldquo;History&rdquo;, Preserve its Title, and add
-to it an item stating at least the title, year, new authors, and
-publisher of the Modified Version as given on the Title Page. If
-there is no section Entitled &ldquo;History&rdquo; in the Document, create one
-stating the title, year, authors, and publisher of the Document as
-given on its Title Page, then add an item describing the Modified
-Version as stated in the previous sentence.
-
-</li><li>
-Preserve the network location, if any, given in the Document for
-public access to a Transparent copy of the Document, and likewise
-the network locations given in the Document for previous versions
-it was based on. These may be placed in the &ldquo;History&rdquo; section.
-You may omit a network location for a work that was published at
-least four years before the Document itself, or if the original
-publisher of the version it refers to gives permission.
-
-</li><li>
-For any section Entitled &ldquo;Acknowledgements&rdquo; or &ldquo;Dedications&rdquo;, Preserve
-the Title of the section, and preserve in the section all the
-substance and tone of each of the contributor acknowledgements and/or
-dedications given therein.
-
-</li><li>
-Preserve all the Invariant Sections of the Document,
-unaltered in their text and in their titles. Section numbers
-or the equivalent are not considered part of the section titles.
-
-</li><li>
-Delete any section Entitled &ldquo;Endorsements&rdquo;. Such a section
-may not be included in the Modified Version.
-
-</li><li>
-Do not retitle any existing section to be Entitled &ldquo;Endorsements&rdquo; or
-to conflict in title with any Invariant Section.
-
-</li><li>
-Preserve any Warranty Disclaimers.
-</li></ol>
-
-<p>If the Modified Version includes new front-matter sections or
-appendices that qualify as Secondary Sections and contain no material
-copied from the Document, you may at your option designate some or all
-of these sections as invariant. To do this, add their titles to the
-list of Invariant Sections in the Modified Version&rsquo;s license notice.
-These titles must be distinct from any other section titles.
-</p>
-<p>You may add a section Entitled &ldquo;Endorsements&rdquo;, provided it contains
-nothing but endorsements of your Modified Version by various
-parties&mdash;for example, statements of peer review or that the text has
-been approved by an organization as the authoritative definition of a
-standard.
-</p>
-<p>You may add a passage of up to five words as a Front-Cover Text, and a
-passage of up to 25 words as a Back-Cover Text, to the end of the list
-of Cover Texts in the Modified Version. Only one passage of
-Front-Cover Text and one of Back-Cover Text may be added by (or
-through arrangements made by) any one entity. If the Document already
-includes a cover text for the same cover, previously added by you or
-by arrangement made by the same entity you are acting on behalf of,
-you may not add another; but you may replace the old one, on explicit
-permission from the previous publisher that added the old one.
-</p>
-<p>The author(s) and publisher(s) of the Document do not by this License
-give permission to use their names for publicity for or to assert or
-imply endorsement of any Modified Version.
-</p>
-</li><li>
-COMBINING DOCUMENTS
-
-<p>You may combine the Document with other documents released under this
-License, under the terms defined in section 4 above for modified
-versions, provided that you include in the combination all of the
-Invariant Sections of all of the original documents, unmodified, and
-list them all as Invariant Sections of your combined work in its
-license notice, and that you preserve all their Warranty Disclaimers.
-</p>
-<p>The combined work need only contain one copy of this License, and
-multiple identical Invariant Sections may be replaced with a single
-copy. If there are multiple Invariant Sections with the same name but
-different contents, make the title of each such section unique by
-adding at the end of it, in parentheses, the name of the original
-author or publisher of that section if known, or else a unique number.
-Make the same adjustment to the section titles in the list of
-Invariant Sections in the license notice of the combined work.
-</p>
-<p>In the combination, you must combine any sections Entitled &ldquo;History&rdquo;
-in the various original documents, forming one section Entitled
-&ldquo;History&rdquo;; likewise combine any sections Entitled &ldquo;Acknowledgements&rdquo;,
-and any sections Entitled &ldquo;Dedications&rdquo;. You must delete all
-sections Entitled &ldquo;Endorsements.&rdquo;
-</p>
-</li><li>
-COLLECTIONS OF DOCUMENTS
-
-<p>You may make a collection consisting of the Document and other documents
-released under this License, and replace the individual copies of this
-License in the various documents with a single copy that is included in
-the collection, provided that you follow the rules of this License for
-verbatim copying of each of the documents in all other respects.
-</p>
-<p>You may extract a single document from such a collection, and distribute
-it individually under this License, provided you insert a copy of this
-License into the extracted document, and follow this License in all
-other respects regarding verbatim copying of that document.
-</p>
-</li><li>
-AGGREGATION WITH INDEPENDENT WORKS
-
-<p>A compilation of the Document or its derivatives with other separate
-and independent documents or works, in or on a volume of a storage or
-distribution medium, is called an &ldquo;aggregate&rdquo; if the copyright
-resulting from the compilation is not used to limit the legal rights
-of the compilation&rsquo;s users beyond what the individual works permit.
-When the Document is included in an aggregate, this License does not
-apply to the other works in the aggregate which are not themselves
-derivative works of the Document.
-</p>
-<p>If the Cover Text requirement of section 3 is applicable to these
-copies of the Document, then if the Document is less than one half of
-the entire aggregate, the Document&rsquo;s Cover Texts may be placed on
-covers that bracket the Document within the aggregate, or the
-electronic equivalent of covers if the Document is in electronic form.
-Otherwise they must appear on printed covers that bracket the whole
-aggregate.
-</p>
-</li><li>
-TRANSLATION
-
-<p>Translation is considered a kind of modification, so you may
-distribute translations of the Document under the terms of section 4.
-Replacing Invariant Sections with translations requires special
-permission from their copyright holders, but you may include
-translations of some or all Invariant Sections in addition to the
-original versions of these Invariant Sections. You may include a
-translation of this License, and all the license notices in the
-Document, and any Warranty Disclaimers, provided that you also include
-the original English version of this License and the original versions
-of those notices and disclaimers. In case of a disagreement between
-the translation and the original version of this License or a notice
-or disclaimer, the original version will prevail.
-</p>
-<p>If a section in the Document is Entitled &ldquo;Acknowledgements&rdquo;,
-&ldquo;Dedications&rdquo;, or &ldquo;History&rdquo;, the requirement (section 4) to Preserve
-its Title (section 1) will typically require changing the actual
-title.
-</p>
-</li><li>
-TERMINATION
-
-<p>You may not copy, modify, sublicense, or distribute the Document
-except as expressly provided under this License. Any attempt
-otherwise to copy, modify, sublicense, or distribute it is void, and
-will automatically terminate your rights under this License.
-</p>
-<p>However, if you cease all violation of this License, then your license
-from a particular copyright holder is reinstated (a) provisionally,
-unless and until the copyright holder explicitly and finally
-terminates your license, and (b) permanently, if the copyright holder
-fails to notify you of the violation by some reasonable means prior to
-60 days after the cessation.
-</p>
-<p>Moreover, your license from a particular copyright holder is
-reinstated permanently if the copyright holder notifies you of the
-violation by some reasonable means, this is the first time you have
-received notice of violation of this License (for any work) from that
-copyright holder, and you cure the violation prior to 30 days after
-your receipt of the notice.
-</p>
-<p>Termination of your rights under this section does not terminate the
-licenses of parties who have received copies or rights from you under
-this License. If your rights have been terminated and not permanently
-reinstated, receipt of a copy of some or all of the same material does
-not give you any rights to use it.
-</p>
-</li><li>
-FUTURE REVISIONS OF THIS LICENSE
-
-<p>The Free Software Foundation may publish new, revised versions
-of the GNU Free Documentation License from time to time. Such new
-versions will be similar in spirit to the present version, but may
-differ in detail to address new problems or concerns. See
-<a href="http://www.gnu.org/copyleft/">http://www.gnu.org/copyleft/</a>.
-</p>
-<p>Each version of the License is given a distinguishing version number.
-If the Document specifies that a particular numbered version of this
-License &ldquo;or any later version&rdquo; applies to it, you have the option of
-following the terms and conditions either of that specified version or
-of any later version that has been published (not as a draft) by the
-Free Software Foundation. If the Document does not specify a version
-number of this License, you may choose any version ever published (not
-as a draft) by the Free Software Foundation. If the Document
-specifies that a proxy can decide which future versions of this
-License can be used, that proxy&rsquo;s public statement of acceptance of a
-version permanently authorizes you to choose that version for the
-Document.
-</p>
-</li><li>
-RELICENSING
-
-<p>&ldquo;Massive Multiauthor Collaboration Site&rdquo; (or &ldquo;MMC Site&rdquo;) means any
-World Wide Web server that publishes copyrightable works and also
-provides prominent facilities for anybody to edit those works. A
-public wiki that anybody can edit is an example of such a server. A
-&ldquo;Massive Multiauthor Collaboration&rdquo; (or &ldquo;MMC&rdquo;) contained in the
-site means any set of copyrightable works thus published on the MMC
-site.
-</p>
-<p>&ldquo;CC-BY-SA&rdquo; means the Creative Commons Attribution-Share Alike 3.0
-license published by Creative Commons Corporation, a not-for-profit
-corporation with a principal place of business in San Francisco,
-California, as well as future copyleft versions of that license
-published by that same organization.
-</p>
-<p>&ldquo;Incorporate&rdquo; means to publish or republish a Document, in whole or
-in part, as part of another Document.
-</p>
-<p>An MMC is &ldquo;eligible for relicensing&rdquo; if it is licensed under this
-License, and if all works that were first published under this License
-somewhere other than this MMC, and subsequently incorporated in whole
-or in part into the MMC, (1) had no cover texts or invariant sections,
-and (2) were thus incorporated prior to November 1, 2008.
-</p>
-<p>The operator of an MMC Site may republish an MMC contained in the site
-under CC-BY-SA on the same site at any time before August 1, 2009,
-provided the MMC is eligible for relicensing.
-</p>
-</li></ol>
-
-
-<a name="ADDENDUM_003a-How-to-use-this-License-for-your-documents"></a>
-<h2 class="heading">ADDENDUM: How to use this License for your documents</h2>
-
-<p>To use this License in a document you have written, include a copy of
-the License in the document and put the following copyright and
-license notices just after the title page:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> Copyright (C) <var>year</var> <var>your name</var>.
- Permission is granted to copy, distribute and/or modify this document
- under the terms of the GNU Free Documentation License, Version 1.3
- or any later version published by the Free Software Foundation;
- with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
- Texts. A copy of the license is included in the section entitled ``GNU
- Free Documentation License''.
-</pre></div>
-
-<p>If you have Invariant Sections, Front-Cover Texts and Back-Cover Texts,
-replace the &ldquo;with&hellip;Texts.&rdquo; line with this:
-</p>
-<div class="smallexample">
-<pre class="smallexample"> with the Invariant Sections being <var>list their titles</var>, with
- the Front-Cover Texts being <var>list</var>, and with the Back-Cover Texts
- being <var>list</var>.
-</pre></div>
-
-<p>If you have Invariant Sections without Cover Texts, or some other
-combination of the three, merge those two alternatives to suit the
-situation.
-</p>
-<p>If your document contains nontrivial examples of program code, we
-recommend releasing these examples in parallel under your choice of
-free software license, such as the GNU General Public License,
-to permit their use in free software.
-</p>
-
-
-
-
-<hr>
-<a name="g_t_00cdndice"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#GNU-Free-Documentation-License" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#GNU-Free-Documentation-License" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[<a href="#Acerca-del-Autor" title="Secci&oacute;n siguiente en orden de lectura"> &gt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Acerca-del-Autor" title="Cap&iacute;tulo siguiente"> &gt;&gt; </a>]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Indice"></a>
-<h1 class="unnumbered">&Iacute;ndice</h1>
-
-
-<table><tr><th valign="top">Saltar a: &nbsp; </th><td><a class="summary-letter" href="#Indice_cp_symbol-1"><b>%</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_symbol-2"><b>(</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_symbol-3"><b>*</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_symbol-4"><b>/</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_symbol-5"><b>&lt;</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_symbol-6"><b>&gt;</b></a>
- &nbsp;
-<br>
-<a class="summary-letter" href="#Indice_cp_letter-A"><b>A</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-B"><b>B</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-C"><b>C</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-D"><b>D</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-E"><b>E</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-F"><b>F</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-G"><b>G</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-H"><b>H</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-I"><b>I</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-K"><b>K</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-L"><b>L</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-M"><b>M</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-N"><b>N</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-O"><b>O</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-P"><b>P</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-R"><b>R</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-S"><b>S</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-T"><b>T</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-V"><b>V</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-W"><b>W</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-X"><b>X</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-Y"><b>Y</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-Z"><b>Z</b></a>
- &nbsp;
-</td></tr></table>
-<table class="index-cp" border="0">
-<tr><td></td><th align="left">Entrada de &iacute;ndice</th><td>&nbsp;</td><th align="left"> Secci&oacute;n</th></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_symbol-1">%</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-_0025-_0028funcion-resto_0029"><code>% <span class="roman">(funci&oacute;n resto)</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#Calcular-un-resto">C.2.1 Viaje lateral: Calcula un resto</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_symbol-2">(</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-_0028debug_0029-en-codigo"><code>(debug)</code> en c&oacute;digo</a></td><td>&nbsp;</td><td valign="top"><a href="#debug_002don_002dquit">17.3 <code>debug-on-quit</code> y <code>(debug)</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_symbol-3">*</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-_002a-_0028multiplicacion_0029"><code>* <span class="roman">(multiplicaci&oacute;n)</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#defun">3.1 La forma especial <code>defun</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-_002a-para-buffer-solo-lectura"><code>* <span class="roman">para buffer solo lectura</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#B_00faffer-solo-lectura">Un b&uacute;ffer de solo lectura</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-_002ascratch_002a-buffer">&lsquo;<tt>*scratch*</tt>&rsquo; buffer</a></td><td>&nbsp;</td><td valign="top"><a href="#print_002delements_002dof_002dlist">11.1.2 Un ejemplo: <code>imprimir-elementos-de-la-lista</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_symbol-4">/</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-_002f-_0028division_0029"><code>/ <span class="roman">(division)</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#El-caso-del-buffer-largo">Qu&eacute; ocurre en un b&uacute;ffer largo</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_symbol-5">&lt;</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-_003c_003d-_0028menos-que-igual_0029"><code>&lt;= <span class="roman">(menos que igual)</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#Partes-Inc-de-Ejemplo">Las partes de la definici&oacute;n de funci&oacute;n</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_symbol-6">&gt;</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-_003e-_0028mayor-que_0029"><code>&gt; (mayor que)</code></a></td><td>&nbsp;</td><td valign="top"><a href="#if-en-m_00e1s-detalle"><code>if</code> en m&aacute;s detalle</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-A">A</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Atomos-Lisp">&Aacute;tomos Lisp</a></td><td>&nbsp;</td><td valign="top"><a href="#g_t_00c1tomos-Lisp">1.1.1 &Aacute;tomos Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Acumular_002c-tipo-de-patron-recursivo">Acumular, tipo de patr&oacute;n recursivo</a></td><td>&nbsp;</td><td valign="top"><a href="#Acumular">Patr&oacute;n recursivo: <em>accumulate</em></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-add_002dhook"><code>add-hook</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Texto-y-Autorelleno">16.4 Modo texto y auto relleno</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Alias-de-correo">Alias de correo</a></td><td>&nbsp;</td><td valign="top"><a href="#Alias-de-correo">16.5 Alias de correo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Almacenando-y-cortando-texto">Almacenando y cortando texto</a></td><td>&nbsp;</td><td valign="top"><a href="#Cortando-y-almacenando-texto">8 Cortando y almacenando texto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Ampliando">Ampliando</a></td><td>&nbsp;</td><td valign="top"><a href="#Encogiendo-y-extendiendo">6 Encogiendo y extendiendo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-and"><code>and</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-and-1"><code>and</code></a></td><td>&nbsp;</td><td valign="top"><a href="#fwd_002dpara-let">La expresi&oacute;n <code>let*</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Anillo_002c-creando-un-lista-como-un">Anillo, creando un lista como un</a></td><td>&nbsp;</td><td valign="top"><a href="#Kill-Ring">Appendix B Manejando el anillo de la muerte</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-append_002dto_002dbuffer"><code>append-to-buffer</code></a></td><td>&nbsp;</td><td valign="top"><a href="#append_002dto_002dbuffer">4.4 La definici&oacute;n de <code>append-to-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-apply"><code>apply</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Columnas-de-un-grafo">Imprimiendo las columnas de un grafo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-apropos"><code>apropos</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Columnas-de-un-grafo">Imprimiendo las columnas de un grafo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Argumento-como-variable-local">Argumento como variable local</a></td><td>&nbsp;</td><td valign="top"><a href="#Ejemplo-Dec-junto">Poniendo la definici&oacute;n de la funci&oacute;n junta</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-argumento-definido">&lsquo;<samp>argumento</samp>&rsquo; definido</a></td><td>&nbsp;</td><td valign="top"><a href="#Argumentos">1.8 Argumentos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Argumento_002c-tipo-incorrecto-de">Argumento, tipo incorrecto de</a></td><td>&nbsp;</td><td valign="top"><a href="#Tipo-incorrecto-de-argumento">1.8.4 Usando el tipo incorrecto de objeto como un argumento</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Argumentos">Argumentos</a></td><td>&nbsp;</td><td valign="top"><a href="#Argumentos">1.8 Argumentos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Argumentos-Opcionales">Argumentos Opcionales</a></td><td>&nbsp;</td><td valign="top"><a href="#Argumentos-opcionales">5.3.1 Argumentos opcionales</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Argumentos_002c-numero-variable-de">Argumentos, n&uacute;mero variable de</a></td><td>&nbsp;</td><td valign="top"><a href="#N_00famero-de-variables-de-argumentos">1.8.3 N&uacute;mero de variables de argumentos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Asignando-tecla-globalmente">Asignando tecla globalmente</a></td><td>&nbsp;</td><td valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Asignando-valor-de-variable">Asignando valor de variable</a></td><td>&nbsp;</td><td valign="top"><a href="#set-y-setq">1.9 Configurando el valor de una variable</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Asignar-tecla-global">Asignar tecla global</a></td><td>&nbsp;</td><td valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Asociaciones_002c-teclas_002c-arreglando">Asociaciones, teclas, arreglando</a></td><td>&nbsp;</td><td valign="top"><a href="#Arreglando-Atajos-de-Teclados">Arreglando Atajos de Teclados</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Asterisco-para-buffer-de-solo-lectura">Asterisco para b&uacute;ffer de solo lectura</a></td><td>&nbsp;</td><td valign="top"><a href="#B_00faffer-solo-lectura">Un b&uacute;ffer de solo lectura</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Atajos-de-Teclado_002c-arreglando">Atajos de Teclado, arreglando</a></td><td>&nbsp;</td><td valign="top"><a href="#Arreglando-Atajos-de-Teclados">Arreglando Atajos de Teclados</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-autoload"><code>autoload</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Autocarga">16.10 Autoloading</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Ayuda-escribiendo-listas">Ayuda escribiendo listas</a></td><td>&nbsp;</td><td valign="top"><a href="#Escribiendo-listas">1.1.3 GNU Emacs te ayuda a escribir listas</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-B">B</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-beginning_002dof_002dbuffer"><code>beginning-of-buffer</code></a></td><td>&nbsp;</td><td valign="top"><a href="#beginning_002dof_002dbuffer">5.3 Definici&oacute;n completa de <code>beginning-of-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-bind-se-definio">&lsquo;<samp>bind</samp>&rsquo; se defini&oacute;</a></td><td>&nbsp;</td><td valign="top"><a href="#set-y-setq">1.9 Configurando el valor de una variable</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Borrando-texto">Borrando texto</a></td><td>&nbsp;</td><td valign="top"><a href="#Cortando-y-almacenando-texto">8 Cortando y almacenando texto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Borrando-texto-1">Borrando texto</a></td><td>&nbsp;</td><td valign="top"><a href="#Cortando-y-almacenando-texto">8 Cortando y almacenando texto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Buffer-solo-lectura">B&uacute;ffer solo lectura</a></td><td>&nbsp;</td><td valign="top"><a href="#B_00faffer-solo-lectura">Un b&uacute;ffer de solo lectura</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Busquedas-de-expresiones-regulares">B&uacute;squedas de expresiones regulares</a></td><td>&nbsp;</td><td valign="top"><a href="#Buscar-regexp">12 B&uacute;squedas de expresiones regulares</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Busquedas_002c-ilustrando">B&uacute;squedas, ilustrando</a></td><td>&nbsp;</td><td valign="top"><a href="#Buscar-regexp">12 B&uacute;squedas de expresiones regulares</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Bucles">Bucles</a></td><td>&nbsp;</td><td valign="top"><a href="#while">11.1 <code>while</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Bucles-y-recursion">Bucles y recursi&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Bucles-y-recursi_00f3n">11 Bucles y recursi&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Buffer_002c-historia-de-palabra">Buffer, historia de palabra</a></td><td>&nbsp;</td><td valign="top"><a href="#Nombres-de-b_00faffer">2.1 Nombres de b&uacute;ffer</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-buffer_002dfile_002dname"><code>buffer-file-name</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Nombres-de-b_00faffer">2.1 Nombres de b&uacute;ffer</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-buffer_002dmenu_002c-asociado-a-tecla"><code>buffer-menu, <span class="roman">asociado a tecla</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-buffer_002dname"><code>buffer-name</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Nombres-de-b_00faffer">2.1 Nombres de b&uacute;ffer</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-C">C</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-C_002c-una-disgresion-dentro">C, una disgresi&oacute;n dentro</a></td><td>&nbsp;</td><td valign="top"><a href="#Disgresi_00f3n-dentro-de-C">8.4 Disgresi&oacute;n dentro de C</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-cadena-definida">&lsquo;<samp>cadena</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#g_t_00c1tomos-Lisp">1.1.1 &Aacute;tomos Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-cadena-vacia-definida">&lsquo;<samp>cadena vac&iacute;a</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#Revisar">3.11 Revisar</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Caja-con-cajones_002c-metafora-para-su-simbolo">Caja con cajones, met&aacute;fora para su s&iacute;mbolo</a></td><td>&nbsp;</td><td valign="top"><a href="#S_00edmbolos-como-cajas">9.1 S&iacute;mbolos como una caja con cajones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Cajones_002c-Caja-de_002c-metafora-para-un-simbolo">Cajones, Caja de, met&aacute;fora para un s&iacute;mbolo</a></td><td>&nbsp;</td><td valign="top"><a href="#S_00edmbolos-como-cajas">9.1 S&iacute;mbolos como una caja con cajones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Cambiando-a-un-buffer">Cambiando a un b&uacute;ffer</a></td><td>&nbsp;</td><td valign="top"><a href="#Cambiando-b_00faffers">2.3 Cambiando b&uacute;ffers</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Cambiando-una-definicion-de-funcion">Cambiando una definici&oacute;n de funci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Cambiar-un-defun">3.2.1 Cambiar una definici&oacute;n de funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-cancel_002ddebug_002don_002dentry"><code>cancel-debug-on-entry</code></a></td><td>&nbsp;</td><td valign="top"><a href="#debug_002don_002dentry">17.2 <code>debug-on-entry</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-car_002c-introducido"><code>car, <span class="roman">introducido</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#Car-cdr-y-cons">7 <code>car</code>, <code>cdr</code>, <code>cons</code>: Funciones fundamentales</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Cargando-ficheros">Cargando ficheros</a></td><td>&nbsp;</td><td valign="top"><a href="#Cargando-ficheros">16.9 Cargando ficheros</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Categorias-de-sintaxis-y-tablas">Categor&iacute;as de sintaxis y tablas</a></td><td>&nbsp;</td><td valign="top"><a href="#Sintaxis">14.2 &iquest;Qu&eacute; constituye una palabra o s&iacute;mbolo?</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-cdr_002c-introducido"><code>cdr, <span class="roman">introducido</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#Car-cdr-y-cons">7 <code>car</code>, <code>cdr</code>, <code>cons</code>: Funciones fundamentales</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Codigo-de-instalacion">C&oacute;digo de instalaci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Instalaci_00f3n-Permanente">3.5 Instalar c&oacute;digo permanentemente</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Codigo-Permanente-de-Instalacion">C&oacute;digo Permanente de Instalaci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Instalaci_00f3n-Permanente">3.5 Instalar c&oacute;digo permanentemente</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-comando-definido">&lsquo;<samp>comando</samp>&rsquo; definido</a></td><td>&nbsp;</td><td valign="top"><a href="#C_00f3mo-evaluar">C&oacute;mo evaluar</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Comentarios-en-Codigo-Lisp">Comentarios en C&oacute;digo Lisp</a></td><td>&nbsp;</td><td valign="top"><a href="#Cambiar-un-defun">3.2.1 Cambiar una definici&oacute;n de funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Common-Lisp">Common Lisp</a></td><td>&nbsp;</td><td valign="top"><a href="#Historia-de-Lisp">Historia de Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-compare_002dwindows"><code>compare-windows</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Compilando-Byte">Compilando Byte</a></td><td>&nbsp;</td><td valign="top"><a href="#Compilaci_00f3n-de-bytes">1.5.1 Compilaci&oacute;n de bytes</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-concatenar"><code>concatenar</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Tipos-de-datos">1.8.1 Tipos de argumentos de datos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-cond"><code>cond</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Recursi_00f3n-con-cond">11.3.5 Ejemplo de recursi&oacute;n usando <code>cond</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Condicional-con-if">Condicional con <code>if</code></a></td><td>&nbsp;</td><td valign="top"><a href="#if">3.7 La forma especial <code>if</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Condicional-marcaran-estas-dos-versiones-de-Emacs">Condicional marcar&aacute;n estas dos versiones de Emacs</a></td><td>&nbsp;</td><td valign="top"><a href="#Extensi_00f3n-simple">16.11 Una extensi&oacute;n simple: <code>line-to-top-of-window</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-condition_002dcase"><code>condition-case</code></a></td><td>&nbsp;</td><td valign="top"><a href="#condition_002dcase">8.2.1 <code>condition-case</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Configurando-una-tecla-globalmente">Configurando una tecla globalmente</a></td><td>&nbsp;</td><td valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-cons_002c-introducido"><code>cons, <span class="roman">introducido</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#cons">7.2 <code>cons</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Construyendo-Etiquetas-en-las-fuentes-Emacs">Construyendo Etiquetas en las fuentes Emacs</a></td><td>&nbsp;</td><td valign="top"><a href="#Construyendo-Etiquetas-en-las-fuentes-Emacs">Construyendo Etiquetas en las fuentes Emacs</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Construyendo-robots">Construyendo robots</a></td><td>&nbsp;</td><td valign="top"><a href="#Construyendo-robots">11.3.1 Construyendo robots: Extendiendo la met&aacute;fora</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Contando">Contando</a></td><td>&nbsp;</td><td valign="top"><a href="#Contando">1.9.3 Contando</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Contando-las-palabras-en-un-defun">Contando las palabras en un <code>defun</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Palabras-en-una-funci_00f3n">14 Contando palabras en una <code>defun</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Contando-palabras-en-un-defun">Contando palabras en un <code>defun</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Palabras-en-una-funci_00f3n">14 Contando palabras en una <code>defun</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Contando-palabras-en-un-defun-1">Contando palabras en un <code>defun</code></a></td><td>&nbsp;</td><td valign="top"><a href="#count_002dwords_002din_002ddefun">14.3 La funci&oacute;n <code>count-words-in-defun</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Convencion-formateando">Convenci&oacute;n formateando</a></td><td>&nbsp;</td><td valign="top"><a href="#append-save_002dexcursion">4.4.3 <code>save-excursion</code> en <code>append-to-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Copiando-texto">Copiando texto</a></td><td>&nbsp;</td><td valign="top"><a href="#Cortando-y-almacenando-texto">8 Cortando y almacenando texto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-copy_002dregion_002das_002dkill"><code>copy-region-as-kill</code></a></td><td>&nbsp;</td><td valign="top"><a href="#copy_002dregion_002das_002dkill">8.3 <code>copy-region-as-kill</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-copy_002dto_002dbuffer"><code>copy-to-buffer</code></a></td><td>&nbsp;</td><td valign="top"><a href="#copy_002dto_002dbuffer">5.1 La definici&oacute;n de <code>copy-to-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Cortando-texto">Cortando texto</a></td><td>&nbsp;</td><td valign="top"><a href="#Cortando-y-almacenando-texto">8 Cortando y almacenando texto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Cortando-y-almacenando-texto">Cortando y almacenando texto</a></td><td>&nbsp;</td><td valign="top"><a href="#Cortando-y-almacenando-texto">8 Cortando y almacenando texto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-count_002dwords_002dexample"><code>count-words-example</code></a></td><td>&nbsp;</td><td valign="top"><a href="#count_002dwords_002dexample">13.1 La funci&oacute;n <code>count-words-example</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-count_002dwords_002din_002ddefun"><code>count-words-in-defun</code></a></td><td>&nbsp;</td><td valign="top"><a href="#count_002dwords_002din_002ddefun">14.3 La funci&oacute;n <code>count-words-in-defun</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-crear-etiquetas"><code>crear etiquetas</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Construyendo-Etiquetas-en-las-fuentes-Emacs">Construyendo Etiquetas en las fuentes Emacs</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Cuenta-palabras-recursivamente">Cuenta palabras recursivamente</a></td><td>&nbsp;</td><td valign="top"><a href="#recursive_002dcount_002dwords">13.2 Cuenta palabras recursivamente</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Cuerpo-de-grafo">Cuerpo de grafo</a></td><td>&nbsp;</td><td valign="top"><a href="#Leyendo-un-grafo">15 Leyendo un grafo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-cuerpo-definido">&lsquo;<samp>cuerpo</samp>&rsquo; definido</a></td><td>&nbsp;</td><td valign="top"><a href="#defun">3.1 La forma especial <code>defun</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-current_002dbuffer"><code>current-buffer</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Obteniendo-b_00faffers">2.2 Obteniendo b&uacute;ffers</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-current_002dkill"><code>current-kill</code></a></td><td>&nbsp;</td><td valign="top"><a href="#current_002dkill">B.1 La funci&oacute;n <code>current-kill</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-D">D</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-debug_002don_002dentry"><code>debug-on-entry</code></a></td><td>&nbsp;</td><td valign="top"><a href="#debug_002don_002dentry">17.2 <code>debug-on-entry</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-debug_002don_002dquit"><code>debug-on-quit</code></a></td><td>&nbsp;</td><td valign="top"><a href="#debug_002don_002dquit">17.3 <code>debug-on-quit</code> y <code>(debug)</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-defconst"><code>defconst</code></a></td><td>&nbsp;</td><td valign="top"><a href="#defcustom">16.2 Especificar variables usando <code>defcustom</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-defcustom"><code>defcustom</code></a></td><td>&nbsp;</td><td valign="top"><a href="#defcustom">16.2 Especificar variables usando <code>defcustom</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Definicion-de-Funcion_002c-como-cambiar">Definici&oacute;n de Funci&oacute;n, como cambiar</a></td><td>&nbsp;</td><td valign="top"><a href="#Cambiar-un-defun">3.2.1 Cambiar una definici&oacute;n de funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Definicion-de-la-instalacion">Definici&oacute;n de la instalaci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Instalar">3.2 Instalar una definici&oacute;n de funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Definicion-de-la-Instalacion-de-Funcion">Definici&oacute;n de la Instalaci&oacute;n de Funci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Instalar">3.2 Instalar una definici&oacute;n de funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-definicion-de-punto">definici&oacute;n de &lsquo;<samp>punto</samp>&rsquo;</a></td><td>&nbsp;</td><td valign="top"><a href="#Tama_00f1o-de-b_00faffer-y-localizaciones">2.4 Tama&ntilde;o de b&uacute;ffer y la ubicaci&oacute;n del punto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-definicion-funcion-definida">&lsquo;<samp>definici&oacute;n funci&oacute;n</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#defun">3.1 La forma especial <code>defun</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Definicion_002c-como-cambiar">Definici&oacute;n, c&oacute;mo cambiar</a></td><td>&nbsp;</td><td valign="top"><a href="#Cambiar-un-defun">3.2.1 Cambiar una definici&oacute;n de funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-defsubst"><code>defsubst</code></a></td><td>&nbsp;</td><td valign="top"><a href="#defcustom">16.2 Especificar variables usando <code>defcustom</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-defun"><code>defun</code></a></td><td>&nbsp;</td><td valign="top"><a href="#defun">3.1 La forma especial <code>defun</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-defvar"><code>defvar</code></a></td><td>&nbsp;</td><td valign="top"><a href="#defvar">8.5 Inicializando una variable con <code>defvar</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-defvar-con-un-asterisco"><code>defvar <span class="roman">con un asterisco</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#defvar-y-asterisk">8.5.1 <code>defvar</code> y un asterisco</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-defvar-para-una-variable-personalizable"><code>defvar <span class="roman">para una variable personalizable</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#defvar-y-asterisk">8.5.1 <code>defvar</code> y un asterisco</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-delete_002dand_002dextract_002dregion"><code>delete-and-extract-region</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Disgresi_00f3n-dentro-de-C">8.4 Disgresi&oacute;n dentro de C</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Depurador-de-nivel-de-codigo">Depurador de nivel de c&oacute;digo</a></td><td>&nbsp;</td><td valign="top"><a href="#edebug">17.4 El depurador de nivel de fuentes <code>edebug</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-depurando">depurando</a></td><td>&nbsp;</td><td valign="top"><a href="#Depurando">17 Depurando</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-depurar"><code>depurar</code></a></td><td>&nbsp;</td><td valign="top"><a href="#depurar">17.1 <code>depurar</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Desasociar-Tecla-a-Comando">Desasociar Tecla a Comando</a></td><td>&nbsp;</td><td valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-describe_002dfunction"><code>describe-function</code></a></td><td>&nbsp;</td><td valign="top"><a href="#simplified_002dbeginning_002dof_002dbuffer">4.2 Una definici&oacute;n simplificada de <code>beginning-of-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-describe_002dfunction_002c-introducido"><code>describe-function, <span class="roman">introducido</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#Encontrando-m_00e1s">4.1 Encontrando m&aacute;s informaci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Diferir-en-recursion">Diferir en recursi&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Sin-Aplazar">11.3.7 Recursi&oacute;n sin diferir</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-directory_002dfiles"><code>directory-files</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Listar-ficheros">14.9.2 Creando una lista de ficheros</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Disgresion-dentro-de-C">Disgresi&oacute;n dentro de C</a></td><td>&nbsp;</td><td valign="top"><a href="#Disgresi_00f3n-dentro-de-C">8.4 Disgresi&oacute;n dentro de C</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Disociando-la-tecla">Disociando la tecla</a></td><td>&nbsp;</td><td valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Division">Divisi&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#El-caso-del-buffer-largo">Qu&eacute; ocurre en un b&uacute;ffer largo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-dolist"><code>dolist</code></a></td><td>&nbsp;</td><td valign="top"><a href="#dolist">La macro <code>dolist</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-dotimes"><code>dotimes</code></a></td><td>&nbsp;</td><td valign="top"><a href="#dotimes">La macro <code>dotimes</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-E">E</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-edebug"><code>edebug</code></a></td><td>&nbsp;</td><td valign="top"><a href="#edebug">17.4 El depurador de nivel de fuentes <code>edebug</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-efecto-lateral-definido">&lsquo;<samp>efecto lateral</samp>&rsquo; definido</a></td><td>&nbsp;</td><td valign="top"><a href="#C_00f3mo-el-int_00e9rprete-act_00faa">C&oacute;mo el int&eacute;rprete act&uacute;a</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Ejecuta-un-programa">Ejecuta un programa</a></td><td>&nbsp;</td><td valign="top"><a href="#Ejecutar-un-programa">1.2 Ejecutar un programa</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Ejemplo-de-Expresion-let">Ejemplo de Expresi&oacute;n <code>let</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Ejemplo-de-expresi_00f3n-let">3.6.2 Ejemplo de Expresi&oacute;n <code>let</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Ejes_002c-imprime-horizontal">Ejes, imprime horizontal</a></td><td>&nbsp;</td><td valign="top"><a href="#print_002dX_002daxis">C.3 La funci&oacute;n <code>print-X-axis</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Ejes_002c-imprimir-vertical">Ejes, imprimir vertical</a></td><td>&nbsp;</td><td valign="top"><a href="#print_002dY_002daxis">C.2 La funci&oacute;n <code>print-Y-axis</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Else">Else</a></td><td>&nbsp;</td><td valign="top"><a href="#else">3.8 Expresiones if&ndash;then&ndash;else</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Encogiendo">Encogiendo</a></td><td>&nbsp;</td><td valign="top"><a href="#Encogiendo-y-extendiendo">6 Encogiendo y extendiendo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Encontrar-documentacion-de-la-funcion">Encontrar documentaci&oacute;n de la funci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Encontrando-m_00e1s">4.1 Encontrando m&aacute;s informaci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Encontrar-la-fuente-de-la-funcion">Encontrar la fuente de la funci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Encontrando-m_00e1s">4.1 Encontrando m&aacute;s informaci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Encontrar-un-fichero">Encontrar un fichero</a></td><td>&nbsp;</td><td valign="top"><a href="#Encontrar-un-fichero">14.5 Encontrar un fichero</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-eobp"><code>eobp</code></a></td><td>&nbsp;</td><td valign="top"><a href="#fwd_002dpara-while">El bucle <code>while</code> hacia adelante</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-eq"><code>eq</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Revisar">3.11 Revisar</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-eq-_0028ejemplo-de-uso_0029"><code>eq <span class="roman">(ejemplo de uso)</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#last_002dcommand-_0026-this_002dcommand"><code>last-command</code> y <code>this-command</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-equal"><code>equal</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Revisar">3.11 Revisar</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-error"><code>error</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Cuerpo-de-current_002dkill">El cuerpo de <code>current-kill</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Error-para-simbolo-sin-funcion">Error para s&iacute;mbolo sin funci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Funci_00f3n-vac_00eda">1.7.1 Mensaje de error de un s&iacute;mbolo sin una funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Error-para-simbolo-sin-valor">Error para s&iacute;mbolo sin valor</a></td><td>&nbsp;</td><td valign="top"><a href="#Variable-vac_00eda">1.7.2 Mensaje de error de un s&iacute;mbolo sin un valor</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Error_002c-del-tipo-mas-insidioso">Error, del tipo m&aacute;s insidioso</a></td><td>&nbsp;</td><td valign="top"><a href="#Otro-Error">C.4.5 Otro error &hellip; m&aacute;s insidioso</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Escribiendo-la-Definicion">Escribiendo la Definici&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Escribiendo-funciones">3 C&oacute;mo escribir definiciones de funciones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Escribiendo-la-Definicion-de-Funcion">Escribiendo la Definici&oacute;n de Funci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Escribiendo-funciones">3 C&oacute;mo escribir definiciones de funciones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Escribiendo-una-definicion-funcion">Escribiendo una definici&oacute;n funci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Escribiendo-funciones">3 C&oacute;mo escribir definiciones de funciones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Espacio-en-blanco-en-listas">Espacio en blanco en listas</a></td><td>&nbsp;</td><td valign="top"><a href="#Espacios-en-blanco-en-listas">1.1.2 Espacios en blanco en listas</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-etags"><code>etags</code></a></td><td>&nbsp;</td><td valign="top"><a href="#etags">12.5 Crea tu propio fichero &lsquo;<tt>TAGS</tt>&rsquo;</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Etiquetas-en-las-fuentes-Emacs">Etiquetas en las fuentes Emacs</a></td><td>&nbsp;</td><td valign="top"><a href="#Construyendo-Etiquetas-en-las-fuentes-Emacs">Construyendo Etiquetas en las fuentes Emacs</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Evaluacion">Evaluaci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Evaluaci_00f3n">1.6 Evaluaci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Evaluacion-de-listas-internas">Evaluaci&oacute;n de listas internas</a></td><td>&nbsp;</td><td valign="top"><a href="#Evaluando-listas-propias">1.6.1 Evaluando listas propias</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Evaluacion-practica">Evaluaci&oacute;n pr&aacute;ctica</a></td><td>&nbsp;</td><td valign="top"><a href="#Practicando-evaluaci_00f3n">2 Practicando evaluaci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Evaluando-listas-internas">Evaluando listas internas</a></td><td>&nbsp;</td><td valign="top"><a href="#Evaluando-listas-propias">1.6.1 Evaluando listas propias</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Every_002c-tipo-de-patron-recursivo">Every, tipo de patr&oacute;n recursivo</a></td><td>&nbsp;</td><td valign="top"><a href="#Cada">Patr&oacute;n recursivo: <em>every</em></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-expresion-definida">&lsquo;<samp>expresi&oacute;n</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#g_t_00c1tomos-Lisp">1.1.1 &Aacute;tomos Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-expresion-let_002c-partes-de">expresi&oacute;n <code>let</code>, partes de</a></td><td>&nbsp;</td><td valign="top"><a href="#Partes-de-la-expresi_00f3n-let">3.6.1 Las partes de una expresi&oacute;n <code>let</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-expresion-simple-let">expresi&oacute;n simple <code>let</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Ejemplo-de-expresi_00f3n-let">3.6.2 Ejemplo de Expresi&oacute;n <code>let</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Expresiones-regulares-para-contar-palabras">Expresiones regulares para contar palabras</a></td><td>&nbsp;</td><td valign="top"><a href="#Contando-palabras">13 Contando: repetici&oacute;n y regexps</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Expresiones-simbolicas_002c-introducidas">Expresiones simb&oacute;licas, introducidas</a></td><td>&nbsp;</td><td valign="top"><a href="#g_t_00c1tomos-Lisp">1.1.1 &Aacute;tomos Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Extendiendo_002c-ejemplo-de">Extendiendo, ejemplo de</a></td><td>&nbsp;</td><td valign="top"><a href="#what_002dline">6.2 <code>what-line</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Extension-simple-en-fichero-_002eemacs">Extensi&oacute;n simple en fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td><td>&nbsp;</td><td valign="top"><a href="#Extensi_00f3n-simple">16.11 Una extensi&oacute;n simple: <code>line-to-top-of-window</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-F">F</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Falsedad-y-verdad-en-Emacs-Lisp">Falsedad y verdad en Emacs Lisp</a></td><td>&nbsp;</td><td valign="top"><a href="#Verdad-y-falsedad">3.9 Verdad y falsedad en Emacs Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-FDL_002c-GNU-Free-Documentation-License">FDL, GNU Free Documentation License</a></td><td>&nbsp;</td><td valign="top"><a href="#GNU-Free-Documentation-License">Appendix E GNU Free Documentation License</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-fichero-_002eemacs">fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td><td>&nbsp;</td><td valign="top"><a href="#Inicializaci_00f3n-de-Emacs">16 Tu fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-fichero-_002eemacs_002c-empezando">fichero &lsquo;<tt>.emacs</tt>&rsquo;, empezando</a></td><td>&nbsp;</td><td valign="top"><a href="#Empezando-un-fichero-_002eemacs">16.3 Empieza por un fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-fichero-de-inicio-default_002eel">fichero de inicio &lsquo;<tt>default.el</tt>&rsquo;</a></td><td>&nbsp;</td><td valign="top"><a href="#Site_002dwide-Init">16.1 Fichero de inicializaci&oacute;n site-wide</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-fichero-de-TAGS_002c-crea-el-propio">fichero de &lsquo;<tt>TAGS</tt>&rsquo;, crea el propio</a></td><td>&nbsp;</td><td valign="top"><a href="#etags">12.5 Crea tu propio fichero &lsquo;<tt>TAGS</tt>&rsquo;</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Fichero-inicializacion">Fichero inicializaci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Inicializaci_00f3n-de-Emacs">16 Tu fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-fichero-inicio-site_002dinit_002eel">fichero inicio &lsquo;<tt>site-init.el</tt>&rsquo;</a></td><td>&nbsp;</td><td valign="top"><a href="#Site_002dwide-Init">16.1 Fichero de inicializaci&oacute;n site-wide</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-fichero-ring_002eel">fichero &lsquo;<tt>ring.el</tt>&rsquo;</a></td><td>&nbsp;</td><td valign="top"><a href="#fichero-anillo">B.4 El fichero &lsquo;<tt>ring.el</tt>&rsquo;</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-fichero-site_002dload_002eel">fichero &lsquo;<tt>site-load.el</tt>&rsquo;</a></td><td>&nbsp;</td><td valign="top"><a href="#Site_002dwide-Init">16.1 Fichero de inicializaci&oacute;n site-wide</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-files_002din_002dbelow_002ddirectory"><code>files-in-below-directory</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Listar-ficheros">14.9.2 Creando una lista de ficheros</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-fill_002dcolumn_002c-una-variable-de-ejemplo"><code>fill-column, <span class="roman">una variable de ejemplo</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#Ejemplo-de-rellenar-columna"><code>fill-column</code>, un ejemplo de variable</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-filter_002dbuffer_002dsubstring"><code>filter-buffer-substring</code></a></td><td>&nbsp;</td><td valign="top"><a href="#last_002dcommand-_0026-this_002dcommand"><code>last-command</code> y <code>this-command</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-find_002dtag"><code>find-tag</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Encontrando-m_00e1s">4.1 Encontrando m&aacute;s informaci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Flores-en-un-campo">Flores en un campo</a></td><td>&nbsp;</td><td valign="top"><a href="#Listas-Lisp">1.1 Listas Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Focalizando-atencion-_0028encogiendo_0029">Focalizando atenci&oacute;n (encogiendo)</a></td><td>&nbsp;</td><td valign="top"><a href="#Encogiendo-y-extendiendo">6 Encogiendo y extendiendo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-forma-definida">&lsquo;<samp>forma</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#g_t_00c1tomos-Lisp">1.1.1 &Aacute;tomos Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Forma-Especial">Forma Especial</a></td><td>&nbsp;</td><td valign="top"><a href="#Complicaciones">Complicaciones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Forma-Especial-de-defun">Forma Especial de <code>defun</code></a></td><td>&nbsp;</td><td valign="top"><a href="#defun">3.1 La forma especial <code>defun</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Formateando-ayuda">Formateando ayuda</a></td><td>&nbsp;</td><td valign="top"><a href="#Escribiendo-listas">1.1.3 GNU Emacs te ayuda a escribir listas</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Formato-de-Modo-Linea">Formato de Modo L&iacute;nea</a></td><td>&nbsp;</td><td valign="top"><a href="#Mode-Line">16.14 Una l&iacute;nea modificada</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-forward_002dparagraph"><code>forward-paragraph</code></a></td><td>&nbsp;</td><td valign="top"><a href="#forward_002dparagraph">12.4 <code>forward-paragraph</code>: una mina de oro de funciones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-forward_002dsentence"><code>forward-sentence</code></a></td><td>&nbsp;</td><td valign="top"><a href="#forward_002dsentence">12.3 <code>forward-sentence</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Frases_002c-movimiento-por">Frases, movimiento por</a></td><td>&nbsp;</td><td valign="top"><a href="#Buscar-regexp">12 B&uacute;squedas de expresiones regulares</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Funcion-Anonima">Funci&oacute;n An&oacute;nima</a></td><td>&nbsp;</td><td valign="top"><a href="#lambda">C.4.3 Una expresi&oacute;n <code>lambda</code>: Anonimicidad &uacute;til</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Funcion-de-palabras-duplicadas">Funci&oacute;n de palabras duplicadas</a></td><td>&nbsp;</td><td valign="top"><a href="#the_002dthe">Appendix A La funci&oacute;n <code>the-the</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-funcion-definida">&lsquo;<samp>funci&oacute;n</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#Creando-errores">1.3 Generar un mensaje de error</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-funcion-definida-1">&lsquo;<samp>funci&oacute;n</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#Creando-errores">1.3 Generar un mensaje de error</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-funcion-interactiva-definida">&lsquo;<samp>funci&oacute;n interactiva</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#C_00f3mo-evaluar">C&oacute;mo evaluar</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Funcion-resto_002c-_0025">Funci&oacute;n resto, <code>%</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Calcular-un-resto">C.2.1 Viaje lateral: Calcula un resto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Funciones-Interactivas">Funciones Interactivas</a></td><td>&nbsp;</td><td valign="top"><a href="#Interactive">3.3 Crear una funci&oacute;n interactive</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Funciones-primitivas">Funciones primitivas</a></td><td>&nbsp;</td><td valign="top"><a href="#Funciones-primitivas">Una v&iacute;a acerca de funciones primitivas</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Funciones_002c-primitiva">Funciones, primitiva</a></td><td>&nbsp;</td><td valign="top"><a href="#Funciones-primitivas">Una v&iacute;a acerca de funciones primitivas</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-G">G</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Genera-un-mensaje-de-error">Genera un mensaje de error</a></td><td>&nbsp;</td><td valign="top"><a href="#Creando-errores">1.3 Generar un mensaje de error</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Generacion-de-mensaje-de-Error">Generaci&oacute;n de mensaje de Error</a></td><td>&nbsp;</td><td valign="top"><a href="#Creando-errores">1.3 Generar un mensaje de error</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-global_002dset_002dkey"><code>global-set-key</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-global_002dunset_002dkey"><code>global-unset-key</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Grafo-prototipo">Grafo prototipo</a></td><td>&nbsp;</td><td valign="top"><a href="#Leyendo-un-grafo">15 Leyendo un grafo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Grafo_002c-imprimiendo-todo">Grafo, imprimiendo todo</a></td><td>&nbsp;</td><td valign="top"><a href="#Imprimir-Grafo-Entero">C.4 Imprimiendo el grafo completo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-graph_002dbody_002dprint"><code>graph-body-print</code></a></td><td>&nbsp;</td><td valign="top"><a href="#graph_002dbody_002dprint">15.1 La funci&oacute;n <code>graph-body-print</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-graph_002dbody_002dprint-Version-Final_002e"><code>graph-body-print <span class="roman">Versi&oacute;n Final.</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#La-versi_00f3n-final">Cambios para la versi&oacute;n final</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-H">H</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Historia-de-Lisp">Historia de Lisp</a></td><td>&nbsp;</td><td valign="top"><a href="#Historia-de-Lisp">Historia de Lisp</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-I">I</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-if"><code>if</code></a></td><td>&nbsp;</td><td valign="top"><a href="#if">3.7 La forma especial <code>if</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Imprime-eje-horizontal">Imprime eje horizontal</a></td><td>&nbsp;</td><td valign="top"><a href="#print_002dX_002daxis">C.3 La funci&oacute;n <code>print-X-axis</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Imprimiendo-eje-horizontal">Imprimiendo eje horizontal</a></td><td>&nbsp;</td><td valign="top"><a href="#print_002dX_002daxis">C.3 La funci&oacute;n <code>print-X-axis</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-imprimiendo-eje-X">imprimiendo eje X</a></td><td>&nbsp;</td><td valign="top"><a href="#print_002dX_002daxis">C.3 La funci&oacute;n <code>print-X-axis</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-imprimiendo-eje-Y">imprimiendo eje Y</a></td><td>&nbsp;</td><td valign="top"><a href="#print_002dY_002daxis">C.2 La funci&oacute;n <code>print-Y-axis</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Imprimiendo-Ejes-Verticales">Imprimiendo Ejes Verticales</a></td><td>&nbsp;</td><td valign="top"><a href="#print_002dY_002daxis">C.2 La funci&oacute;n <code>print-Y-axis</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Imprimiendo-el-grafo-entero">Imprimiendo el grafo entero</a></td><td>&nbsp;</td><td valign="top"><a href="#Imprimir-Grafo-Entero">C.4 Imprimiendo el grafo completo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Imprimiendo-el-grafo-entero-1">Imprimiendo el grafo entero</a></td><td>&nbsp;</td><td valign="top"><a href="#Imprimir-Grafo-Entero">C.4 Imprimiendo el grafo completo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Imprimir-eje-vertical">Imprimir eje vertical</a></td><td>&nbsp;</td><td valign="top"><a href="#print_002dY_002daxis">C.2 La funci&oacute;n <code>print-Y-axis</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-indent_002dtabs_002dmode"><code>indent-tabs-mode</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Indentar-modo-de-tabulaciones">16.6 Indentar modo de tabulaciones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Indentacin-para-formatear">Indentaci&#324; para formatear</a></td><td>&nbsp;</td><td valign="top"><a href="#append-save_002dexcursion">4.4.3 <code>save-excursion</code> en <code>append-to-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Inicializacion-de-Variable">Inicializaci&oacute;n de Variable</a></td><td>&nbsp;</td><td valign="top"><a href="#defvar">8.5 Inicializando una variable con <code>defvar</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Inicializando-una-variable">Inicializando una variable</a></td><td>&nbsp;</td><td valign="top"><a href="#defvar">8.5 Inicializando una variable con <code>defvar</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-insert_002dbuffer"><code>insert-buffer</code></a></td><td>&nbsp;</td><td valign="top"><a href="#insert_002dbuffer">5.2 La definici&oacute;n de <code>insert-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-insert_002dbuffer_002c-nueva-version-del-cuerpo"><code>insert-buffer, nueva versi&oacute;n del cuerpo</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Nuevo-insert_002dbuffer">5.2.6 Nuevo cuerpo para <code>insert-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-insert_002dbuffer_002dsubstring"><code>insert-buffer-substring</code></a></td><td>&nbsp;</td><td valign="top"><a href="#resumen-de-append_002dto_002dbuffer">Un resumen de <code>append-to-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Insidioso-tipo-de-error">Insidioso tipo de error</a></td><td>&nbsp;</td><td valign="top"><a href="#Otro-Error">C.4.5 Otro error &hellip; m&aacute;s insidioso</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Instalar-codigo-permanentemente">Instalar c&oacute;digo permanentemente</a></td><td>&nbsp;</td><td valign="top"><a href="#Instalaci_00f3n-Permanente">3.5 Instalar c&oacute;digo permanentemente</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Instalar-una-definicion-de-funcion">Instalar una definici&oacute;n de funci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Instalar">3.2 Instalar una definici&oacute;n de funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Interprete-Lisp_002c-explicada">Int&eacute;rprete Lisp, explicada</a></td><td>&nbsp;</td><td valign="top"><a href="#Ejecutar-un-programa">1.2 Ejecutar un programa</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Interprete-Lisp_002c-que-hace">Int&eacute;rprete Lisp, qu&eacute; hace</a></td><td>&nbsp;</td><td valign="top"><a href="#Interpr_00e9te-Lisp">1.5 El int&eacute;rprete Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Interprete_002c-Lisp_002c-explicado">Int&eacute;rprete, Lisp, explicado</a></td><td>&nbsp;</td><td valign="top"><a href="#Ejecutar-un-programa">1.2 Ejecutar un programa</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Interprete_002c-que-hace">Int&eacute;rprete, qu&eacute; hace</a></td><td>&nbsp;</td><td valign="top"><a href="#Interpr_00e9te-Lisp">1.5 El int&eacute;rprete Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-interactive"><code>interactive</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Interactive">3.3 Crear una funci&oacute;n interactive</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-interactive_002c-ejemplo-de-uso"><code>interactive, <span class="roman">ejemplo de uso</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#insert_002dbuffer-interactivo">5.2.1 La expresi&oacute;n interactiva en <code>insert-buffer</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-K">K</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Keep_002c-el-tipo-de-patron-recursivo">Keep, el tipo de patr&oacute;n recursivo</a></td><td>&nbsp;</td><td valign="top"><a href="#Guardar">Patr&oacute;n recursivo: <em>keep</em></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-kill_002dappend"><code>kill-append</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Funci_00f3n-kill_002dappend">La funci&oacute;n <code>kill-append</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-kill_002dnew"><code>kill-new</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-kill_002dregion"><code>kill-region</code></a></td><td>&nbsp;</td><td valign="top"><a href="#kill_002dregion">8.2 <code>kill-region</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-L">L</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-lambda"><code>lambda</code></a></td><td>&nbsp;</td><td valign="top"><a href="#lambda">C.4.3 Una expresi&oacute;n <code>lambda</code>: Anonimicidad &uacute;til</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-length"><code>length</code></a></td><td>&nbsp;</td><td valign="top"><a href="#length">7.2.1 Encuentra el tama&ntilde;o de una lista: <code>length</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-lengths_002dlist_002dfile"><code>lengths-list-file</code></a></td><td>&nbsp;</td><td valign="top"><a href="#lengths_002dlist_002dfile">14.6 <code>lengths-list-file</code> en detalle</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-lengths_002dlist_002dmany_002dfiles"><code>lengths-list-many-files</code></a></td><td>&nbsp;</td><td valign="top"><a href="#lengths_002dlist_002dmany_002dfiles">Determina las longitudes de <code>defuns</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-let"><code>let</code></a></td><td>&nbsp;</td><td valign="top"><a href="#let">3.6 <code>let</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Leyendo-un-grafo">Leyendo un grafo</a></td><td>&nbsp;</td><td valign="top"><a href="#Leyendo-un-grafo">15 Leyendo un grafo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Libreria_002c-como-termino-para-_0060fichero_0027">Librer&iacute;a, como t&eacute;rmino para &lsquo;fichero&rsquo;</a></td><td>&nbsp;</td><td valign="top"><a href="#Encontrando-m_00e1s">4.1 Encontrando m&aacute;s informaci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-line_002dto_002dtop_002dof_002dwindow"><code>line-to-top-of-window</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Extensi_00f3n-simple">16.11 Una extensi&oacute;n simple: <code>line-to-top-of-window</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-list_002dbuffers_002c-reasociar"><code>list-buffers, <span class="roman">reasociar</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-lista-de-argumentos-definida">&lsquo;<samp>lista de argumentos</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#defun">3.1 La forma especial <code>defun</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Lista-de-variables-locales_002c-por-buffer_002c">Lista de variables locales, por b&uacute;ffer,</a></td><td>&nbsp;</td><td valign="top"><a href="#Texto-y-Autorelleno">16.4 Modo texto y auto relleno</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-lista-vacia-definida">&lsquo;<samp>lista vac&iacute;a</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#g_t_00c1tomos-Lisp">1.1.1 &Aacute;tomos Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Listas-en-un-ordenador">Listas en un ordenador</a></td><td>&nbsp;</td><td valign="top"><a href="#Implementaci_00f3n-de-listas">9 C&oacute;mo las listas se implementan</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Listas-Lisp">Listas Lisp</a></td><td>&nbsp;</td><td valign="top"><a href="#Listas-Lisp">1.1 Listas Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-llamada-definida">&lsquo;<samp>llamada</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#Cambiando-b_00faffers">2.3 Cambiando b&uacute;ffers</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-load_002dlibrary"><code>load-library</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Cargando-ficheros">16.9 Cargando ficheros</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-load_002dpath"><code>load-path</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Cargando-ficheros">16.9 Cargando ficheros</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Localizacion-del-Punto">Localizaci&oacute;n del Punto</a></td><td>&nbsp;</td><td valign="top"><a href="#Tama_00f1o-de-b_00faffer-y-localizaciones">2.4 Tama&ntilde;o de b&uacute;ffer y la ubicaci&oacute;n del punto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Localizacion-del-punto">Localizaci&oacute;n del punto</a></td><td>&nbsp;</td><td valign="top"><a href="#Tama_00f1o-de-b_00faffer-y-localizaciones">2.4 Tama&ntilde;o de b&uacute;ffer y la ubicaci&oacute;n del punto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-looking_002dat"><code>looking-at</code></a></td><td>&nbsp;</td><td valign="top"><a href="#fwd_002dpara-while">El bucle <code>while</code> hacia adelante</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-M">M</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Maclisp">Maclisp</a></td><td>&nbsp;</td><td valign="top"><a href="#Historia-de-Lisp">Historia de Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Macro-Lisp">Macro Lisp</a></td><td>&nbsp;</td><td valign="top"><a href="#Macro-Lisp">8.2.2 Macro Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Macro_002c-lisp">Macro, lisp</a></td><td>&nbsp;</td><td valign="top"><a href="#Macro-Lisp">8.2.2 Macro Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-make_002dstring"><code>make-string</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Elemento-del-Eje-Y">C.2.2 Construye un elemento del eje Y</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Manejando-el-anillo-de-la-muerte">Manejando el anillo de la muerte</a></td><td>&nbsp;</td><td valign="top"><a href="#Kill-Ring">Appendix B Manejando el anillo de la muerte</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Manejando-el-anillo-de-la-muerte-1">Manejando el anillo de la muerte</a></td><td>&nbsp;</td><td valign="top"><a href="#Kill-Ring">Appendix B Manejando el anillo de la muerte</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Mapas-de-teclado">Mapas de teclado</a></td><td>&nbsp;</td><td valign="top"><a href="#Mapas-de-teclado">16.8 Mapas de teclado</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-mapcar"><code>mapcar</code></a></td><td>&nbsp;</td><td valign="top"><a href="#mapcar">C.4.4 La funci&oacute;n <code>mapcar</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-marca"><code>marca</code></a></td><td>&nbsp;</td><td valign="top"><a href="#save_002dexcursion">3.10 <code>save-excursion</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-mark_002dwhole_002dbuffer"><code>mark-whole-buffer</code></a></td><td>&nbsp;</td><td valign="top"><a href="#mark_002dwhole_002dbuffer">4.3 La definici&oacute;n de <code>mark-whole-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-match_002dbeginning"><code>match-beginning</code></a></td><td>&nbsp;</td><td valign="top"><a href="#fwd_002dpara-while">El bucle <code>while</code> hacia adelante</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-max"><code>max</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Columnas-de-un-grafo">Imprimiendo las columnas de un grafo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-message"><code>message</code></a></td><td>&nbsp;</td><td valign="top"><a href="#message">1.8.5 La funci&oacute;n <code>message</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-min"><code>min</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Columnas-de-un-grafo">Imprimiendo las columnas de un grafo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-mode_002dline_002dformat"><code>mode-line-format</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Mode-Line">16.14 Una l&iacute;nea modificada</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Modo-de-autoajuste-activado">Modo de autoajuste activado</a></td><td>&nbsp;</td><td valign="top"><a href="#Texto-y-Autorelleno">16.4 Modo texto y auto relleno</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Modo-de-seleccion_002c-automatico">Modo de selecci&oacute;n, autom&aacute;tico</a></td><td>&nbsp;</td><td valign="top"><a href="#Texto-y-Autorelleno">16.4 Modo texto y auto relleno</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Modo-Texto-activado">Modo Texto activado</a></td><td>&nbsp;</td><td valign="top"><a href="#Texto-y-Autorelleno">16.4 Modo texto y auto relleno</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Mover-frase-y-parrafo">Mover frase y p&aacute;rrafo</a></td><td>&nbsp;</td><td valign="top"><a href="#Buscar-regexp">12 B&uacute;squedas de expresiones regulares</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-N">N</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-narrowing-definido">&lsquo;<samp>narrowing</samp>&rsquo; definido</a></td><td>&nbsp;</td><td valign="top"><a href="#Tama_00f1o-de-b_00faffer-y-localizaciones">2.4 Tama&ntilde;o de b&uacute;ffer y la ubicaci&oacute;n del punto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-nil"><code>nil</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Verdad-y-falsedad">3.9 Verdad y falsedad en Emacs Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-nil_002c-historia-de-palabra"><code>nil</code>, historia de palabra</a></td><td>&nbsp;</td><td valign="top"><a href="#Nombres-de-b_00faffer">2.1 Nombres de b&uacute;ffer</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-No-aplazar-la-solucion">No aplazar la soluci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#No-aplazar-la-soluci_00f3n">11.3.8 No hay soluci&oacute;n pospuesta</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Nombres-de-Simbolos">Nombres de S&iacute;mbolos</a></td><td>&nbsp;</td><td valign="top"><a href="#Nombres-y-definiciones">1.4 Nombres de s&iacute;mbolos y definiciones de funciones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-nreverse"><code>nreverse</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Contando-definiciones-de-funci_00f3n">14.9.3 Contando definiciones de funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-nth"><code>nth</code></a></td><td>&nbsp;</td><td valign="top"><a href="#nth">7.4 <code>nth</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-nthcdr"><code>nthcdr</code></a></td><td>&nbsp;</td><td valign="top"><a href="#nthcdr">7.3 <code>nthcdr</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-nthcdr-1"><code>nthcdr</code></a></td><td>&nbsp;</td><td valign="top"><a href="#copy_002dregion_002das_002dkill">8.3 <code>copy-region-as-kill</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-nthcdr_002c-ejemplo"><code>nthcdr, <span class="roman">ejemplo</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Numero-variable-de-argumentos">N&uacute;mero variable de argumentos</a></td><td>&nbsp;</td><td valign="top"><a href="#N_00famero-de-variables-de-argumentos">1.8.3 N&uacute;mero de variables de argumentos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-nueva-version-cuerpo-para-insert_002dbuffer"><code>nueva versi&oacute;n cuerpo para insert-buffer</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Nuevo-insert_002dbuffer">5.2.6 Nuevo cuerpo para <code>insert-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-number_002dto_002dstring"><code>number-to-string</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Elemento-del-Eje-Y">C.2.2 Construye un elemento del eje Y</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-O">O</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-occur"><code>occur</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Atajos-de-teclado">16.7 Algunos atajos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-opcional"><code>opcional</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Argumentos-opcionales">5.3.1 Argumentos opcionales</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Opciones-Interactive">Opciones Interactive</a></td><td>&nbsp;</td><td valign="top"><a href="#Opciones-de-interactive_002e">3.4 Diferentes opciones para <code>interactive</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Opciones-para-interactive">Opciones para <code>interactive</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Opciones-de-interactive_002e">3.4 Diferentes opciones para <code>interactive</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-or"><code>or</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Insertar-o">5.2.4 El <code>or</code> en el cuerpo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-other_002dbuffer"><code>other-buffer</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Obteniendo-b_00faffers">2.2 Obteniendo b&uacute;ffers</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-P">P</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Parrafos_002c-movimiento-por">P&aacute;rrafos, movimiento por</a></td><td>&nbsp;</td><td valign="top"><a href="#Buscar-regexp">12 B&uacute;squedas de expresiones regulares</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Palabra-Clave">Palabra Clave</a></td><td>&nbsp;</td><td valign="top"><a href="#Argumentos-opcionales">5.3.1 Argumentos opcionales</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Palabras-y-simbolos-en-defun">Palabras y s&iacute;mbolos en defun</a></td><td>&nbsp;</td><td valign="top"><a href="#Palabras-y-S_00edmbolos">14.1 &iquest;Qu&eacute; contar?</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Palabras_002c-contadas-recursivamente">Palabras, contadas recursivamente</a></td><td>&nbsp;</td><td valign="top"><a href="#recursive_002dcount_002dwords">13.2 Cuenta palabras recursivamente</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Palabras_002c-duplicadas">Palabras, duplicadas</a></td><td>&nbsp;</td><td valign="top"><a href="#the_002dthe">Appendix A La funci&oacute;n <code>the-the</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-parte_002dentonces-definida">&lsquo;<samp>parte-entonces</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#if-en-m_00e1s-detalle"><code>if</code> en m&aacute;s detalle</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-parte_002dsi-definida">&lsquo;<samp>parte-si</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#if-en-m_00e1s-detalle"><code>if</code> en m&aacute;s detalle</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Partes-de-definicion-recursiva">Partes de definici&oacute;n recursiva</a></td><td>&nbsp;</td><td valign="top"><a href="#Partes-de-definici_00f3n-recursiva">11.3.2 Las partes de una definici&oacute;n recursiva</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Partes-de-la-expresion-let">Partes de la expresi&oacute;n <code>let</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Partes-de-la-expresi_00f3n-let">3.6.1 Las partes de una expresi&oacute;n <code>let</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Partes-de-una-Definicion-Recursiva">Partes de una Definici&oacute;n Recursiva</a></td><td>&nbsp;</td><td valign="top"><a href="#Partes-de-definici_00f3n-recursiva">11.3.2 Las partes de una definici&oacute;n recursiva</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Pasando-informacion-para-funciones">Pasando informaci&oacute;n para funciones</a></td><td>&nbsp;</td><td valign="top"><a href="#Argumentos">1.8 Argumentos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Patron-recursivo_003a-acumular">Patr&oacute;n recursivo: acumular</a></td><td>&nbsp;</td><td valign="top"><a href="#Acumular">Patr&oacute;n recursivo: <em>accumulate</em></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Patron-recursivo_003a-every">Patr&oacute;n recursivo: every</a></td><td>&nbsp;</td><td valign="top"><a href="#Cada">Patr&oacute;n recursivo: <em>every</em></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Patron-recursivo_003a-keep">Patr&oacute;n recursivo: keep</a></td><td>&nbsp;</td><td valign="top"><a href="#Guardar">Patr&oacute;n recursivo: <em>keep</em></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Patrones-recursivos">Patrones recursivos</a></td><td>&nbsp;</td><td valign="top"><a href="#Patrones-recursivos">11.3.6 Patrones recursivos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Patrones_002c-buscando-por">Patrones, buscando por</a></td><td>&nbsp;</td><td valign="top"><a href="#Buscar-regexp">12 B&uacute;squedas de expresiones regulares</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Pegando-Texto">Pegando Texto</a></td><td>&nbsp;</td><td valign="top"><a href="#Pegando">10 Pegando texto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-pegar"><code>pegar</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Pegando">10 Pegando texto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-pegar-1"><code>pegar</code></a></td><td>&nbsp;</td><td valign="top"><a href="#pegar">B.2 <code>pegar</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Personalizando-tu-fichero-_002eemacs">Personalizando tu fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td><td>&nbsp;</td><td valign="top"><a href="#Inicializaci_00f3n-de-Emacs">16 Tu fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Por-buffer_002c-lista-de-variables-locales">Por b&uacute;ffer, lista de variables locales</a></td><td>&nbsp;</td><td valign="top"><a href="#Texto-y-Autorelleno">16.4 Modo texto y auto relleno</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Practicando-evaluacion">Practicando evaluaci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Practicando-evaluaci_00f3n">2 Practicando evaluaci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Preservando-punto_002c-marca_002c-y-buffer">Preservando punto, marca, y b&uacute;ffer</a></td><td>&nbsp;</td><td valign="top"><a href="#save_002dexcursion">3.10 <code>save-excursion</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Primitivas-en-lenguaje-C">Primitivas en lenguaje C</a></td><td>&nbsp;</td><td valign="top"><a href="#Funciones-primitivas">Una v&iacute;a acerca de funciones primitivas</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Primitivas-escritas-en-C">Primitivas escritas en C</a></td><td>&nbsp;</td><td valign="top"><a href="#Funciones-primitivas">Una v&iacute;a acerca de funciones primitivas</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-print_002delements_002dof_002dlist"><code>print-elements-of-list</code></a></td><td>&nbsp;</td><td valign="top"><a href="#print_002delements_002dof_002dlist">11.1.2 Un ejemplo: <code>imprimir-elementos-de-la-lista</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-print_002delements_002drecursively"><code>print-elements-recursively</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Recursi_00f3n-con-lista">11.3.3 Recursi&oacute;n con una lista</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-print_002dgraph-varlist"><code>print-graph</code> varlist</a></td><td>&nbsp;</td><td valign="top"><a href="#print_002dgraph-Varlist">C.1 La varlist <code>print-graph</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-print_002dgraph-Version-Final_002e"><code>print-graph <span class="roman">Versi&oacute;n Final.</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#La-versi_00f3n-final">Cambios para la versi&oacute;n final</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-print_002dX_002daxis"><code>print-X-axis</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Eje-X-marca-tic">C.3.1 Eje X marca tic</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-print_002dX_002daxis_002dnumbered_002dline"><code>print-X-axis-numbered-line</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Eje-X-marca-tic">C.3.1 Eje X marca tic</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-print_002dX_002daxis_002dtic_002dline"><code>print-X-axis-tic-line</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Eje-X-marca-tic">C.3.1 Eje X marca tic</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-print_002dY_002daxis"><code>print-Y-axis</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Pen_00faltimo-print_002dY_002daxis">C.2.4 La versi&oacute;n no demasiado final de <code>print-Y-axis</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-progn"><code>progn</code></a></td><td>&nbsp;</td><td valign="top"><a href="#progn">8.1.4 La forma especial <code>progn</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Programa_002c-ejecutando-uno">Programa, ejecutando uno</a></td><td>&nbsp;</td><td valign="top"><a href="#Ejecutar-un-programa">1.2 Ejecutar un programa</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Propiedades_002c-en-el-ejemplo-del-modo-linea">Propiedades, en el ejemplo del modo l&iacute;nea</a></td><td>&nbsp;</td><td valign="top"><a href="#Mode-Line">16.14 Una l&iacute;nea modificada</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Propiedades_002c-mencion-de-buffer_002dsubstring_002dno_002dproperties">Propiedades, menci&oacute;n de <code>buffer-substring-no-properties</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Ejercicio-narrow">6.3 Ejercicio de encoger</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Prototipo-de-grafo">Prototipo de grafo</a></td><td>&nbsp;</td><td valign="top"><a href="#Leyendo-un-grafo">15 Leyendo un grafo</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-punto"><code>punto</code></a></td><td>&nbsp;</td><td valign="top"><a href="#save_002dexcursion">3.10 <code>save-excursion</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Punto_002c-marca_002c-preservacion-de-buffer">Punto, marca, preservaci&oacute;n de b&uacute;ffer</a></td><td>&nbsp;</td><td valign="top"><a href="#save_002dexcursion">3.10 <code>save-excursion</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-push_002c-ejemplo"><code>push, <span class="roman">ejemplo</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-R">R</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-re_002dsearch_002dforward"><code>re-search-forward</code></a></td><td>&nbsp;</td><td valign="top"><a href="#re_002dsearch_002dforward">12.2 La funci&oacute;n <code>re-search-forward</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Reasociando-teclas">Reasociando teclas</a></td><td>&nbsp;</td><td valign="top"><a href="#Mapas-de-teclado">16.8 Mapas de teclado</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Recuperando-Texto">Recuperando Texto</a></td><td>&nbsp;</td><td valign="top"><a href="#Pegando">10 Pegando texto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Recuperar-Texto">Recuperar Texto</a></td><td>&nbsp;</td><td valign="top"><a href="#Pegando">10 Pegando texto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Recursion">Recursi&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#Recursi_00f3n">11.3 Recursi&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Recursion-sin-diferir">Recursi&oacute;n sin diferir</a></td><td>&nbsp;</td><td valign="top"><a href="#Sin-Aplazar">11.3.7 Recursi&oacute;n sin diferir</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Recursion-y-bucles">Recursi&oacute;n y bucles</a></td><td>&nbsp;</td><td valign="top"><a href="#Bucles-y-recursi_00f3n">11 Bucles y recursi&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Recursivamente-contando-palabras">Recursivamente contando palabras</a></td><td>&nbsp;</td><td valign="top"><a href="#recursive_002dcount_002dwords">13.2 Cuenta palabras recursivamente</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-recursive_002dcount_002dwords"><code>recursive-count-words</code></a></td><td>&nbsp;</td><td valign="top"><a href="#recursive_002dcount_002dwords">13.2 Cuenta palabras recursivamente</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-recursive_002dgraph_002dbody_002dprint"><code>recursive-graph-body-print</code></a></td><td>&nbsp;</td><td valign="top"><a href="#recursive_002dgraph_002dbody_002dprint">15.2 La funci&oacute;n <code>recursive-graph-body-print</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-recursive_002dlengths_002dlist_002dmany_002dfiles"><code>recursive-lengths-list-many-files</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Varios-ficheros-recursivamente">14.8 Recursivamente cuenta palabras en diferentes ficheros</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-regexp_002dquote"><code>regexp-quote</code></a></td><td>&nbsp;</td><td valign="top"><a href="#fwd_002dpara-let">La expresi&oacute;n <code>let*</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Region_002c-que-es">Regi&oacute;n, qu&eacute; es</a></td><td>&nbsp;</td><td valign="top"><a href="#save_002dexcursion">3.10 <code>save-excursion</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Repeticion-_0028bucles_0029">Repetici&oacute;n (bucles)</a></td><td>&nbsp;</td><td valign="top"><a href="#Bucles-y-recursi_00f3n">11 Bucles y recursi&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Repeticion-para-contar-palabras">Repetici&oacute;n para contar palabras</a></td><td>&nbsp;</td><td valign="top"><a href="#Contando-palabras">13 Contando: repetici&oacute;n y regexps</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Resumen-del-Anillo-de-la-Muerte-Kill-ring">Resumen del Anillo de la Muerte <em>Kill ring</em></a></td><td>&nbsp;</td><td valign="top"><a href="#Resumen-del-anillo-de-la-muerte">10.1 Resumen del anillo de la muerte</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-reverse"><code>reverse</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Contando-definiciones-de-funci_00f3n">14.9.3 Contando definiciones de funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Robots_002c-construyendo">Robots, construyendo</a></td><td>&nbsp;</td><td valign="top"><a href="#Construyendo-robots">11.3.1 Construyendo robots: Extendiendo la met&aacute;fora</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-S">S</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-save_002dexcursion"><code>save-excursion</code></a></td><td>&nbsp;</td><td valign="top"><a href="#save_002dexcursion">3.10 <code>save-excursion</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-save_002drestriction"><code>save-restriction</code></a></td><td>&nbsp;</td><td valign="top"><a href="#save_002drestriction">6.1 La forma especial <code>save-restriction</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-se-definio-evaluate">se defini&oacute; &lsquo;<samp>evaluate</samp>&rsquo;</a></td><td>&nbsp;</td><td valign="top"><a href="#Ejecutar-un-programa">1.2 Ejecutar un programa</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-search_002dforward"><code>search-forward</code></a></td><td>&nbsp;</td><td valign="top"><a href="#search_002dforward">8.1.3 La funci&oacute;n <code>search-forward</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Seleccion-de-modo-automatico">Selecci&oacute;n de modo autom&aacute;tico</a></td><td>&nbsp;</td><td valign="top"><a href="#Texto-y-Autorelleno">16.4 Modo texto y auto relleno</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-sentence_002dend"><code>sentence-end</code></a></td><td>&nbsp;</td><td valign="top"><a href="#sentence_002dend">12.1 La expresi&oacute;n regular para <code>sentence-end</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-set"><code>set</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Usando-set">1.9.1 Usando <code>set</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-set_002dbuffer"><code>set-buffer</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Cambiando-b_00faffers">2.3 Cambiando b&uacute;ffers</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-set_002dvariable"><code>set-variable</code></a></td><td>&nbsp;</td><td valign="top"><a href="#defvar-y-asterisk">8.5.1 <code>defvar</code> y un asterisco</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-setcar"><code>setcar</code></a></td><td>&nbsp;</td><td valign="top"><a href="#setcar">7.5 <code>setcar</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-setcdr"><code>setcdr</code></a></td><td>&nbsp;</td><td valign="top"><a href="#setcdr">7.6 <code>setcdr</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-setcdr_002c-ejemplo"><code>setcdr, <span class="roman">ejemplo</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-setq"><code>setq</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Usando-setq">1.9.2 Usando <code>setq</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Simbolo-sin-funcion-de-error">S&iacute;mbolo sin funci&oacute;n de error</a></td><td>&nbsp;</td><td valign="top"><a href="#Funci_00f3n-vac_00eda">1.7.1 Mensaje de error de un s&iacute;mbolo sin una funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Simbolo-sin-valor-de-error">S&iacute;mbolo sin valor de error</a></td><td>&nbsp;</td><td valign="top"><a href="#Variable-vac_00eda">1.7.2 Mensaje de error de un s&iacute;mbolo sin un valor</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Simbolos-como-una-caja-con-cajones">S&iacute;mbolos como una caja con cajones</a></td><td>&nbsp;</td><td valign="top"><a href="#S_00edmbolos-como-cajas">9.1 S&iacute;mbolos como una caja con cajones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-simplified_002dbeginning_002dof_002dbuffer"><code>simplified-beginning-of-buffer</code></a></td><td>&nbsp;</td><td valign="top"><a href="#simplified_002dbeginning_002dof_002dbuffer">4.2 Una definici&oacute;n simplificada de <code>beginning-of-buffer</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Sin-posponer-la-solucion">Sin posponer la soluci&oacute;n</a></td><td>&nbsp;</td><td valign="top"><a href="#No-aplazar-la-soluci_00f3n">11.3.8 No hay soluci&oacute;n pospuesta</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Solucion-no-pospuesta">Soluci&oacute;n no pospuesta</a></td><td>&nbsp;</td><td valign="top"><a href="#No-aplazar-la-soluci_00f3n">11.3.8 No hay soluci&oacute;n pospuesta</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-sort"><code>sort</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Ordenando">14.9.1 Ordenando listas</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-switch_002dto_002dbuffer"><code>switch-to-buffer</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Cambiando-b_00faffers">2.3 Cambiando b&uacute;ffers</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-T">T</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-tabla-TAGS_002c-especificando">tabla TAGS, especificando</a></td><td>&nbsp;</td><td valign="top"><a href="#Encontrando-m_00e1s">4.1 Encontrando m&aacute;s informaci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Tabuladores_002c-previniendo">Tabuladores, previniendo</a></td><td>&nbsp;</td><td valign="top"><a href="#Indentar-modo-de-tabulaciones">16.6 Indentar modo de tabulaciones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Tamano-del-buffer">Tama&ntilde;o del b&uacute;ffer</a></td><td>&nbsp;</td><td valign="top"><a href="#Tama_00f1o-de-b_00faffer-y-localizaciones">2.4 Tama&ntilde;o de b&uacute;ffer y la ubicaci&oacute;n del punto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Tamano-del-Buffer">Tama&ntilde;o del B&uacute;ffer</a></td><td>&nbsp;</td><td valign="top"><a href="#Tama_00f1o-de-b_00faffer-y-localizaciones">2.4 Tama&ntilde;o de b&uacute;ffer y la ubicaci&oacute;n del punto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Teniendo-un-buffer">Teniendo un b&uacute;ffer</a></td><td>&nbsp;</td><td valign="top"><a href="#Obteniendo-b_00faffers">2.2 Obteniendo b&uacute;ffers</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Texto-entre-comillas">Texto entre comillas</a></td><td>&nbsp;</td><td valign="top"><a href="#g_t_00c1tomos-Lisp">1.1.1 &Aacute;tomos Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-the_002dthe"><code>the-the</code></a></td><td>&nbsp;</td><td valign="top"><a href="#the_002dthe">Appendix A La funci&oacute;n <code>the-the</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Tipo-incorrecto-de-argumento">Tipo incorrecto de argumento</a></td><td>&nbsp;</td><td valign="top"><a href="#Tipo-incorrecto-de-argumento">1.8.4 Usando el tipo incorrecto de objeto como un argumento</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Tipos-de-dato-de-los-argumentos">Tipos de dato de los argumentos</a></td><td>&nbsp;</td><td valign="top"><a href="#Tipos-de-datos">1.8.1 Tipos de argumentos de datos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Tipos-de-datos">Tipos de datos</a></td><td>&nbsp;</td><td valign="top"><a href="#Tipos-de-datos">1.8.1 Tipos de argumentos de datos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Tipos-de-datos-1">Tipos de datos</a></td><td>&nbsp;</td><td valign="top"><a href="#Tipos-de-datos">1.8.1 Tipos de argumentos de datos</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-top_002dof_002dranges"><code>top-of-ranges</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Contando-definiciones-de-funci_00f3n">14.9.3 Contando definiciones de funci&oacute;n</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-triangle_002dbugged"><code>triangle-bugged</code></a></td><td>&nbsp;</td><td valign="top"><a href="#depurar">17.1 <code>depurar</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-triangle_002drecursively"><code>triangle-recursively</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Funci_00f3n-recursiva-tri_00e1ngulo">11.3.4 Recursi&oacute;n en lugar de un contador</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-V">V</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-valor-devuelto-explicado">&lsquo;<samp>valor devuelto</samp>&rsquo; explicado</a></td><td>&nbsp;</td><td valign="top"><a href="#C_00f3mo-el-int_00e9rprete-act_00faa">C&oacute;mo el int&eacute;rprete act&uacute;a</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Variable-de-Ejemplo_002c-fill_002dcolumn">Variable de Ejemplo, <code>fill-column</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Ejemplo-de-rellenar-columna"><code>fill-column</code>, un ejemplo de variable</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-variable-global-definida">&lsquo;<samp>variable global</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#Determinando-el-elemento">Determinando el elemento</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-variable-local-definida">&lsquo;<samp>variable local</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#Prevenir-confusi_00f3n"><code>let</code> evita confusiones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Variable_002c-asignando-valor">Variable, asignando valor</a></td><td>&nbsp;</td><td valign="top"><a href="#set-y-setq">1.9 Configurando el valor de una variable</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Variable_002c-ejemplo-de_002c-fill_002dcolumn">Variable, ejemplo de, <code>fill-column</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Ejemplo-de-rellenar-columna"><code>fill-column</code>, un ejemplo de variable</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-variable_002c-global_002c-definida">&lsquo;<samp>variable, global</samp>&rsquo;, definida</a></td><td>&nbsp;</td><td valign="top"><a href="#Determinando-el-elemento">Determinando el elemento</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-variable_002c-local_002c-definida">&lsquo;<samp>variable, local</samp>&rsquo;, definida</a></td><td>&nbsp;</td><td valign="top"><a href="#Prevenir-confusi_00f3n"><code>let</code> evita confusiones</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Variables">Variables</a></td><td>&nbsp;</td><td valign="top"><a href="#Variables">1.7 Variables</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Variables-let-no-inicializadas">Variables <code>let</code> no inicializadas</a></td><td>&nbsp;</td><td valign="top"><a href="#Variables-let-inicializadas">3.6.3 Variables sin inicializar en un sentencia <code>let</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Variables-let-no-inicializadas-1">Variables <code>let</code> no inicializadas</a></td><td>&nbsp;</td><td valign="top"><a href="#Variables-let-inicializadas">3.6.3 Variables sin inicializar en un sentencia <code>let</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-varlist-definida">&lsquo;<samp>varlist</samp>&rsquo; definida</a></td><td>&nbsp;</td><td valign="top"><a href="#Partes-de-la-expresi_00f3n-let">3.6.1 Las partes de una expresi&oacute;n <code>let</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Verdad-y-mentira-en-Emacs-Lisp">Verdad y mentira en Emacs Lisp</a></td><td>&nbsp;</td><td valign="top"><a href="#Verdad-y-falsedad">3.9 Verdad y falsedad en Emacs Lisp</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Version-de-Emacs_002c-eligiendo">Versi&oacute;n de Emacs, eligiendo</a></td><td>&nbsp;</td><td valign="top"><a href="#Extensi_00f3n-simple">16.11 Una extensi&oacute;n simple: <code>line-to-top-of-window</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Version-de-Emacs_002c-eligiendo-1">Versi&oacute;n de Emacs, eligiendo</a></td><td>&nbsp;</td><td valign="top"><a href="#Extensi_00f3n-simple">16.11 Una extensi&oacute;n simple: <code>line-to-top-of-window</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-W">W</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-what_002dline"><code>what-line</code></a></td><td>&nbsp;</td><td valign="top"><a href="#what_002dline">6.2 <code>what-line</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-while"><code>while</code></a></td><td>&nbsp;</td><td valign="top"><a href="#while">11.1 <code>while</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-X">X</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-X_002daxis_002delement"><code>X-axis-element</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Eje-X-marca-tic">C.3.1 Eje X marca tic</a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-Y">Y</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Y_002daxis_002dcolumn"><code>Y-axis-column</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Y_002daxis_002dcolumn">C.2.3 Crea un eje de la columna Y</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Y_002daxis_002dcolumn-Version-Final_002e"><code>Y-axis-column <span class="roman">Versi&oacute;n Final.</span></code></a></td><td>&nbsp;</td><td valign="top"><a href="#La-versi_00f3n-final">Cambios para la versi&oacute;n final</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Y_002daxis_002dlabel_002dspacing"><code>Y-axis-label-spacing</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Calcular-un-resto">C.2.1 Viaje lateral: Calcula un resto</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-Y_002daxis_002dtic"><code>Y-axis-tic</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Elemento-del-Eje-Y">C.2.2 Construye un elemento del eje Y</a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-yank_002dpop"><code>yank-pop</code></a></td><td>&nbsp;</td><td valign="top"><a href="#yank_002dpop">B.3 <code>yank-pop</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-<tr><th><a name="Indice_cp_letter-Z">Z</a></th><td></td><td></td></tr>
-<tr><td></td><td valign="top"><a href="#index-zap_002dto_002dchar"><code>zap-to-char</code></a></td><td>&nbsp;</td><td valign="top"><a href="#zap_002dto_002dchar">8.1 <code>zap-to-char</code></a></td></tr>
-<tr><td></td><td valign="top"><a href="#index-zerop"><code>zerop</code></a></td><td>&nbsp;</td><td valign="top"><a href="#Cuerpo-de-current_002dkill">El cuerpo de <code>current-kill</code></a></td></tr>
-<tr><td colspan="4"> <hr></td></tr>
-</table>
-<table><tr><th valign="top">Saltar a: &nbsp; </th><td><a class="summary-letter" href="#Indice_cp_symbol-1"><b>%</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_symbol-2"><b>(</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_symbol-3"><b>*</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_symbol-4"><b>/</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_symbol-5"><b>&lt;</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_symbol-6"><b>&gt;</b></a>
- &nbsp;
-<br>
-<a class="summary-letter" href="#Indice_cp_letter-A"><b>A</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-B"><b>B</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-C"><b>C</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-D"><b>D</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-E"><b>E</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-F"><b>F</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-G"><b>G</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-H"><b>H</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-I"><b>I</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-K"><b>K</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-L"><b>L</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-M"><b>M</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-N"><b>N</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-O"><b>O</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-P"><b>P</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-R"><b>R</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-S"><b>S</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-T"><b>T</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-V"><b>V</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-W"><b>W</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-X"><b>X</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-Y"><b>Y</b></a>
- &nbsp;
-<a class="summary-letter" href="#Indice_cp_letter-Z"><b>Z</b></a>
- &nbsp;
-</td></tr></table>
-
-
-<hr>
-<a name="Acerca-del-Autor"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#g_t_00cdndice" title="Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior"> &lt;&lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="Secci&oacute;n anterior en orden de lectura"> &lt; </a>]</td>
-<td valign="middle" align="left">[<a href="#Top" title="Subir secci&oacute;n"> Subir </a>]</td>
-<td valign="middle" align="left">[ &gt; ]</td>
-<td valign="middle" align="left">[ &gt;&gt; ]</td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left"> &nbsp; </td>
-<td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<a name="Acerca-del-Autor-1"></a>
-<h1 class="unnumbered">Acerca del Autor</h1>
-
-<blockquote>
-<p>Robert J. Chassell ha trabajado con GNU Emacs desde 1985. &Eacute;l
-escribe, edita y ense&ntilde;a Emacs y Emacs Lisp, y habla alrededor del
-mundo acerca de la libertad del software. Chassell es Director
-fundador y Tesorero de la Fundaci&oacute;n por el Software Libre (FSF). &Eacute;l
-se gradu&oacute; la Universidad de Cambridge, en Inglaterra. &Eacute;l tiene un
-inter&eacute;s cont&iacute;nuo en historia econ&oacute;mica y social y vuela su
-propio aeroplano
-</p></blockquote>
-
-
-
-<hr size="6">
-<a name="SEC_Foot"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<h1>Notas al pie</h1>
-
-<h3><a name="FOOT1" href="#DOCF1">(1)</a></h3>
-<p>El ap&oacute;strofo o comilla
-es una abreviaci&oacute;n para la funci&oacute;n <code>quote</code>;
-no necesitas pensar acerca de funciones ahora; las funciones se
-definen en <a href="#Creando-errores">Generar un mensaje de error</a>.
-</p><h3><a name="FOOT2" href="#DOCF2">(2)</a></h3>
-<p>Es curioso trazar la
-ruta por la cual la palabra &lsquo;argumento&rsquo; llego a tener dos
-significados distintos, uno en matem&aacute;ticas y el otro en el ingl&eacute;s
-cotidiano. De acuerdo al <cite>Oxford English
-Dictionary</cite>, la palabra deriva del Lat&iacute;n para
-&lsquo;<samp>dejar claro, probar</samp>&rsquo;, por lo tanto, paso a significar, por un hilo de
-derivaci&oacute;n, &lsquo;la evidencia ofrecida como prueba&rsquo;, es decir &lsquo;la
-informaci&oacute;n
-que se ofrece&rsquo;, que conduce a su significado en Lisp.
-Pero en el otro hilo de derivaci&oacute;n, paso a significar &lsquo;afirmar de una
-manera lo que otros pueden afirmar en contra&rsquo;, lo que llevó a la disputa del
-significado de la palabra. (N&oacute;tese aqu&iacute; que la
-palabra Ingl&eacute;sa tiene dos definiciones diferentes adjuntas al mismo
-tiempo. En contraste, en Emacs Lisp, un s&iacute;mbolo no puede
-tener dos definiciones de funci&oacute;n diferentes al mismo tiempo.)
-</p><h3><a name="FOOT3" href="#DOCF3">(3)</a></h3>
-<p><code>(quote
-hola)</code> es una expansi&oacute;n de la abreviatura <code>'hola</code>.
-</p><h3><a name="FOOT4" href="#DOCF4">(4)</a></h3>
-<p>Actualmente,
-puede usar <code>%s</code> para imprimir un n&uacute;mero. Es no
-espec&iacute;fico. <code>%d</code> imprime solo la parte de un
-n&uacute;mero a la izquierda del punto decimal, y no cualquier cosa que
-no es un n&uacute;mero.
-</p><h3><a name="FOOT5" href="#DOCF5">(5)</a></h3>
-<p>En realidad, por defecto, si el b&uacute;ffer desde
-el que has cambiado es visible por t&iacute; en otra
-ventana, <code>other-buffer</code> elegir&aacute; el b&uacute;ffer m&aacute;s reciente que
-no puedes ver; esto es una sutileza que a menudo olvido.
-</p><h3><a name="FOOT6" href="#DOCF6">(6)</a></h3>
-<p>O
-mejor, para evitar escribir, probablemente solo necesite pulsar <kbd>RET</kbd>
-si &lsquo;<tt>*scratch*</tt>&rsquo; es el buffer por defecto, de ser diferente, solo
-escriba parte del nombre, por ejemplo <code>*sc</code>, luego
-presione la tecla <kbd>TAB</kbd> para hacer que se expanda el nombre completo, y
-finalmente pulsa <kbd>RET</kbd>
-</p><h3><a name="FOOT7" href="#DOCF7">(7)</a></h3>
-<p>Recuerda, esta expresi&oacute;n te desplaza al
-b&uacute;ffer m&aacute;s reciente que no puedas ver. Si
-realmente quieres ir al ultimo b&uacute;ffers seleccionado, incluso si
-es visible, es necesario evaluar la siguiente expresi&oacute;n m&aacute;s
-compleja:
-</p><div class="smallexample">
-<pre class="smallexample">(switch-to-buffer (other-buffer (current-buffer) t))
-</pre></div>
-<p>En este caso, el primer argumento de <code>other-buffer</code> le dice a que
-b&uacute;ffer saltar &mdash;el actual&mdash; y el segundo argumento le indica a
-<code>other-buffer</code> que esta BIEN cambiar a un b&uacute;ffer visible. La utilidad
-de <code>switch-to-buffer</code> es llevarte a una ventana invisible ya que
-probablemente
-usar&iacute;as <kbd>C-x o</kbd> (<code>other-window</code>) para ir a otro
-b&uacute;ffer visible
-</p><h3><a name="FOOT8" href="#DOCF8">(8)</a></h3>
-<p>De
-acuerdo con Jared Diamond en <cite>Guns, Germs, and Steel</cite>, &ldquo;&hellip; las
-cebras se vuelven increiblemente peligrosas a medida que envejecen&rdquo; pero la
-demanda aqu&iacute; es que no llegan a ser fieras como un
-tigre. (1997, W. W. Norton and Co., ISBN 0-393-03894-2, pagina 171)
-</p><h3><a name="FOOT9" href="#DOCF9">(9)</a></h3>
-<p>Actualmente,
-se puede <code>cons</code> un elemento para un &aacute;tomo para producir a para
-punteado. Los pares punteados no se discuten aqu&iacute;; ver
-<a href="elisp.html#Notaci_00f3n-de-Pares-Punteados">Notaci&oacute;n de Para Punteado</a> in <cite>El Manual de Referencia de GNU Emacs Lisp</cite>.
-</p><h3><a name="FOOT10" href="#DOCF10">(10)</a></h3>
-<p>M&aacute;s precisamente, y requiriendo conocimiento
-m&aacute;s experto para comprender, los dos enteros son del tipo
-&lsquo;Lisp_Object&rsquo;, que puede tambi&eacute;n ser una uni&oacute;n C en vez de un tipo
-de entero.
-</p><h3><a name="FOOT11" href="#DOCF11">(11)</a></h3>
-<p>Se pueden
-escribir funciones recursivas para ser frugal o basura mental o
-recursos de ordenador; como eso ocurre, los m&eacute;todos que la gente
-encuentra f&aacute;ciles &mdash; son frugales de &lsquo;recursos mentales&rsquo; &mdash;
-algunas veces usan recursos de ordenador considerables. Emacs fu&eacute;
-dise&ntilde;ado para ejecutarse en m&aacute;quinas que ahora se consideran
-limitadas y sus configuraciones por defecto son conservadoras. Se puede
-querer incrementar los valores de <code>max-specdl-size</code> y
-<code>max-lisp-eval-depth</code>. En mi fichero &lsquo;<tt>.emacs</tt>&rsquo;, yo los asigno
-a 15 o 30 veces su valor por defecto.
-</p><h3><a name="FOOT12" href="#DOCF12">(12)</a></h3>
-<p>La frase <em>cola
-recursiva</em> es usado para describir tal proceso, uno que usa &lsquo;espacio
-constante&rsquo;.
-</p><h3><a name="FOOT13" href="#DOCF13">(13)</a></h3>
-<p>La jerga es medianamente confusa:
-<code>triangle-recursive-helper</code> usa un proceso que es iterativo en un
-procedimiento que es recursivo. El proceso se llama iterativo porque
-el ordenador necesita solo grabar los tres valores, <code>suma</code>,
-<code>contador</code>, y <code>n&uacute;mero</code>: el procedimiento es recursivo
-porque la funci&oacute;n &lsquo;llama a s&iacute; mismo&rsquo;. Por otro lado,
-ambos el proceso y el procedimiento usado por
-<code>triangle-recursively</code> son llamados recursivos. La palabra
-&lsquo;recursivo&rsquo; tiene diferentes significados en los dos contextos.
-</p><h3><a name="FOOT14" href="#DOCF14">(14)</a></h3>
-<p>Tu puedes tambi&eacute;n a&ntilde;adir &lsquo;<tt>.el</tt>&rsquo; para
-&lsquo;<tt>~/.emacs</tt>&rsquo; y llama a un fichero &lsquo;<tt>~/.emacs</tt>&rsquo;. En el pasado,
-fu&eacute; prohibido escribir los atajos de teclado extra que el nombre
-&lsquo;<tt>~/.emacs.el</tt>&rsquo; requiere, pero ahora puedes. El nuevo formato es
-consistente con las conveniciones de nombre del fichero Emacs Lisp; el
-viejo formato guarda la escritura.
-</p><h3><a name="FOOT15" href="#DOCF15">(15)</a></h3>
-<p>Cuando se empiezan las instancias de
-Emacs que no cargan mi fichero &lsquo;<tt>.emacs</tt>&rsquo; o cualquier fichero,
-tambi&eacute;n se puede deshabilitar la ocultaci&oacute;n:
-</p><div class="smallexample">
-<pre class="smallexample">emacs -q --no-site-file -eval '(blink-cursor-mode nil)'
-O ahora,
-usando un conjunto m&aacute;s sofisticado de opciones, emacs -Q - D
-</pre></div>
-
-<h3><a name="FOOT16" href="#DOCF16">(16)</a></h3>
-<p>tambi&eacute;n se ejecutan gestores de ventanas m&aacute;s
-modernos, tales como Enlightenment, Gnome, o KDE; en estos casos, con
-frecuencia se especifica una imagen en vez de un color plano.
-</p><hr>
-<a name="SEC_Contents"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<h1>&Iacute;ndice General</h1>
-
-<div class="contents">
-
-<ul class="no-bullet">
- <li><a name="toc-Prefacio-1" href="#Prefacio">Prefacio</a>
- <ul class="no-bullet">
- <li><a name="toc-_00bfPor-que-estudiar-Emacs-Lisp_003f" href="#Por-qu_00e9">&iquest;Por qu&eacute; estudiar Emacs Lisp?</a></li>
- <li><a name="toc-Leyendo-este-texto-1" href="#Leyendo-este-texto">Leyendo este texto</a></li>
- <li><a name="toc-Para-quien-esta-esto-escrito" href="#Quien-eres">Para quien est&aacute; esto escrito</a></li>
- <li><a name="toc-Historia-de-Lisp-1" href="#Historia-de-Lisp">Historia de Lisp</a></li>
- <li><a name="toc-Una-nota-para-principiantes" href="#Nota-para-principiantes">Una nota para principiantes</a></li>
- <li><a name="toc-Se-agradece-1" href="#Se-agradece">Se agradece</a></li>
- </ul></li>
- <li><a name="toc-Procesamiento-de-listas-1" href="#Procesamiento-de-listas">1 Procesamiento de listas</a>
- <ul class="no-bullet">
- <li><a name="toc-Listas-Lisp-1" href="#Listas-Lisp">1.1 Listas Lisp</a>
- <ul class="no-bullet">
- <li><a name="toc-Numeros_002c-listas-dentro-de-listas" href="#Listas-de-n_00fameros">N&uacute;meros, listas dentro de listas</a></li>
- <li><a name="toc-Atomos-Lisp" href="#g_t_00c1tomos-Lisp">1.1.1 &Aacute;tomos Lisp</a></li>
- <li><a name="toc-Espacios-en-blanco-en-listas-1" href="#Espacios-en-blanco-en-listas">1.1.2 Espacios en blanco en listas</a></li>
- <li><a name="toc-GNU-Emacs-te-ayuda-a-escribir-listas" href="#Escribiendo-listas">1.1.3 GNU Emacs te ayuda a escribir listas</a></li>
- </ul></li>
- <li><a name="toc-Ejecutar-un-programa-1" href="#Ejecutar-un-programa">1.2 Ejecutar un programa</a></li>
- <li><a name="toc-Generar-un-mensaje-de-error" href="#Creando-errores">1.3 Generar un mensaje de error</a></li>
- <li><a name="toc-Nombres-de-simbolos-y-definiciones-de-funciones" href="#Nombres-y-definiciones">1.4 Nombres de s&iacute;mbolos y definiciones de funciones</a></li>
- <li><a name="toc-El-interprete-Lisp" href="#Interpr_00e9te-Lisp">1.5 El int&eacute;rprete Lisp</a>
- <ul class="no-bullet">
- <li><a name="toc-Complicaciones-1" href="#Complicaciones">Complicaciones</a></li>
- <li><a name="toc-Compilacion-de-bytes" href="#Compilaci_00f3n-de-bytes">1.5.1 Compilaci&oacute;n de bytes</a></li>
- </ul></li>
- <li><a name="toc-Evaluacion" href="#Evaluaci_00f3n">1.6 Evaluaci&oacute;n</a>
- <ul class="no-bullet">
- <li><a name="toc-Como-el-interprete-actua" href="#C_00f3mo-el-int_00e9rprete-act_00faa">C&oacute;mo el int&eacute;rprete act&uacute;a</a></li>
- <li><a name="toc-Evaluando-listas-propias-1" href="#Evaluando-listas-propias">1.6.1 Evaluando listas propias</a></li>
- </ul></li>
- <li><a name="toc-Variables-1" href="#Variables">1.7 Variables</a>
- <ul class="no-bullet">
- <li><a name="toc-fill_002dcolumn_002c-un-ejemplo-de-variable" href="#Ejemplo-de-rellenar-columna"><code>fill-column</code>, un ejemplo de variable</a></li>
- <li><a name="toc-Mensaje-de-error-de-un-simbolo-sin-una-funcion" href="#Funci_00f3n-vac_00eda">1.7.1 Mensaje de error de un s&iacute;mbolo sin una funci&oacute;n</a></li>
- <li><a name="toc-Mensaje-de-error-de-un-simbolo-sin-un-valor" href="#Variable-vac_00eda">1.7.2 Mensaje de error de un s&iacute;mbolo sin un valor</a></li>
- </ul></li>
- <li><a name="toc-Argumentos-1" href="#Argumentos">1.8 Argumentos</a>
- <ul class="no-bullet">
- <li><a name="toc-Tipos-de-argumentos-de-datos" href="#Tipos-de-datos">1.8.1 Tipos de argumentos de datos</a></li>
- <li><a name="toc-Un-argumento-como-el-valor-de-una-variable-o-lista" href="#Argumentos-como-variables-o-listas">1.8.2 Un argumento como el valor de una variable o lista</a></li>
- <li><a name="toc-Numero-de-variables-de-argumentos" href="#N_00famero-de-variables-de-argumentos">1.8.3 N&uacute;mero de variables de argumentos</a></li>
- <li><a name="toc-Usando-el-tipo-incorrecto-de-objeto-como-un-argumento" href="#Tipo-incorrecto-de-argumento">1.8.4 Usando el tipo incorrecto de objeto como un argumento</a></li>
- <li><a name="toc-La-funcion-message" href="#message">1.8.5 La funci&oacute;n <code>message</code></a></li>
- </ul></li>
- <li><a name="toc-Configurando-el-valor-de-una-variable" href="#set-y-setq">1.9 Configurando el valor de una variable</a>
- <ul class="no-bullet">
- <li><a name="toc-Usando-set-1" href="#Usando-set">1.9.1 Usando <code>set</code></a></li>
- <li><a name="toc-Usando-setq-1" href="#Usando-setq">1.9.2 Usando <code>setq</code></a></li>
- <li><a name="toc-Contando-1" href="#Contando">1.9.3 Contando</a></li>
- </ul></li>
- <li><a name="toc-Resumen-1" href="#Resumen">1.10 Resumen</a></li>
- <li><a name="toc-Ejercicios-1" href="#Ejercicios-de-mensajes-de-error">1.11 Ejercicios</a></li>
- </ul></li>
- <li><a name="toc-Practicando-evaluacion" href="#Practicando-evaluaci_00f3n">2 Practicando evaluaci&oacute;n</a>
- <ul class="no-bullet">
- <li><a name="toc-Como-evaluar" href="#C_00f3mo-evaluar">C&oacute;mo evaluar</a></li>
- <li><a name="toc-Nombres-de-buffer" href="#Nombres-de-b_00faffer">2.1 Nombres de b&uacute;ffer</a></li>
- <li><a name="toc-Obteniendo-buffers" href="#Obteniendo-b_00faffers">2.2 Obteniendo b&uacute;ffers</a></li>
- <li><a name="toc-Cambiando-buffers" href="#Cambiando-b_00faffers">2.3 Cambiando b&uacute;ffers</a></li>
- <li><a name="toc-Tamano-de-buffer-y-la-ubicacion-del-punto" href="#Tama_00f1o-de-b_00faffer-y-localizaciones">2.4 Tama&ntilde;o de b&uacute;ffer y la ubicaci&oacute;n del punto</a></li>
- <li><a name="toc-Ejercicio" href="#Ejercicio-de-evaluaci_00f3n">2.5 Ejercicio</a></li>
- </ul></li>
- <li><a name="toc-Como-escribir-definiciones-de-funciones" href="#Escribiendo-funciones">3 C&oacute;mo escribir definiciones de funciones</a>
- <ul class="no-bullet">
- <li><a name="toc-Una-via-acerca-de-funciones-primitivas" href="#Funciones-primitivas">Una v&iacute;a acerca de funciones primitivas</a></li>
- <li><a name="toc-La-forma-especial-defun" href="#defun">3.1 La forma especial <code>defun</code></a></li>
- <li><a name="toc-Instalar-una-definicion-de-funcion" href="#Instalar">3.2 Instalar una definici&oacute;n de funci&oacute;n</a>
- <ul class="no-bullet">
- <li><a name="toc-El-efecto-de-instalacion" href="#Efecto-de-instalaci_00f3n">El efecto de instalaci&oacute;n</a></li>
- <li><a name="toc-Cambiar-una-definicion-de-funcion" href="#Cambiar-un-defun">3.2.1 Cambiar una definici&oacute;n de funci&oacute;n</a></li>
- </ul></li>
- <li><a name="toc-Crear-una-funcion-interactive" href="#Interactive">3.3 Crear una funci&oacute;n interactive</a>
- <ul class="no-bullet">
- <li><a name="toc-Un-multiply_002dby_002dseven-interactivo_002c-Un-resumen" href="#multiply_002dby_002dseven-interactivo">Un <code>multiply-by-seven</code> interactivo, Un resumen</a></li>
- <li><a name="toc-multiplicar_002dpor_002dsiente-interactivo" href="#multiply_002dby_002dseven-en-detalle">3.3.1 <code>multiplicar-por-siente</code> interactivo</a></li>
- </ul></li>
- <li><a name="toc-Diferentes-opciones-para-interactive" href="#Opciones-de-interactive_002e">3.4 Diferentes opciones para <code>interactive</code></a></li>
- <li><a name="toc-Instalar-codigo-permanentemente" href="#Instalaci_00f3n-Permanente">3.5 Instalar c&oacute;digo permanentemente</a></li>
- <li><a name="toc-let-1" href="#let">3.6 <code>let</code></a>
- <ul class="no-bullet">
- <li><a name="toc-let-evita-confusiones" href="#Prevenir-confusi_00f3n"><code>let</code> evita confusiones</a></li>
- <li><a name="toc-Las-partes-de-una-expresion-let" href="#Partes-de-la-expresi_00f3n-let">3.6.1 Las partes de una expresi&oacute;n <code>let</code></a></li>
- <li><a name="toc-Ejemplo-de-Expresion-let" href="#Ejemplo-de-expresi_00f3n-let">3.6.2 Ejemplo de Expresi&oacute;n <code>let</code></a></li>
- <li><a name="toc-Variables-sin-inicializar-en-un-sentencia-let" href="#Variables-let-inicializadas">3.6.3 Variables sin inicializar en un sentencia <code>let</code></a></li>
- </ul></li>
- <li><a name="toc-La-forma-especial-if" href="#if">3.7 La forma especial <code>if</code></a>
- <ul class="no-bullet">
- <li><a name="toc-if-en-mas-detalle" href="#if-en-m_00e1s-detalle"><code>if</code> en m&aacute;s detalle</a></li>
- <li><a name="toc-La-funcion-tipo_002dde_002danimal-en-detalle" href="#tipo_002dde_002danimal-en-detalle">3.7.1 La funci&oacute;n <code>tipo-de-animal</code> en detalle</a></li>
- </ul></li>
- <li><a name="toc-Expresiones-if_002d_002dthen_002d_002delse" href="#else">3.8 Expresiones if&ndash;then&ndash;else</a></li>
- <li><a name="toc-Verdad-y-falsedad-en-Emacs-Lisp" href="#Verdad-y-falsedad">3.9 Verdad y falsedad en Emacs Lisp</a>
- <ul class="no-bullet">
- <li><a name="toc-Una-explicacion-de-nil" href="#nil-explicado">Una explicaci&oacute;n de <code>nil</code></a></li>
- </ul></li>
- <li><a name="toc-save_002dexcursion-1" href="#save_002dexcursion">3.10 <code>save-excursion</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Punto-y-Marca" href="#Punto-y-marca">Punto y Marca</a></li>
- <li><a name="toc-Plantilla-para-una-expresion-save_002dexcursion" href="#Plantilla-para-save_002dexcursion">3.10.1 Plantilla para una expresi&oacute;n <code>save-excursion</code></a></li>
- </ul></li>
- <li><a name="toc-Revisar-2" href="#Revisar">3.11 Revisar</a></li>
- <li><a name="toc-Ejercicios" href="#Ejercicios-defun">3.12 Ejercicios</a></li>
- </ul></li>
- <li><a name="toc-Unas-pocas-funciones-de-buffer-relacionadas" href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers">4 Unas pocas funciones de buffer relacionadas</a>
- <ul class="no-bullet">
- <li><a name="toc-Encontrando-mas-informacion" href="#Encontrando-m_00e1s">4.1 Encontrando m&aacute;s informaci&oacute;n</a></li>
- <li><a name="toc-Una-definicion-simplificada-de-beginning_002dof_002dbuffer" href="#simplified_002dbeginning_002dof_002dbuffer">4.2 Una definici&oacute;n simplificada de <code>beginning-of-buffer</code></a></li>
- <li><a name="toc-La-definicion-de-mark_002dwhole_002dbuffer" href="#mark_002dwhole_002dbuffer">4.3 La definici&oacute;n de <code>mark-whole-buffer</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Un-resumen-de-mark_002dwhole_002dbuffer" href="#resumen-de-mark_002dwhole_002dbuffer">Un resumen de <code>mark-whole-buffer</code></a></li>
- <li><a name="toc-Cuerpo-de-mark_002dwhole_002dbuffer-1" href="#Cuerpo-de-mark_002dwhole_002dbuffer">4.3.1 Cuerpo de <code>mark-whole-buffer</code></a></li>
- </ul></li>
- <li><a name="toc-La-definicion-de-append_002dto_002dbuffer" href="#append_002dto_002dbuffer">4.4 La definici&oacute;n de <code>append-to-buffer</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Un-resumen-de-append_002dto_002dbuffer" href="#resumen-de-append_002dto_002dbuffer">Un resumen de <code>append-to-buffer</code></a></li>
- <li><a name="toc-La-expresion-interactiva-append_002dto_002dbuffer" href="#append-interactivo">4.4.1 La expresi&oacute;n interactiva <code>append-to-buffer</code></a></li>
- <li><a name="toc-El-cuerpo-de-append_002dto_002dbuffer" href="#cuerpo-append_002dto_002dbuffer">4.4.2 El cuerpo de <code>append-to-buffer</code></a></li>
- <li><a name="toc-save_002dexcursion-en-append_002dto_002dbuffer" href="#append-save_002dexcursion">4.4.3 <code>save-excursion</code> en <code>append-to-buffer</code></a></li>
- </ul></li>
- <li><a name="toc-Revisar-3" href="#Revisa-lo-relacionado-con-el-b_00faffer">4.5 Revisar</a></li>
- <li><a name="toc-Ejercicios-2" href="#Ejercicios-de-b_00faffer">4.6 Ejercicios</a></li>
- </ul></li>
- <li><a name="toc-Unas-pocas-funciones-mas-complejas" href="#M_00e1s-complejidad">5 Unas pocas funciones m&aacute;s complejas</a>
- <ul class="no-bullet">
- <li><a name="toc-La-definicion-de-copy_002dto_002dbuffer" href="#copy_002dto_002dbuffer">5.1 La definici&oacute;n de <code>copy-to-buffer</code></a></li>
- <li><a name="toc-La-definicion-de-insert_002dbuffer" href="#insert_002dbuffer">5.2 La definici&oacute;n de <code>insert-buffer</code></a>
- <ul class="no-bullet">
- <li><a name="toc-El-codigo-para-insert_002dbuffer" href="#c_00f3digo-insert_002dbuffer">El c&oacute;digo para <code>insert-buffer</code></a></li>
- <li><a name="toc-La-expresion-interactiva-en-insert_002dbuffer" href="#insert_002dbuffer-interactivo">5.2.1 La expresi&oacute;n interactiva en <code>insert-buffer</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Un-buffer-de-solo-lectura" href="#B_00faffer-solo-lectura">Un b&uacute;ffer de solo lectura</a></li>
- <li><a name="toc-b-en-una-expresion-interactiva" href="#b-para-interactivo">&lsquo;<samp>b</samp>&rsquo; en una expresi&oacute;n interactiva</a></li>
- </ul></li>
- <li><a name="toc-El-cuerpo-de-la-funcion-insert_002dbuffer" href="#cuerpo-insert_002dbuffer">5.2.2 El cuerpo de la funci&oacute;n <code>insert-buffer</code></a></li>
- <li><a name="toc-insert_002dbuffer-con-un-if-en-vez-de-un-or" href="#si-y-o">5.2.3 <code>insert-buffer</code> con un <code>if</code> en vez de un <code>or</code></a></li>
- <li><a name="toc-El-or-en-el-cuerpo" href="#Insertar-o">5.2.4 El <code>or</code> en el cuerpo</a></li>
- <li><a name="toc-La-expresion-let-en-insert_002dbuffer" href="#Insertar-let">5.2.5 La expresi&oacute;n <code>let</code> en <code>insert-buffer</code></a></li>
- <li><a name="toc-Nuevo-cuerpo-para-insert_002dbuffer" href="#Nuevo-insert_002dbuffer">5.2.6 Nuevo cuerpo para <code>insert-buffer</code></a></li>
- </ul></li>
- <li><a name="toc-Definicion-completa-de-beginning_002dof_002dbuffer" href="#beginning_002dof_002dbuffer">5.3 Definici&oacute;n completa de <code>beginning-of-buffer</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Argumentos-opcionales-1" href="#Argumentos-opcionales">5.3.1 Argumentos opcionales</a></li>
- <li><a name="toc-beginning_002dof_002dbuffer-con-un-argumento" href="#beginning_002dof_002dbuffer-opt-arg">5.3.2 <code>beginning-of-buffer</code> con un argumento</a>
- <ul class="no-bullet">
- <li><a name="toc-Desenmaranar-beginning_002dof_002dbuffer" href="#Desenmara_00f1ar-beginning_002dof_002dbuffer">Desenmara&ntilde;ar <code>beginning-of-buffer</code></a></li>
- <li><a name="toc-Que-ocurre-en-un-buffer-largo" href="#El-caso-del-buffer-largo">Qu&eacute; ocurre en un b&uacute;ffer largo</a></li>
- <li><a name="toc-Que-ocurre-en-un-buffer-pequeno" href="#Peque_00f1o-caso-de-b_00faffer">Qu&eacute; ocurre en un b&uacute;ffer peque&ntilde;o</a></li>
- </ul></li>
- <li><a name="toc-El-beginning_002dof_002dbuffer-completo" href="#Completo-beginning_002dof_002dbuffer">5.3.3 El <code>beginning-of-buffer</code> completo</a></li>
- </ul></li>
- <li><a name="toc-Revisar-1" href="#Revisar-el-segundo-b_00faffer-relacionado">5.4 Revisar</a></li>
- <li><a name="toc-Ejercicio-de-argumento-opcional" href="#Ejercicio-opcional">5.5 Ejercicio de argumento <code>opcional</code></a></li>
- </ul></li>
- <li><a name="toc-Encogiendo-y-extendiendo-1" href="#Encogiendo-y-extendiendo">6 Encogiendo y extendiendo</a>
- <ul class="no-bullet">
- <li><a name="toc-Las-ventajas-de-encoger" href="#Ventajas-de-encoger">Las ventajas de encoger</a></li>
- <li><a name="toc-La-forma-especial-save_002drestriction" href="#save_002drestriction">6.1 La forma especial <code>save-restriction</code></a></li>
- <li><a name="toc-what_002dline-1" href="#what_002dline">6.2 <code>what-line</code></a></li>
- <li><a name="toc-Ejercicio-de-encoger" href="#Ejercicio-narrow">6.3 Ejercicio de encoger</a></li>
- </ul></li>
- <li><a name="toc-car_002c-cdr_002c-cons_003a-Funciones-fundamentales" href="#Car-cdr-y-cons">7 <code>car</code>, <code>cdr</code>, <code>cons</code>: Funciones fundamentales</a>
- <ul class="no-bullet">
- <li><a name="toc-Nombres-extranos" href="#Nombres-extra_00f1os">Nombres extra&ntilde;os</a></li>
- <li><a name="toc-car-y-cdr-1" href="#car-y-cdr">7.1 <code>car</code> y <code>cdr</code></a></li>
- <li><a name="toc-cons-1" href="#cons">7.2 <code>cons</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Construir-una-lista-1" href="#Construir-una-lista">Construir una lista</a></li>
- <li><a name="toc-Encuentra-el-tamano-de-una-lista_003a-length" href="#length">7.2.1 Encuentra el tama&ntilde;o de una lista: <code>length</code></a></li>
- </ul></li>
- <li><a name="toc-nthcdr-1" href="#nthcdr">7.3 <code>nthcdr</code></a></li>
- <li><a name="toc-nth-1" href="#nth">7.4 <code>nth</code></a></li>
- <li><a name="toc-setcar-1" href="#setcar">7.5 <code>setcar</code></a></li>
- <li><a name="toc-setcdr-1" href="#setcdr">7.6 <code>setcdr</code></a></li>
- <li><a name="toc-Ejercicio-2" href="#Ejercicio-cons">7.7 Ejercicio</a></li>
- </ul></li>
- <li><a name="toc-Cortando-y-almacenando-texto-1" href="#Cortando-y-almacenando-texto">8 Cortando y almacenando texto</a>
- <ul class="no-bullet">
- <li><a name="toc-Almacenando-texto-en-una-lista" href="#Almacenando-Texto">Almacenando texto en una lista</a></li>
- <li><a name="toc-zap_002dto_002dchar-1" href="#zap_002dto_002dchar">8.1 <code>zap-to-char</code></a>
- <ul class="no-bullet">
- <li><a name="toc-La-implementacion-completa-zap_002dto_002dchar" href="#Completar-zap_002dto_002dchar">La implementaci&oacute;n completa <code>zap-to-char</code></a></li>
- <li><a name="toc-La-expresion-interactive" href="#zap_002dto_002dchar-interactivo">8.1.1 La expresi&oacute;n <code>interactive</code></a></li>
- <li><a name="toc-El-cuerpo-de-zap_002dto_002dchar" href="#cuerpo-zap_002dto_002dchar">8.1.2 El cuerpo de <code>zap-to-char</code></a></li>
- <li><a name="toc-La-funcion-search_002dforward" href="#search_002dforward">8.1.3 La funci&oacute;n <code>search-forward</code></a></li>
- <li><a name="toc-La-forma-especial-progn" href="#progn">8.1.4 La forma especial <code>progn</code></a></li>
- <li><a name="toc-Resumiendo-zap_002dto_002dchar-1" href="#Resumiendo-zap_002dto_002dchar">8.1.5 Resumiendo <code>zap-to-char</code></a></li>
- </ul></li>
- <li><a name="toc-kill_002dregion-1" href="#kill_002dregion">8.2 <code>kill-region</code></a>
- <ul class="no-bullet">
- <li><a name="toc-La-definicion-completa-kill_002dregion" href="#Completa-kill_002dregion">La definici&oacute;n completa <code>kill-region</code></a></li>
- <li><a name="toc-condition_002dcase-1" href="#condition_002dcase">8.2.1 <code>condition-case</code></a></li>
- <li><a name="toc-Macro-Lisp-1" href="#Macro-Lisp">8.2.2 Macro Lisp</a></li>
- </ul></li>
- <li><a name="toc-copy_002dregion_002das_002dkill-1" href="#copy_002dregion_002das_002dkill">8.3 <code>copy-region-as-kill</code></a>
- <ul class="no-bullet">
- <li><a name="toc-La-definicion-de-la-funcion-completa-copy_002dregion_002das_002dkill_002e" href="#Completar-copy_002dregion_002das_002dkill">La definici&oacute;n de la funci&oacute;n completa <code>copy-region-as-kill</code>.</a></li>
- <li><a name="toc-El-cuerpo-de-copy_002dregion_002das_002dkill" href="#cuerpo-copy_002dregion_002das_002dkill">8.3.1 El cuerpo de <code>copy-region-as-kill</code></a>
- <ul class="no-bullet">
- <li><a name="toc-last_002dcommand-y-this_002dcommand" href="#last_002dcommand-_0026-this_002dcommand"><code>last-command</code> y <code>this-command</code></a></li>
- <li><a name="toc-La-funcion-kill_002dappend" href="#Funci_00f3n-kill_002dappend">La funci&oacute;n <code>kill-append</code></a></li>
- <li><a name="toc-La-funcion-kill_002dnew" href="#Funci_00f3n-kill_002dnew">La funci&oacute;n <code>kill-new</code></a></li>
- </ul>
-</li>
- </ul></li>
- <li><a name="toc-Disgresion-dentro-de-C" href="#Disgresi_00f3n-dentro-de-C">8.4 Disgresi&oacute;n dentro de C</a></li>
- <li><a name="toc-Inicializando-una-variable-con-defvar" href="#defvar">8.5 Inicializando una variable con <code>defvar</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Mirando-el-actual-valor-de-una-variable" href="#Mira-el-valor-actual-de-la-variable">Mirando el actual valor de una variable</a></li>
- <li><a name="toc-defvar-y-un-asterisco" href="#defvar-y-asterisk">8.5.1 <code>defvar</code> y un asterisco</a></li>
- </ul></li>
- <li><a name="toc-Revisar-4" href="#Revisi_00f3n-de-cons-y-search_002dfwd">8.6 Revisar</a></li>
- <li><a name="toc-Buscando-ejercicios" href="#Buscar-ejercicios">8.7 Buscando ejercicios</a></li>
- </ul></li>
- <li><a name="toc-Como-las-listas-se-implementan" href="#Implementaci_00f3n-de-listas">9 C&oacute;mo las listas se implementan</a>
- <ul class="no-bullet">
- <li><a name="toc-Listas-diagramadas-1" href="#Listas-diagramadas">Listas diagramadas</a></li>
- <li><a name="toc-Simbolos-como-una-caja-con-cajones" href="#S_00edmbolos-como-cajas">9.1 S&iacute;mbolos como una caja con cajones</a></li>
- <li><a name="toc-Ejercicio-1" href="#Ejercicio-Lista">9.2 Ejercicio</a></li>
- </ul></li>
- <li><a name="toc-Pegando-texto" href="#Pegando">10 Pegando texto</a>
- <ul class="no-bullet">
- <li><a name="toc-Resumen-del-anillo-de-la-muerte-1" href="#Resumen-del-anillo-de-la-muerte">10.1 Resumen del anillo de la muerte</a></li>
- <li><a name="toc-La-variable-kill_002dring_002dyank_002dpointer" href="#kill_002dring_002dyank_002dpointer">10.2 La variable <code>kill-ring-yank-pointer</code></a></li>
- <li><a name="toc-Ejercicios-con-yank-y-nthcdr" href="#pegar-Ejercicio-nthcdr">10.3 Ejercicios con <code>yank</code> y <code>nthcdr</code></a></li>
- </ul></li>
- <li><a name="toc-Bucles-y-recursion" href="#Bucles-y-recursi_00f3n">11 Bucles y recursi&oacute;n</a>
- <ul class="no-bullet">
- <li><a name="toc-while-1" href="#while">11.1 <code>while</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Bucles-con-while" href="#Bucles-while">Bucles con <code>while</code></a></li>
- <li><a name="toc-Un-bucle-while-y-una-lista" href="#Ejemplo-de-bucle">11.1.1 Un bucle <code>while</code> y una lista</a></li>
- <li><a name="toc-Un-ejemplo_003a-imprimir_002delementos_002dde_002dla_002dlista" href="#print_002delements_002dof_002dlist">11.1.2 Un ejemplo: <code>imprimir-elementos-de-la-lista</code></a></li>
- <li><a name="toc-Un-bucle-con-un-contaje-incremental" href="#Incrementando-el-Bucle">11.1.3 Un bucle con un contaje incremental</a></li>
- <li><a name="toc-Detalles-de-un-bucle-que-se-incrementa" href="#Incrementando-los-detalles-de-los-bucles">Detalles de un bucle que se incrementa</a>
- <ul class="no-bullet">
- <li><a name="toc-Ejemplo-con-contador-incremental" href="#Ejemplo-de-Incremento">Ejemplo con contador incremental</a></li>
- <li><a name="toc-Las-partes-de-la-definicion-de-funcion" href="#Partes-Inc-de-Ejemplo">Las partes de la definici&oacute;n de funci&oacute;n</a></li>
- <li><a name="toc-Poniendo-la-definicion-de-la-funcion-junta" href="#Ejemplo-Inc-junto">Poniendo la definici&oacute;n de la funci&oacute;n junta</a></li>
- </ul></li>
- <li><a name="toc-Bucle-que-decrementa" href="#Bucle-que-se-decrementa">11.1.4 Bucle que decrementa</a>
- <ul class="no-bullet">
- <li><a name="toc-Ejemplo-con-el-contador-que-se-decrementa" href="#Ejemplo-de-Decremento">Ejemplo con el contador que se decrementa</a></li>
- <li><a name="toc-Las-partes-de-la-definicion-de-funcion-1" href="#Partes-de-Ejemplo-Dec">Las partes de la definici&oacute;n de funci&oacute;n</a></li>
- <li><a name="toc-Poniendo-la-definicion-de-la-funcion-junta-1" href="#Ejemplo-Dec-junto">Poniendo la definici&oacute;n de la funci&oacute;n junta</a></li>
- </ul>
-</li>
- </ul></li>
- <li><a name="toc-Ahorra-tiempo_003a-dolist-y-dotimes" href="#Dolist-y-dotimes">11.2 Ahorra tiempo: <code>dolist</code> y <code>dotimes</code></a>
- <ul class="no-bullet">
- <li><a name="toc-La-macro-dolist" href="#dolist">La macro <code>dolist</code></a></li>
- <li><a name="toc-La-macro-dotimes" href="#dotimes">La macro <code>dotimes</code></a></li>
- </ul></li>
- <li><a name="toc-Recursion" href="#Recursi_00f3n">11.3 Recursi&oacute;n</a>
- <ul class="no-bullet">
- <li><a name="toc-Construyendo-robots_003a-Extendiendo-la-metafora" href="#Construyendo-robots">11.3.1 Construyendo robots: Extendiendo la met&aacute;fora</a></li>
- <li><a name="toc-Las-partes-de-una-definicion-recursiva" href="#Partes-de-definici_00f3n-recursiva">11.3.2 Las partes de una definici&oacute;n recursiva</a></li>
- <li><a name="toc-Recursion-con-una-lista" href="#Recursi_00f3n-con-lista">11.3.3 Recursi&oacute;n con una lista</a></li>
- <li><a name="toc-Recursion-en-lugar-de-un-contador" href="#Funci_00f3n-recursiva-tri_00e1ngulo">11.3.4 Recursi&oacute;n en lugar de un contador</a>
- <ul class="no-bullet">
- <li><a name="toc-Un-argumento-de-1-o-2" href="#Ejemplo-recursivo-y-argumento-con-valor-1-o-2">Un argumento de 1 o 2</a></li>
- <li><a name="toc-Un-argumento-de-3-o-4" href="#Ejemplo-Recursivo-de-3-o-4-argumentos">Un argumento de 3 o 4</a></li>
- </ul></li>
- <li><a name="toc-Ejemplo-de-recursion-usando-cond" href="#Recursi_00f3n-con-cond">11.3.5 Ejemplo de recursi&oacute;n usando <code>cond</code></a></li>
- <li><a name="toc-Patrones-recursivos-1" href="#Patrones-recursivos">11.3.6 Patrones recursivos</a>
- <ul class="no-bullet">
- <li><a name="toc-Patron-recursivo_003a-every" href="#Cada">Patr&oacute;n recursivo: <em>every</em></a></li>
- <li><a name="toc-Patron-recursivo_003a-accumulate" href="#Acumular">Patr&oacute;n recursivo: <em>accumulate</em></a></li>
- <li><a name="toc-Patron-recursivo_003a-keep" href="#Guardar">Patr&oacute;n recursivo: <em>keep</em></a></li>
- </ul></li>
- <li><a name="toc-Recursion-sin-diferir" href="#Sin-Aplazar">11.3.7 Recursi&oacute;n sin diferir</a></li>
- <li><a name="toc-No-hay-solucion-pospuesta" href="#No-aplazar-la-soluci_00f3n">11.3.8 No hay soluci&oacute;n pospuesta</a></li>
- </ul></li>
- <li><a name="toc-Ejercicio-de-bucles" href="#Ejercicio-de-Bucle">11.4 Ejercicio de bucles</a></li>
- </ul></li>
- <li><a name="toc-Busquedas-de-expresiones-regulares" href="#Buscar-regexp">12 B&uacute;squedas de expresiones regulares</a>
- <ul class="no-bullet">
- <li><a name="toc-La-expresion-regular-para-sentence_002dend" href="#sentence_002dend">12.1 La expresi&oacute;n regular para <code>sentence-end</code></a></li>
- <li><a name="toc-La-funcion-re_002dsearch_002dforward" href="#re_002dsearch_002dforward">12.2 La funci&oacute;n <code>re-search-forward</code></a></li>
- <li><a name="toc-forward_002dsentence-1" href="#forward_002dsentence">12.3 <code>forward-sentence</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Completa-la-definicion-forward_002dsentence" href="#Completa-forward_002dsentence">Completa la definici&oacute;n <code>forward-sentence</code></a></li>
- <li><a name="toc-Los-bucles-while" href="#Bucles-while-fwd_002dsentence">Los bucles <code>while</code></a></li>
- <li><a name="toc-La-busqueda-de-expresiones-regulares" href="#Volver-a-buscar-la-frase-en-sentido-directo">La b&uacute;squeda de expresiones regulares</a></li>
- </ul></li>
- <li><a name="toc-forward_002dparagraph_003a-una-mina-de-oro-de-funciones" href="#forward_002dparagraph">12.4 <code>forward-paragraph</code>: una mina de oro de funciones</a>
- <ul class="no-bullet">
- <li><a name="toc-Definicion-de-funcion-forward_002dparagraph" href="#forward_002dparagraph-en-breve">Definici&oacute;n de funci&oacute;n <code>forward-paragraph</code></a></li>
- <li><a name="toc-La-expresion-let_002a" href="#fwd_002dpara-let">La expresi&oacute;n <code>let*</code></a></li>
- <li><a name="toc-El-bucle-while-hacia-adelante" href="#fwd_002dpara-while">El bucle <code>while</code> hacia adelante</a></li>
- </ul></li>
- <li><a name="toc-Crea-tu-propio-fichero-TAGS" href="#etags">12.5 Crea tu propio fichero &lsquo;<tt>TAGS</tt>&rsquo;</a></li>
- <li><a name="toc-Revisar-5" href="#Revisar-regexp">12.6 Revisar</a></li>
- <li><a name="toc-Ejercicios-con-re_002dsearch_002dforward" href="#Ejercicios-re_002dsearch">12.7 Ejercicios con <code>re-search-forward</code></a></li>
- </ul></li>
- <li><a name="toc-Contando_003a-repeticion-y-regexps" href="#Contando-palabras">13 Contando: repetici&oacute;n y regexps</a>
- <ul class="no-bullet">
- <li><a name="toc-Contando-palabras-1" href="#Por-qu_00e9-Contar-Palabras">Contando palabras</a></li>
- <li><a name="toc-La-funcion-count_002dwords_002dexample" href="#count_002dwords_002dexample">13.1 La funci&oacute;n <code>count-words-example</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Disenando-count_002dwords_002dexample" href="#Dise_00f1ar-count_002dwords_002dexample">Dise&ntilde;ando <code>count-words-example</code></a></li>
- <li><a name="toc-El-error-de-espacio-en-blanco-en-count_002dwords_002dexample" href="#Error-de-espacio-en-blanco">13.1.1 El error de espacio en blanco en <code>count-words-example</code></a></li>
- </ul></li>
- <li><a name="toc-Cuenta-palabras-recursivamente" href="#recursive_002dcount_002dwords">13.2 Cuenta palabras recursivamente</a></li>
- <li><a name="toc-Ejercicio_003a-contando-puntuacion" href="#Ejercicio-de-Contar">13.3 Ejercicio: contando puntuaci&oacute;n</a></li>
- </ul></li>
- <li><a name="toc-Contando-palabras-en-una-defun" href="#Palabras-en-una-funci_00f3n">14 Contando palabras en una <code>defun</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Divide-y-venceras" href="#Divide-y-vencer_00e1s">Divide y vencer&aacute;s</a></li>
- <li><a name="toc-_00bfQue-contar_003f" href="#Palabras-y-S_00edmbolos">14.1 &iquest;Qu&eacute; contar?</a></li>
- <li><a name="toc-_00bfQue-constituye-una-palabra-o-simbolo_003f" href="#Sintaxis">14.2 &iquest;Qu&eacute; constituye una palabra o s&iacute;mbolo?</a></li>
- <li><a name="toc-La-funcion-count_002dwords_002din_002ddefun" href="#count_002dwords_002din_002ddefun">14.3 La funci&oacute;n <code>count-words-in-defun</code></a></li>
- <li><a name="toc-Contar-varias-defuns-en-un-fichero" href="#Varias-funciones">14.4 Contar varias <code>defuns</code> en un fichero</a></li>
- <li><a name="toc-Encontrar-un-fichero-1" href="#Encontrar-un-fichero">14.5 Encontrar un fichero</a></li>
- <li><a name="toc-lengths_002dlist_002dfile-en-detalle" href="#lengths_002dlist_002dfile">14.6 <code>lengths-list-file</code> en detalle</a></li>
- <li><a name="toc-Contar-palabras-en-defuns-en-diferentes-ficheros" href="#Varios-ficheros">14.7 Contar palabras en <code>defuns</code> en diferentes ficheros</a>
- <ul class="no-bullet">
- <li><a name="toc-Determina-las-longitudes-de-defuns" href="#lengths_002dlist_002dmany_002dfiles">Determina las longitudes de <code>defuns</code></a></li>
- <li><a name="toc-La-funcion-append" href="#append">14.7.1 La funci&oacute;n <code>append</code></a></li>
- </ul></li>
- <li><a name="toc-Recursivamente-cuenta-palabras-en-diferentes-ficheros" href="#Varios-ficheros-recursivamente">14.8 Recursivamente cuenta palabras en diferentes ficheros</a></li>
- <li><a name="toc-Preparar-los-datos-para-mostrarlos-en-un-grafo" href="#Preparar-los-datos">14.9 Preparar los datos para mostrarlos en un grafo</a>
- <ul class="no-bullet">
- <li><a name="toc-El-dato-para-mostrar-en-detalle" href="#Datos-para-mostrar-en-detalle">El dato para mostrar en detalle</a></li>
- <li><a name="toc-Ordenando-listas" href="#Ordenando">14.9.1 Ordenando listas</a></li>
- <li><a name="toc-Creando-una-lista-de-ficheros" href="#Listar-ficheros">14.9.2 Creando una lista de ficheros</a></li>
- <li><a name="toc-Contando-definiciones-de-funcion" href="#Contando-definiciones-de-funci_00f3n">14.9.3 Contando definiciones de funci&oacute;n</a></li>
- </ul>
-</li>
- </ul></li>
- <li><a name="toc-Leyendo-un-grafo-1" href="#Leyendo-un-grafo">15 Leyendo un grafo</a>
- <ul class="no-bullet">
- <li><a name="toc-Imprimiendo-las-columnas-de-un-grafo" href="#Columnas-de-un-grafo">Imprimiendo las columnas de un grafo</a></li>
- <li><a name="toc-La-funcion-graph_002dbody_002dprint" href="#graph_002dbody_002dprint">15.1 La funci&oacute;n <code>graph-body-print</code></a></li>
- <li><a name="toc-La-funcion-recursive_002dgraph_002dbody_002dprint" href="#recursive_002dgraph_002dbody_002dprint">15.2 La funci&oacute;n <code>recursive-graph-body-print</code></a></li>
- <li><a name="toc-Necesidad-para-ejes-impresos" href="#Ejes-Impresos">15.3 Necesidad para ejes impresos</a></li>
- <li><a name="toc-Ejercicio-3" href="#Ejercicio-de-L_00ednea-de-Grafo">15.4 Ejercicio</a></li>
- </ul></li>
- <li><a name="toc-Tu-fichero-_002eemacs" href="#Inicializaci_00f3n-de-Emacs">16 Tu fichero &lsquo;<tt>.emacs</tt>&rsquo;</a>
- <ul class="no-bullet">
- <li><a name="toc-Configuracion-por-defecto-de-Emacs" href="#Configuraci_00f3n-por-defecto">Configuraci&oacute;n por defecto de Emacs</a></li>
- <li><a name="toc-Fichero-de-inicializacion-site_002dwide" href="#Site_002dwide-Init">16.1 Fichero de inicializaci&oacute;n site-wide</a></li>
- <li><a name="toc-Especificar-variables-usando-defcustom" href="#defcustom">16.2 Especificar variables usando <code>defcustom</code></a></li>
- <li><a name="toc-Empieza-por-un-fichero-_002eemacs" href="#Empezando-un-fichero-_002eemacs">16.3 Empieza por un fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></li>
- <li><a name="toc-Modo-texto-y-auto-relleno" href="#Texto-y-Autorelleno">16.4 Modo texto y auto relleno</a></li>
- <li><a name="toc-Alias-de-correo-1" href="#Alias-de-correo">16.5 Alias de correo</a></li>
- <li><a name="toc-Indentar-modo-de-tabulaciones-1" href="#Indentar-modo-de-tabulaciones">16.6 Indentar modo de tabulaciones</a></li>
- <li><a name="toc-Algunos-atajos" href="#Atajos-de-teclado">16.7 Algunos atajos</a></li>
- <li><a name="toc-Mapas-de-teclado-1" href="#Mapas-de-teclado">16.8 Mapas de teclado</a></li>
- <li><a name="toc-Cargando-ficheros-1" href="#Cargando-ficheros">16.9 Cargando ficheros</a></li>
- <li><a name="toc-Autoloading" href="#Autocarga">16.10 Autoloading</a></li>
- <li><a name="toc-Una-extension-simple_003a-line_002dto_002dtop_002dof_002dwindow" href="#Extensi_00f3n-simple">16.11 Una extensi&oacute;n simple: <code>line-to-top-of-window</code></a></li>
- <li><a name="toc-Colores-X11-1" href="#Colores-X11">16.12 Colores X11</a></li>
- <li><a name="toc-Configuraciones-miscelaneas-para-un-fichero-_002eemacs" href="#Miscel_00e1nea">16.13 Configuraciones miscel&aacute;neas para un fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></li>
- <li><a name="toc-Una-linea-modificada" href="#Mode-Line">16.14 Una l&iacute;nea modificada</a></li>
- </ul></li>
- <li><a name="toc-Depurando-1" href="#Depurando">17 Depurando</a>
- <ul class="no-bullet">
- <li><a name="toc-depurar-1" href="#depurar">17.1 <code>depurar</code></a></li>
- <li><a name="toc-debug_002don_002dentry-1" href="#debug_002don_002dentry">17.2 <code>debug-on-entry</code></a></li>
- <li><a name="toc-debug_002don_002dquit-y-_0028debug_0029" href="#debug_002don_002dquit">17.3 <code>debug-on-quit</code> y <code>(debug)</code></a></li>
- <li><a name="toc-El-depurador-de-nivel-de-fuentes-edebug" href="#edebug">17.4 El depurador de nivel de fuentes <code>edebug</code></a></li>
- <li><a name="toc-Ejercicios-de-depuracion" href="#Ejercicios-de-depuraci_00f3n">17.5 Ejercicios de depuraci&oacute;n</a></li>
- </ul></li>
- <li><a name="toc-Conclusion" href="#Conclusi_00f3n">18 Conclusi&oacute;n</a></li>
- <li><a name="toc-La-funcion-the_002dthe" href="#the_002dthe">Appendix A La funci&oacute;n <code>the-the</code></a></li>
- <li><a name="toc-Manejando-el-anillo-de-la-muerte" href="#Kill-Ring">Appendix B Manejando el anillo de la muerte</a>
- <ul class="no-bullet">
- <li><a name="toc-Que-hace-el-anillo-de-la-muerte" href="#Qu_00e9-hace-el-anillo-de-la-muerte">Qu&eacute; hace el anillo de la muerte</a></li>
- <li><a name="toc-La-funcion-current_002dkill" href="#current_002dkill">B.1 La funci&oacute;n <code>current-kill</code></a>
- <ul class="no-bullet">
- <li><a name="toc-El-codigo-current_002dkill" href="#C_00f3digo-para-current_002dkill">El c&oacute;digo <code>current-kill</code></a></li>
- <li><a name="toc-current_002dkill-en-outline" href="#Comprendiendo-current_002dkill"><code>current-kill</code> en outline</a>
- <ul class="no-bullet">
- <li><a name="toc-El-cuerpo-de-current_002dkill" href="#Cuerpo-de-current_002dkill">El cuerpo de <code>current-kill</code></a></li>
- <li><a name="toc-Disgresion-acerca-de-la-palabra-_0060error_0027" href="#Disgresi_00f3n-concerniente-de-error">Disgresi&oacute;n acerca de la palabra &lsquo;error&rsquo;</a></li>
- <li><a name="toc-Determinando-el-elemento-1" href="#Determinando-el-elemento">Determinando el elemento</a></li>
- </ul>
-</li>
- </ul></li>
- <li><a name="toc-pegar-1" href="#pegar">B.2 <code>pegar</code></a></li>
- <li><a name="toc-yank_002dpop-1" href="#yank_002dpop">B.3 <code>yank-pop</code></a></li>
- <li><a name="toc-El-fichero-ring_002eel" href="#fichero-anillo">B.4 El fichero &lsquo;<tt>ring.el</tt>&rsquo;</a></li>
- </ul></li>
- <li><a name="toc-Un-grafo-con-ejes-etiquetados" href="#Grafo-completo">Appendix C Un grafo con ejes etiquetados</a>
- <ul class="no-bullet">
- <li><a name="toc-Grafo-de-ejemplo-etiquetado" href="#Ejemplo-etiquetado">Grafo de ejemplo etiquetado</a></li>
- <li><a name="toc-La-varlist-print_002dgraph" href="#print_002dgraph-Varlist">C.1 La varlist <code>print-graph</code></a></li>
- <li><a name="toc-La-funcion-print_002dY_002daxis" href="#print_002dY_002daxis">C.2 La funci&oacute;n <code>print-Y-axis</code></a>
- <ul class="no-bullet">
- <li><a name="toc-La-funcion-print_002dY_002daxis-en-detalle" href="#print_002dY_002daxis-en-Detalle">La funci&oacute;n <code>print-Y-axis</code> en detalle</a></li>
- <li><a name="toc-_00bfA-que-altura-se-deberia-etiquetar_003f" href="#Altura-de-etiqueta">&iquest;A qu&eacute; altura se deber&iacute;a etiquetar?</a></li>
- <li><a name="toc-Viaje-lateral_003a-Calcula-un-resto" href="#Calcular-un-resto">C.2.1 Viaje lateral: Calcula un resto</a></li>
- <li><a name="toc-Construye-un-elemento-del-eje-Y" href="#Elemento-del-Eje-Y">C.2.2 Construye un elemento del eje Y</a></li>
- <li><a name="toc-Crea-un-eje-de-la-columna-Y" href="#Y_002daxis_002dcolumn">C.2.3 Crea un eje de la columna Y</a></li>
- <li><a name="toc-La-version-no-demasiado-final-de-print_002dY_002daxis" href="#Pen_00faltimo-print_002dY_002daxis">C.2.4 La versi&oacute;n no demasiado final de <code>print-Y-axis</code></a></li>
- </ul></li>
- <li><a name="toc-La-funcion-print_002dX_002daxis" href="#print_002dX_002daxis">C.3 La funci&oacute;n <code>print-X-axis</code></a>
- <ul class="no-bullet">
- <li><a name="toc-Similaridades-y-diferencias" href="#Diferencias-similares">Similaridades y diferencias</a></li>
- <li><a name="toc-Eje-X-marca-tic-1" href="#Eje-X-marca-tic">C.3.1 Eje X marca tic</a></li>
- </ul></li>
- <li><a name="toc-Imprimiendo-el-grafo-completo" href="#Imprimir-Grafo-Entero">C.4 Imprimiendo el grafo completo</a>
- <ul class="no-bullet">
- <li><a name="toc-Cambios-para-la-version-final" href="#La-versi_00f3n-final">Cambios para la versi&oacute;n final</a></li>
- <li><a name="toc-Testeando-print_002dgraph" href="#Testear-print_002dgraph">C.4.1 Testeando <code>print-graph</code></a></li>
- <li><a name="toc-Creando-graficas-de-numeros-de-palabras-y-simbolos" href="#Graficar-palabras-en-funciones">C.4.2 Creando gr&aacute;ficas de n&uacute;meros de palabras y s&iacute;mbolos</a></li>
- <li><a name="toc-Una-expresion-lambda_003a-Anonimicidad-util" href="#lambda">C.4.3 Una expresi&oacute;n <code>lambda</code>: Anonimicidad &uacute;til</a></li>
- <li><a name="toc-La-funcion-mapcar" href="#mapcar">C.4.4 La funci&oacute;n <code>mapcar</code></a></li>
- <li><a name="toc-Otro-error-_2026-mas-insidioso" href="#Otro-Error">C.4.5 Otro error &hellip; m&aacute;s insidioso</a></li>
- <li><a name="toc-El-grafico-impreso" href="#Grafo-impreso-final">C.4.6 El gr&aacute;fico impreso</a></li>
- </ul>
-</li>
- </ul></li>
- <li><a name="toc-Software-Libre-y-Manuales-Libres-1" href="#Software-Libre-y-Manuales-Libres">Appendix D Software Libre y Manuales Libres</a></li>
- <li><a name="toc-GNU-Free-Documentation-License-1" href="#GNU-Free-Documentation-License">Appendix E GNU Free Documentation License</a></li>
- <li><a name="toc-Indice" href="#g_t_00cdndice">&Iacute;ndice</a></li>
- <li><a name="toc-Acerca-del-Autor-1" href="#Acerca-del-Autor">Acerca del Autor</a></li>
-</ul>
-</div>
-<hr>
-<a name="SEC_Overview"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<h1>Resumen del Contenido</h1>
-
-<div class="shortcontents">
-<ul class="no-bullet">
-<li><a name="stoc-Prefacio-1" href="#Prefacio">Prefacio</a></li>
-<li><a name="stoc-Procesamiento-de-listas-1" href="#Procesamiento-de-listas">1 Procesamiento de listas</a></li>
-<li><a name="stoc-Practicando-evaluacion" href="#Practicando-evaluaci_00f3n">2 Practicando evaluaci&oacute;n</a></li>
-<li><a name="stoc-Como-escribir-definiciones-de-funciones" href="#Escribiendo-funciones">3 C&oacute;mo escribir definiciones de funciones</a></li>
-<li><a name="stoc-Unas-pocas-funciones-de-buffer-relacionadas" href="#Un-paseo-a-trav_00e9s-de-los-b_00faffers">4 Unas pocas funciones de buffer relacionadas</a></li>
-<li><a name="stoc-Unas-pocas-funciones-mas-complejas" href="#M_00e1s-complejidad">5 Unas pocas funciones m&aacute;s complejas</a></li>
-<li><a name="stoc-Encogiendo-y-extendiendo-1" href="#Encogiendo-y-extendiendo">6 Encogiendo y extendiendo</a></li>
-<li><a name="stoc-car_002c-cdr_002c-cons_003a-Funciones-fundamentales" href="#Car-cdr-y-cons">7 <code>car</code>, <code>cdr</code>, <code>cons</code>: Funciones fundamentales</a></li>
-<li><a name="stoc-Cortando-y-almacenando-texto-1" href="#Cortando-y-almacenando-texto">8 Cortando y almacenando texto</a></li>
-<li><a name="stoc-Como-las-listas-se-implementan" href="#Implementaci_00f3n-de-listas">9 C&oacute;mo las listas se implementan</a></li>
-<li><a name="stoc-Pegando-texto" href="#Pegando">10 Pegando texto</a></li>
-<li><a name="stoc-Bucles-y-recursion" href="#Bucles-y-recursi_00f3n">11 Bucles y recursi&oacute;n</a></li>
-<li><a name="stoc-Busquedas-de-expresiones-regulares" href="#Buscar-regexp">12 B&uacute;squedas de expresiones regulares</a></li>
-<li><a name="stoc-Contando_003a-repeticion-y-regexps" href="#Contando-palabras">13 Contando: repetici&oacute;n y regexps</a></li>
-<li><a name="stoc-Contando-palabras-en-una-defun" href="#Palabras-en-una-funci_00f3n">14 Contando palabras en una <code>defun</code></a></li>
-<li><a name="stoc-Leyendo-un-grafo-1" href="#Leyendo-un-grafo">15 Leyendo un grafo</a></li>
-<li><a name="stoc-Tu-fichero-_002eemacs" href="#Inicializaci_00f3n-de-Emacs">16 Tu fichero &lsquo;<tt>.emacs</tt>&rsquo;</a></li>
-<li><a name="stoc-Depurando-1" href="#Depurando">17 Depurando</a></li>
-<li><a name="stoc-Conclusion" href="#Conclusi_00f3n">18 Conclusi&oacute;n</a></li>
-<li><a name="stoc-La-funcion-the_002dthe" href="#the_002dthe">Appendix A La funci&oacute;n <code>the-the</code></a></li>
-<li><a name="stoc-Manejando-el-anillo-de-la-muerte" href="#Kill-Ring">Appendix B Manejando el anillo de la muerte</a></li>
-<li><a name="stoc-Un-grafo-con-ejes-etiquetados" href="#Grafo-completo">Appendix C Un grafo con ejes etiquetados</a></li>
-<li><a name="stoc-Software-Libre-y-Manuales-Libres-1" href="#Software-Libre-y-Manuales-Libres">Appendix D Software Libre y Manuales Libres</a></li>
-<li><a name="stoc-GNU-Free-Documentation-License-1" href="#GNU-Free-Documentation-License">Appendix E GNU Free Documentation License</a></li>
-<li><a name="stoc-Indice" href="#g_t_00cdndice">&Iacute;ndice</a></li>
-<li><a name="stoc-Acerca-del-Autor-1" href="#Acerca-del-Autor">Acerca del Autor</a></li>
-</ul>
-</div>
-<hr>
-<a name="SEC_About"></a>
-<table class="header" cellpadding="1" cellspacing="1" border="0">
-<tr><td valign="middle" align="left">[<a href="#Top" title="Portada del documento">Arriba</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_Contents" title="&Iacute;ndice general">&Iacute;ndice general</a>]</td>
-<td valign="middle" align="left">[<a href="#g_t_00cdndice" title="&Iacute;ndice">&Iacute;ndice</a>]</td>
-<td valign="middle" align="left">[<a href="#SEC_About" title="Acerca de (p&aacute;gina de ayuda)"> ? </a>]</td>
-</tr></table>
-<h1>Acerca de este documento</h1>
-
-<p>
- Este documento se gener&oacute; el <i>el 28 febrero 2026</i> utilizando <a href="http://www.nongnu.org/texi2html/"><i>texi2html 5.0</i></a>.
-</p>
-<p>
- Los botones de los paneles de navegaci&oacute;n tienen el significado siguiente:
-</p>
-<table border="1">
- <tr>
- <th> Bot&oacute;n </th>
- <th> Nombre </th>
- <th> Ir a </th>
- <th> Desde 1.2.3 ir a</th>
- </tr>
- <tr>
- <td align="center"> [ &lt;&lt; ] </td>
- <td align="center">Retroceso r&aacute;pido</td>
- <td>Inicio de este cap&iacute;tulo o cap&iacute;tulo anterior</td>
- <td>1</td>
- </tr>
- <tr>
- <td align="center"> [ &lt; ] </td>
- <td align="center">Atr&aacute;s</td>
- <td>Secci&oacute;n anterior en orden de lectura</td>
- <td>1.2.2</td>
- </tr>
- <tr>
- <td align="center"> [ Subir ] </td>
- <td align="center">Subir</td>
- <td>Subir secci&oacute;n</td>
- <td>1.2</td>
- </tr>
- <tr>
- <td align="center"> [ &gt; ] </td>
- <td align="center">Adelante</td>
- <td>Secci&oacute;n siguiente en orden de lectura</td>
- <td>1.2.4</td>
- </tr>
- <tr>
- <td align="center"> [ &gt;&gt; ] </td>
- <td align="center">Avance r&aacute;pido</td>
- <td>Cap&iacute;tulo siguiente</td>
- <td>2</td>
- </tr>
- <tr>
- <td align="center"> [Arriba] </td>
- <td align="center">Arriba</td>
- <td>Portada del documento</td>
- <td> &nbsp; </td>
- </tr>
- <tr>
- <td align="center"> [&Iacute;ndice general] </td>
- <td align="center">&Iacute;ndice general</td>
- <td>&Iacute;ndice general</td>
- <td> &nbsp; </td>
- </tr>
- <tr>
- <td align="center"> [&Iacute;ndice] </td>
- <td align="center">&Iacute;ndice</td>
- <td>&Iacute;ndice</td>
- <td> &nbsp; </td>
- </tr>
- <tr>
- <td align="center"> [ ? ] </td>
- <td align="center">Acerca de</td>
- <td>Acerca de (p&aacute;gina de ayuda)</td>
- <td> &nbsp; </td>
- </tr>
-</table>
-
-<p>
- donde el <strong> Ejemplo </strong> supone que la posici&oacute;n actual est&aacute; en la <strong> Sub-subsecci&oacute;n uno-dos-tres </strong> de un documento de la estructura siguiente:
-</p>
-
-<ul>
- <li> 1. Secci&oacute;n Uno
- <ul>
- <li>1.1 Subsecci&oacute;n uno-uno
- <ul>
- <li>...</li>
- </ul>
- </li>
- <li>1.2 Subsecci&oacute;n uno-dos
- <ul>
- <li>1.2.1 Sub-subsecci&oacute;n uno-dos-uno</li>
- <li>1.2.2 Sub-subsecci&oacute;n uno-dos-dos</li>
- <li>1.2.3 Sub-subsecci&oacute;n uno-dos-tres &nbsp; &nbsp;
- <strong>&lt;== Posici&oacute;n actual </strong></li>
- <li>1.2.4 Sub-subsecci&oacute;n uno-dos-cuatro</li>
- </ul>
- </li>
- <li>1.3 Subsecci&oacute;n uno-tres
- <ul>
- <li>...</li>
- </ul>
- </li>
- <li>1.4 Subsecci&oacute;n uno-cuatro</li>
- </ul>
- </li>
-</ul>
-
-<hr>
-<p>
- <font size="-1">
- Este documento se gener&oacute; el <i>el 28 febrero 2026</i> utilizando <a href="http://www.nongnu.org/texi2html/"><i>texi2html 5.0</i></a>.
- </font>
- <br>
-
-</p>
-</body>
-</html>
diff --git a/emacs-lisp-intro-es.pdf b/emacs-lisp-intro-es.pdf
deleted file mode 100644
index 53910db..0000000
--- a/emacs-lisp-intro-es.pdf
+++ /dev/null
Binary files differ