parent nodes: Lisp | ListasLisp
Va encerrada entre paréntesis
Separa sus elementos atoms con espacios en blanco
Datos y programas son siempre listas de palabras, de números o listas de otras listas
Una palabra (o un número) es un elemento indivisible atom de una lista, pues no tiene espacios en medio
La representación impresa de una lista o de sus átomos es llamada symbolic expression o s-expression
No importa la cantidad de espacio en blanco entre elementos
Ejemplos: '(rose violet daisy buttercup)
'(rose violet daisy buttercup)
'(rose
violet
daisy
buttercup)
'(+ 5 7) un símbolo y dos números
'(this list has (a list inside of it))
'() empty list
Estas no son listas '(uno, dos, tres) no es lista por que tiene comas
'(Hola. Adios) no es lista por que tiene punto
Atoms
Números: 1 322 1234
Símbolos: '+' 'foo' 'forward-line'
Cadenas: Texto entre comillas dobles: "hola, qué tal?"
Evaluar una lista
Evaluar en lisp significa ejecutar
Para ejecutar en emacs hay que ponerse después del paréntesis de cierre y pulsar C-x C-e
Cada lista es un programa listo para evaluar con tres opciones:
Hacer nada, sólo devolver la lista,
Devolver un mensaje de error,
Tratar el primer símbolo de la lista como una orden (función) para hacer algo
Si la lista está precedida por un apóstrofe quote la lista es literal, no se hará nada con ella más que tomarla tal y como es. Por lo tanto al evaluar: '(+ 2 5) devolverá la misma lista
Si no empieza con un apóstrofe entonces mira el primer símbolo: (+ 2 5) devuelve 7
'(hola adiós hasta luego)
Devuelve: (hola adiós hasta luego)
(+ 2 3)
Devuelve: 5
Errores
(esto da error)
Debugger entered--Lisp error: (void-function esto)
(esto da error)
eval((esto da error))
eval-last-sexp-1(nil)
eval-last-sexp(nil)
call-interactively(eval-last-sexp)
recursive-edit()
byte-code("ऀ䀀윀=Ħ
Los errores se abren en un buffer llamado Backtrace por que escribe hacia atrás en forma de pila
Se cierra el backtrace con la tecla q
C-x C-e es la abreviatura de la orden eval-last-sexp (evaluate last symbolic expression)
La primera línea del error: Debugger entered--Lisp error: (void-function esto) indica que la función esto no está definida.
Nombres de símbolos y definición de funciones
Symbol es como decir función o procedimiento (creo)
Un símbolo como + no son las instrucciones para sumar, sino el modo de localizar la definición o el conjunto de instrucciones.
En Lisp un mismo conjunto de instrucciones puede tener distintos nombres al mismo tiempo. plus, es igual que +
Pero un nombre sólo puede tener asociado un conjunto de instrucciones determinado en un momento dado. Sino no se sabría qué ejecutar al hacer la llamada. P.ej. dos funciones distintas de C++ con el mismo nombre y mismos parámetros.
Se acostumbra a poner prefijos a los símbolos, p.ej.: los nombres de funciones que trabajan con Texinfo empiezan con 'texinfo-' y las que leen mail por 'rmail-'
The Lisp interpreter
Secuencia de ejecución del intérprete de Lisp al evaluar una lista:
Mira si empieza por apóstrofe '
Si es así devuelve la misma lista.
Si no es así, busca si el primer elemento de la lista tiene una definición de función.
Si es así sigue las instrucciones de la función.
Si no es así imprime un mensaje de error.
Al final devuelve un valor con el resultado
Al mismo tiempo que devuelve un valor puede hacer otras cosas: mover el cursor, copiar archivos, etc, estas acciones son llamadas side effect
Complicando un poco
Además de listas Lisp puede ejecutar símbolos que no son listas ni llevan apóstrofe, los trata como variables (más adelante)
Algunas funciones son especiales y funcionan de forma distinta, se llaman special forms no hay demasiadas, se usan para trabajos especiales también lo veremos más adelante.
Otra cosa, cuando hay listas con listas anidadas se evaluan de dentro hacia afuera, es decir, primero las de nivel más profundo y por último la lista primera. El resultado de las internas se usa como entrada de las listas superiores:
Place your cursor after the following expression and type
`C-x C-e':
(+ 2 (+ 3 3))
8
Primero evalua (+ 3 3) y luego evalua (+2 6) dando como resultado 8
Byte Compiling
Lisp puede ejecutar código legible por humanos y código máquina compilado.
El código compilado se ejecuta más rápido que el código legible
You can transform humanly readable code into byte compiled code by running one of the compile commands such as byte-compile-file
Byte compiled code is usually stored in a file that ends with a `.elc' extension
Human ends with a `.el' extension.
For most things you might do to customize or extend Emacs, you do not need to byte compile
Variables
A symbol can have both a function definition and a value attached to it at the same time.
fill-column si se evalúa tiene un valor de 77 (en cada buffer puede ser distinto)
Se puede to bind una variable a un valor o a una función usando set o setq
Si evaluamos fill-column sin paréntesis, se evalua la variable y devuelve el contenido
Si evaluamos (fill-column) con paréntesis, lo interpreta como el primer parámetro de una lista, es decir, como una función.
Como no existe la función llamada fill-column da un error: void-function fill-column
Si se evalúa una función (que no es una variable) como si fuera una variable, por ejemplo evaluando + da el error: void-variable +
Argumentos
Son los elementos del núm 2 al final de una lista en la que el primer elemento es una función
Siempre son átomos, es decir, si queremos pasar una cadena debe ir entre comillas dobles
Se puede usar variables o funciones como argumentos: pej. (+ 2 fill-column) = (+ 2 77) = 79
La restricción a esto último es que debe devolver un valor del tipo correcto para la función, en el caso de + se requiere un número. En este otro ejemplo concat necesita una cadena: (concat "The " (number-to-string (+ 2 fill-column)) " red foxes.") = "The 79 red foxes."
Algunas funciones como + pueden tener un número variable de argumentos (+ 3 4 5 ) = 12
Error de argumento de tipo incorrecto: (+ 2 'hello) --> (wrong-type-argument number-or-marker-p hello) esto es por que + quiere sólo números y 'hello devuelve la cadena "hello".
+ acepta también marcadores marker (pues se traducen a números) un marcador es pej. el inicio de un bloque de selección creado con C-.
La letra p indica predicate es decir es una función booleana que retorna t o nil (true o false resp) cuando el argumento es o no es un numero o un marcador.
zerop es una función que devuelve t si el argumento que se le pasa es cero o tiene el valor cero
Función message
message escribe mensajes en el echo área: (message "This message appears in the echo area!")
Permite formateo a lo c:
(message "The name of this buffer is: %s." (buffer-name))
(message "The value of fill-column is %d." fill-column)
(message "There are %d %s in the office!" (- fill-column 14) "pink elephants")
(message "He saw %d %s"
(- fill-column 32)
(concat "red "
(substring
"The quick brown foxes jumped." 16 21)
" leaping."))
Se puede usar %s para imprimir un número (no es específico).
%d sólo imprime la parte entera de un número, para 2 decimales usar %.2f
Dar valor a una variable
Se llama to bind
Se usa las funciones: set, setq o let::
set
Da a la variable flowers una lista con nombres de flowers
(set 'flowers '(rose violet daisy buttercup))
Al evaluar la línea anterior se muestra la lista como resultado, es un efecto colateral. In many cases, a function's primary purpose is to create a side effect.
La asociación de la lista a la variable es un efecto lateral de la función set
Hay que poner el apóstrofe delante de la variable y delante de la lista. Si no se pone se intentará evaluar como funciones y dará error.
El apóstrofe se denomina quote y siempre hay que ponerlo en el primer argumento de set
setq
Es la combinación de set quote es decir hace lo mismo que set pero no es necesario poner el apóstrofe al primer argumento, lo hace automáticamente:
(setq carnivores '(lion tiger leopard))
También permite añadir varios valores a varias variables en una misma instrucción:
(setq trees '(pine fir oak maple)
herbivores '(gazelle antelope zebra))
Contando
Para contar las veces que se ejecuta un bucle
1. First set a variable to zero;
2. then add one to the number each time the program repeats itself.
3. you need a variable that serves as a counter, and two expressions: an initial `setq' expression
that sets the counter variable to zero; and a second `setq' expression that increments the counter each time it is evaluated. (setq counter 0) ; Let's call this the initializer.
(setq counter (+ counter 1)) ; This is the incrementer.
counter ; This is the counter.
todo.low: Lisp: usar el manual en txt, para cortar y pegar, en el pdf no se puede.