Introducción a la definición de funciones
En Elisp, una función se define mediante el macro defun. Este macro permite asociar un nombre a un bloque de código que se ejecuta cuando se invoca la función. La estructura básica incluye el nombre de la función, una lista de parámetros, una cadena de documentación opcional, una declaración interactive ocpional y el cuerpo de la función.
Ejemplo de una función simple que calcula el cuadrado de un número:
(defun calcular-cuadrado (numero)
"Devuelve el cuadrado de NUMERO."
(* numero numero))
Los parámetros actúan como variables locales dentro de la función. Por ejemplo, al llamar (calcular-cuadrado 4), se obtiene 16.
Instalación de definiciones de funciones
Para que una función esté disponible en Emacs, debe evaluarse su definición. Esto se logra colocando el cursor después de la última paréntesis y ejecutando C-x C-e. Una vez evaluada, la función permanece instalada hasta que se cierre Emacs. Para persistencia, se puede añadir el código al archivo .emacs o cargarlo mediante load.
Para modificar una función, basta con redefinirla y volver a evaluarla.
Funciones interactivas
Las funciones interactivas se pueden invocar con M-x nombre-de-función o mediante atajos de teclado. Para hacer una función interactiva, se incluye la forma interactive después de la documentación.
Ejemplo de una función interactiva que multiplica un número por cinco:
(defun multiplicar-por-cinco (num)
"Multiplica NUM por cinco."
(interactive "nNúmero a multiplicar: ")
(message "Resultado: %d" (* num 5)))
La cadena "nNúmero a multiplicar: " especifica que se debe solicitar un número al usuario.
Expresiones let
La forma let permite definir variables locales con valores iniciales. Esto evita conflictos con variables globales.
Ejemplo:
(let ((x 10)
(y 20))
(+ x y)) ; Devuelve 30
Las variables definidas con let solo son accesibles dentro del cuerpo de la expresión. Si no se proporciona un valor inicial, se asigna nil.
Forma condicional if
La forma if evalúa una condición y ejecuta diferentes expresiones según el resultado. Cualquier valor distinto de nil se considera verdadero.
Ejemplo:
(defun verificar-positivo (num)
"Verifica si NUM es positivo."
(if (> num 0)
(message "Positivo")
(message "No positivo")))
Se puede añadir una cláusula else para manejar el caso falso.
save-excursion
La forma save-excursion guarda y restarua la posición del cursor y el búfer actual. Es útil para evitar movimientos inesperados del cursor durante la ejecución del código.
Ejemplo:
(save-excursion
(goto-char (point-min))
(forward-line 5))
Este código mueve el cursor al inicio del búfer, avanza cinco líneas y luego restaura la posición original.
Funciones útiles
point: devuelve la posición actual del cursor.buffer-name: devuelve el nombre del búfer actual.message: muestra un mensaje en el área de eco.setq: asigna un valor a una variable.
Ejercicios
1. Escriba una función no interactiva que reciba un número y devuelva su triple. Luego, conviértala en una función interactiva.
2. Escriba una función que verifqiue si fill-column es mayor que un argumento dado y muestre un mensaje apropiado.