Translate

Mostrando entradas con la etiqueta Tipos. Mostrar todas las entradas
Mostrando entradas con la etiqueta Tipos. Mostrar todas las entradas

sábado, 4 de mayo de 2013

Mas tipos de datos lisp



Listas de Propiedades


Las listas de propiedades (‘plistas’) proporcionan una vía simple pero poderosa de manejar pares de palabras-clave/valores. Una plista es simplemente una lista, con un número par de elementos, donde cada pareja de elementos representa un valor con nombre. Este es un ejemplo de plista:

   > '(:nombre "Gloria" :domicilio "Calle Urquiza 1222, Formosa" :celular "111-111111" :edad 35)

En esta plista, las claves son símbolos de palabras clave, y los valores son cadenas. Las claves en una plista son con mucha frecuencia símbolos de palabras clave. Los símbolos de palabras clave son símbolos cuyos nombres van precedidos por un signo de dos puntos (‘:’), y que son usadas generalmente justo para comparar el símbolo en sí (típicamente no se usan por su valor del símbolo o función del símbolo). Para acceder a los miembros de una plista, CL proporciona la función getf, que toma una plista y una clave:

   > (getf '(:nombre "Gloria" :domicilio "Calle Urquiza 1222, Formosa" :celular "111-111111" :edad 35) :nombre)
   "Gloria"

Es mas cómodo guardar la lista de propiedad en una variable:

   > (set 'registro '(:nombre "Gloria" :domicilio "Calle Urquiza 1222, Formosa" :celular "111-111111" :edad 35))

   > (getf registro :edad)
   35


 

 

 

 

 

 

 

 





 "Oh, Lisp me vuelve tan loca..." (Ai Sayama)

 

 

 

Arrays (Arreglos)


Los arreglos son estructuras de datos que pueden albergar "rejillas" simples (o multi-dimensionales) llenas de valores, que son indexadas por uno o más enteros. Los arreglos soportan un acceso muy rápido a los datos basado en índices de enteros. Se crean arreglos empleando la función constructora make-array y los elementos del arreglo se refieren usando la función de acceso aref. Se pueden establecer elementos individuales en el arreglo usando setf:

     > (set 'array (make-array (list 3 3)))
     #2A((NIL NIL NIL) (NIL NIL NIL) (NIL NIL NIL))
    
     > (setf (aref array 0 0) "David")
     "David"
    
     > (setf (aref array 0 1) "José")
     "José"
    
     > (aref array 0 0)
     "David"
    
     > (aref array 0 1)
     "José"

Observe que luego de la función va el argumento requerido de las dimensiones del array, que debe ser una lista. En el ejemplo anterior se trata de un array de 3 * 3. La función make-array también admite varios argumentos de palabras clave optativos para inicializar el arreglo en el momento de su creación. Uno de ellos es :initial-contents que permite establecer los valores iniciales:

    > (make-array '(4 2 3)
            :initial-contents
            '(((a b c) (1 2 3))
              ((d e f) (3 1 2))
              ((g h i) (2 3 1))
              ((j k l) (0 0 0))))
    #3A(((A B C) (1 2 3)) ((D E F) (3 1 2)) ((G H I) (2 3 1)) ((J K L) (0 0 0)))

Se trata de un array de tres dimensiones: 4 * 2 * 3.
Observe la respuesta del intérprete al crear el array: Comienza con las dimensiones #3A (A es el tipo del array) y luego los elementos como listas anidadas. De esta manera podríamos definir al array sin usar la función make-array:

   > (set 'nuevo-array #3A(((a b c) (1 2 3)) ((d e f) (3 1 2)) ((g h i) (2 3 1)) ((j k l) (0 0 0))))

   > (aref nuevo-array 2 0 1)
   H

   > (setf (aref nuevo-array 3 1 1) "sapo pepe")
   "sapo pepe"

   > nuevo-array
   #3A(((A B C) (1 2 3)) ((D E F) (3 1 2)) ((G H I) (2 3 1)) ((J K L) (0 "sapo pepe" 0)))

Tablas Hash


Una tabla hash es similar a lo que en otros lenguajes es conocido como arreglo asociativo. Es comparable a un array de una dimensión que admite claves que son cualquier objeto CL arbitrario, que serán comparados usando eql. Las tablas hash soportan un rastreo de  datos de tiempo constante, lo que significa que el tiempo que se toma en buscar un elemento en la tabla hash permanecerá estable, incluso si el número de entradas en la tabla se incrementa.
Para trabajar con tablas hash, CL proporciona la función constructora make-hash-table y la función de acceso gethash. Para establecer entradas en una tabla hash se usa el operador setf en conjunción con la función de acceso gethash. setf es una generalización de setq que puede usarse en sitios resultantes de una llamada a función, además de exclusivamente con símbolos como con setq. Este es un ejemplo de creación de una tabla hash, que pone un valor en ella y que recupera un valor de ella:

   > (setq so-clasif (make-hash-table))
   #S(HASH-TABLE :TEST FASTHASH-EQL)

   > (setf (gethash :windows so-clasif) "sin comentarios")
     "sin comentarios"
    
   > (gethash :windows so-clasif)
     "sin comentarios" ;
     T


Observe que la función gethash devuelve dos valores. El primer valor de retorno es el valor correspondiente a la entrada encontrada en la tabla hash, si existiera. El segundo valor de retorno es un valor booleano (T o NIL), que indica si el valor se se encontró de hecho en la tabla hash. Si el valor no se encuentra, el primer valor de retorno será NIL y el segundo será también NIL. Este segundo valor es necesario para distinguir los casos en los que la entrada sí se encuentra en la tabla hash, pero sucede que su valor es precisamente NIL. Existen varias vías para acceder a múltiples valores de retorno de una función, empleando multiple-value-bind y multiple-value-list.

En proximas entregas veremos como trabajar con tablas hash, eliminar registros, guardarla en un archivo, etc.
Mi mujer me dijo que si no llevo dinero a casa, me echa y que va a salir con el carnicero de la esquina. :-(

viernes, 15 de junio de 2012

Tipos de datos en Lisp


Tipos de datos en Lisp:

En Lisp tenemos: números, cadenas de caracteres, listas, símbolos y funciones.

CADENAS DE CARACTERES
Las cadenas de caracteres van entre comillas, como en otros lenguajes:

> “esto es una cadena”
“esto es una cadena”

SIMBOLOS
Los símbolos son espacios de memoria que pueden contener valores tal como lo hacen las variables en otros lenguajes. Sin embargo, aquí un símbolo es algo mas que lo que llamamos variable en otros lenguajes, así como ellas tiene un nombre que es una cadena de caracteres, y puede tener un valor asociado que puede ser un numero, una cadena o una lista. Pero además del espacio de valor, posee otros dos espacios: un espacio de función, y un espacio de lista de propiedades o plist.


Una de las manera de asignar un valor a un símbolo es usando setq:

> (setq x “Hola”)
“Hola”
> (setq y 45)
45

El intérprete siempre evalúa lo que pongamos en el prompt. Si colocamos el símbolo, evaluará y devolverá su valor.

> x
“Hola”

> y
45

Si colocamos cualquier valor, devolverá el valor mismo.

> “Gato”
“Gato”

Si colocamos una función devolverá el resultado luego de evaluarla:

> (cuadrado 3)
9

Para desactivar la evaluación usamos la función quote y nos devolverá el símbolo mismo:

> (quote x)
X

Para simplificar el uso de quote se usa la comilla simple:

> 'x
X

> 'y
Y

LISTAS
Las listas pueden contener números, cadenas, símbolos, funciones y otras listas. Una de las maneras de hacer una lista es desactivando la evaluación:

> '(1 4 56)
(1 4 56)

Pues de lo contrario evaluará a la lista, tomándola como una función:

> (1 4 56)
*** - EVAL: 1 is not a function name; try using a symbol instead

El intérprete intenta tomar a 1 como nombre de una función y el resto serían sus argumentos. Como no se pueden usar números como nombres de función devuelve error.

Otro ejemplo:
> '(cuadrado 4)
(CUADRADO 4)

Como la evaluación está desactivada, el intérprete devuelve la lista formada por el símbolo cuadrado y el número 4. Con la evaluación activa:

> (cuadrado 4)
16

Evalúa la función cuadrado y devuelve el resultado correspondiente.

Otro ejemplo de lista y van...
> '(2.32 -7 4E-5 #C(1 -1) “esta lista es copada” (1 2 3 a) b)
(2.32 -7 “esta lista es copada” (1 2 3 A) B)


NUMEROS
Los números pueden ser enteros, decimales, de coma flotante, fracciones o complejos.

Tipos
Ejemplos
Enteros
> -3
-3
> 5
5
Decimales
> 7.8
7.8
> 3.14159265
3.14159265
Notación Científica
> 4.46E4
44600.0

> 1.65E6
1650000.0
> 7.9E-12
7.9E-12

> 8.2E32
8.2E32
Fracciones
> 2/3
2/3
> -5/8
-5/8
Complejos
El primer valor corresponde a la parte real, el segundo a la imaginaria.
> #C(2 3)
#C(2 3)


> #C(-1 5)
#C(-1 5)

Algunas Operaciones Aritméticas

Operación Aritmética
Ejemplos
Suma
> (+ 1 2)
> 3

> (+ 3.2 7)
10.2
> (+ 3/2 1/5)
17/10

> (+ #C(2 3) #C(1 -5))
#C(3 -2)
Resta
> (- 6 9)
-3
> (- #C(1 1) #C(2 3))
#C(-1 -2)
Multiplicación
> (* 3 4)
12
> (* 2 3 7)
42
División
> (/ 4 -2)
-2
> (/ 15 6)
5/2
Potencia
> (expt 2 3)
8

> (expt 7/8 5)
16807/32768
> (expt #C(4 -1) -2)
#C(15/289 8/289)
Raíz cuadrada
> (sqrt 16)
4


PD: Aquí tengo el libro de Cooper traducido al español:
Técnicas Básicas de Lisp - David Cooper.pdf