Conceptos Fundamentales de LISP
Lisp se distingue por su diseño único basado en expresiones, donde el código y los datos comparten la misma estructura básica: las listas. Este principio se conoce como homoiconicidad y es una de las razones por las que Lisp es tan poderoso.
1. Estructura y Evaluación de Expresiones
En Lisp, todo es una expresión, y las expresiones siguen la forma:
(función argumento1 argumento2 ...)
Cuando una expresión es evaluada, Lisp:
- Evalúa los argumentos de izquierda a derecha.
- Aplica la función al resultado de los argumentos evaluados.
Ejemplo: (+ 1 2 3) ;; Se evalúan primero 1, 2 y 3, y luego se aplica la suma -> 6
2. Átomo vs. Lista
Átomos: Son los elementos más básicos, como números, cadenas o símbolos.
42 ;; Número
"Hola" ;; Cadena
'x ;; Símbolo
Listas: Secuencias de elementos delimitadas por paréntesis.
'(1 2 3) ;; Lista de tres elementos
3. Funciones y Evaluación Diferida
Lisp permite definir funciones usando defun:
(defun cuadrado (x)
(* x x)) ;; La función devuelve el cuadrado de x
(cuadrado 5) ;; Resultado: 25
Soporta funciones de orden superior, lo que significa que puedes pasar funciones como argumentos o devolverlas.
Ejemplo con mapcar (aplica una función a cada elemento de una lista):
(mapcar #'cuadrado '(1 2 3 4)) ;; Resultado: (1 4 9 16)
4. Estructuras de Control
Lisp incluye construcciones para realizar control de flujo, como condicionales y bucles.
Condicionales:
if: Una decisión simple.
(if (> 10 5)
"Mayor"
"Menor")
;; Resultado: "Mayor"
cond: Similar a una estructura if-else múltiple
(cond
((> 10 20) "Mayor que 20")
((> 10 5) "Mayor que 5")
(t "Ninguna condición"))
;; Resultado: "Mayor que 5"
Bucles:
loop: Una forma versátil de iterar
(loop for i from 1 to 5 collect (* i i))
;; Resultado: (1 4 9 16 25)
5. Recursión: Fundamento Teórico
Lisp fue diseñado con énfasis en la recursión. Muchas funciones en Lisp se implementan recursivamente debido a su afinidad con la teoría matemática de funciones.
Ejemplo: Calcular la suma de una lista de números.
(defun suma-lista (lista)
(if (null lista) ;; Caso base: si la lista está vacía
0
(+ (car lista) (suma-lista (cdr lista))))) ;; Suma el primer elemento y recursión sobre el resto
(suma-lista '(1 2 3 4)) ;; Resultado: 10