lenguaje de programación lisp parte 3. 3 primitivas básicas 3.1 primitivas numÉricas 3.2...

21
Lenguaje de Programación LISP Lenguaje de Programación LISP Parte 3 Parte 3

Upload: arturo-cordero-ramos

Post on 25-Jan-2016

235 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Lenguaje de Programación LISPLenguaje de Programación LISPParte 3Parte 3

Page 2: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

3 Primitivas Básicas

3.1 PRIMITIVAS NUMÉRICAS

3.2 PRIMITIVAS DE ASIGNACIÓN

3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

3.3.1 PRIMITIVAS DE ACCESO LISTAS 3.3.2 PRIMITIVAS DE CONSTRUCCIÓN DE LISTAS 3.3.3 OTRAS PRIMITIVAS QUE ACTUAN SOBRE LISTAS

3.4 PREDICADOS

3.4.1 PREDICADOS QUE DISTINGUEN EL TIPO DE DATO 3.4.2 PREDICADO EQUAL 3.4.3 PREDICADOS QUE ACTUAN SOBRE NÚMEROS 3.4.4 PREDICADOS QUE ACTUAN SOBRE LISTAS 3.4.5 FUNCIONES LÓGICAS

3.5 PRIMITIVAS DE DEPURACIÓN

3.5.2 PRIMITIVAS TRACE Y UNTRACE

Puntos a tratar

Page 3: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas Numéricas (I) Trabajan con números y operaciones aritméticas básicas (suma,

resta, multiplicación y división). Utilización de notación prefija.

Función Suma (+): Puede tener cualquier numero de argumentos.

Devuelve como resultado la suma de todos ellos.

En caso de no tener argumentos, devuelve 0.

Ej.: (+ 2 3 4) -> 9

Función Resta (-): Puede tener uno o más argumentos.

Un argumento, devuelve el opuesto de dicho argumento (operación menos unitaria).

Dos argumentos, devuelve el resultado de restar el segundo al primero (operación resta tradicional).

Más de dos argumentos, devuelve el resultado de restar al primer argumento la suma de todos los demás.

(+ 1 1)-> 2

(+ 2)-> 2

(+ )-> 0

Page 4: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas Numéricas (II)Función Resta (-):

Ej.: (- 3) -> - 3

Función Producto (*): Puede tener cero o más argumentos.

A partir de dos, devuelve el resultado de multiplicar de todos ellos.

Un argumento, devuelve el valor del argumento.

Con cero argumentos, devuelve un 1.

Ej.: (* 1 3 2) -> 6

Función División (/): Puede tener uno o dos argumentos. Un argumento, devuelve el resultado de dividir 1 entre dicho

argumento (el inverso del numero al que se aplica). Dos argumento, actúa como la división normal (dividiendo el primer

argumento [dividendo] entre el segundo [divisor]).

(- - 4)-> 4

(- 5 3)-> 2

(- 5 1 2 1 )-> 1

(* 2 2 2 2)-> 16

(* 3)-> 3

(* )-> 1

Page 5: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas Numéricas (III)Función División (/):

Ej.: (/ 2) -> 0,5

Función TRUNCATE: Actúa sobre dos argumentos y devuelve como resultado dos

valores.

El primer valor es el resultado de efectuar la división entera entre su primer argumento y su segundo argumento.

El segundo valor es el resto de esta división (el primer argumento modulo el segundo).

Ej.: (truncate 5 2) -> 2 1

Función MULTIPLE-VALUE-LIST: Agrupa múltiples valores en una lista.

Ej.: (multiple-value-list (truncate 5 2) ) -> (2 1)

(/ 8 2)-> 4

Page 6: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas de Asignación (I)

La función SETQ asigna a un símbolo un valor cualquier. Después de esto el símbolo tiene ligado dicho valor.

Si se evalúa posteriormente el símbolo se devolverá el valor ligado.

SETQ tiene dos argumentos, el primero es un símbolo y el segundo el valor que se desea asignar a dicho símbolo:

(setq símbolo expresión)

Es una función especial por:

a) Es una función de tratamiento especial porque no evalúa todos y cada uno de sus argumentos.

b) Es de efecto lateral porque además de devolver un valor realiza alguna otra cosa más.

Ej1.: (setq A ‘ (1 2 3) ) ->

tratamiento especial:

efecto lateral:

(1 2 3)

No evalúa A, pues o no tiene valor o se le va a cambiar.

A queda ligado a (1 2 3), y se devuelve la lista (1 2 3).

Page 7: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas de Asignación (II)

Ej2.: (setq A (+ 1 2) ) ->

efecto lateral:

A

-> 3 (Al ligar un nuevo valor a A se reemplaza el que anteriormente tuviera)

La función SETQ puede utilizarse también para efectuar varias asignaciones al mismo tiempo:

(setq símbolo1 expresión1 símbolo2 expresión2 ..)

Otra primitiva de asignación: SET

(set símbolo expresión)

a) Puede tener múltiples argumentos.

b) Primero evalúa todos y cada uno de sus argumentos.

c) El resultado de evaluar símbolo debe ser, a su vez, un símbolo, al cual será ligado al resultado de evaluar la expresión.

3

A queda ligado al valor 3, que es el resultado de evaluar (+ 1 2).

Page 8: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas de Asignación (III)

Ej.: (setq A ‘ B )

-> B

(set A ‘ C)

-> C

Si evaluamos a continuación los símbolos A y B:

A -> B

¿Y si no estuviera (setq A ‘ B )?

(set A ‘ C) -> Error

Solución: QUOTE

(set ‘ A ‘ C) -> C

(A no está ligado a otro símbolo).

B -> C

Page 9: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas que actúan sobre Listas (I)

Primitivas de acceso a listas: CAR, CDR, NTH y NTHCDR

La función CAR, admite como único argumento una lista y devuelve como resultado el primer elemento de lista .

La función CDR, admite como único argumento una lista y devuelve como resultado la cola de esa lista (una lista que contiene todos los elementos excepto el primero). Si la lista contiene un único elemento devolverá NIL (lista vacía).

Ej.: (setq L ‘ (A B C))

-> (A B C)

Cuando varios CAR y CDR se componen (máximo 3), se emplea una notación alternativa (comenzar por una C, añadir una A por cada CAR y una D por cada CDR según el orden de aparición, y terminar con una R).

Ej.: (car (cdr (cdr L) ) ) equivale a (caddr L) (cdr (car ‘ ((1 2) 3) ) equivale a (cdar ‘ ((1 2) 3) )

(car L)-> A

(cdr L)-> (B C)

(car ) (cdr L)-> B -> C

(cdr L)(car ) (cdr )

Page 10: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas que actúan sobre Listas (II)

Primitivas de acceso a listas: CAR, CDR, NTH y NTHCDR

La función NTH, devuelve el n-ésimo elemento de una lista (el primer elemento de la lista se identifica con la posición 0).

Sus argumentos son el índice o posición del elemento y la lista.

Equivale a aplicar tantos CAR como indique el índice.

Ej.: (nth 2 ‘ (1 2 3 4) )

-> 3

(nth 0 ‘ (A B C) )

-> A

La función NTHCDR, devuelve el resultado de aplicar tantos CDR como indique el índice, de modo que (NTHCDR 1 L) equivale a (CDR L), (NTHCDR 2 L) equivale a (CDDR L), etc.

Ej.: (nthcdr 2 ‘ (1 2 3 4) )

-> (3 4)

Page 11: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas que actúan sobre Listas (III)

Primitivas de construcción de listas: CONS, LIST y APPEND

La función CONS toma como argumentos un elemento y una lista, y devuelve como resultado la lista que se pasó como parámetro añadiéndole al principio el elemento.

Ej.: (cons ‘ A '(1 2 3) )

-> (A 1 2 3)

(cons ‘ (1 2) ‘ (3 4 5) )

-> ( (1 2) 3 4 5 )

La función LIST puede tener cualquier número de argumentos, y devuelve como resultado una lista construida con todos ellos, de modo que cada argumento será un elemento de la lista.

Ej.: (list ‘ A ‘ B ‘ (C D) 5 )

-> (A B (C D) 5)

(list ‘ CASA )-> (CASA)

(list )-> NIL

Page 12: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas que actúan sobre Listas (IV)

Primitivas de construcción de listas: CONS, LIST y APPEND

La función APPEND toma como argumentos cualquier número de listas, y devuelve una lista construida con los elementos de todas las listas argumentos.

Su funcionamiento es similar al de LIST pero eliminando un nivel de paréntesis (el del primer nivel).

Ej.: (append ‘ (A B) '(C D) )

-> (A B C D)

(append ‘ ( (1 2) 3) ‘ (A) ‘ (B (C)))

-> ( (1 2) 3 A B (C) )

(append NIL)

-> NIL

Page 13: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas que actúan sobre Listas (V)

Otras primitivas: LENGTH, REVERSE, LAST y REMOVE

La función LENGTH, devuelve la longitud de una lista (el número de elementos de la misma).

LENGTH sólo va a contar los elementos del primer nivel.

Ej.: (length ‘ (A B C D) ) -> 4

(length ‘ (A (B C) D) ) -> 3

La función REVERSE tiene como argumento una lista, y devuelve como resultado dicha lista invertida.

La inversión se realiza en el primer nivel (se invierte el orden de sus elementos pero sin tocar los elementos en sí).

Ej.: (reverse ‘ (A B C D) ) -> (D C B A)

(reverse ‘ (A (B C) D) ) -> (D (B C) A)

Page 14: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas que actúan sobre Listas (V)

Otras primitivas: LENGTH, REVERSE, LAST y REMOVE

La función LAST, devuelve una lista conteniendo el último elemento de la lista que se le pasa como parámetro de entrada.

Ej.: (last ‘ (1 B 3) ) -> (3)

(last ‘ (1 (A 2) ) ) -> ( (A 2) )

La función REMOVE elimina un elemento de una lista, y devuelve la lista resultante.

Dos argumentos, el primero es el elemento que queremos eliminar y el segundo la lista de la que queremos suprimirlo.

Si el elemento no se encuentra en la lista se devuelve la propia lista (no hay nada que eliminar), y si el elemento aparece varias veces se eliminan todas sus apariciones.

Ej.: (revome ‘ A ‘ (1 A B A 3) ) -> (1 B 3)

(remove ‘ C ‘ (1 A B A 3) )-> (1 A B A 3)

Page 15: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Predicados (I)

Son un tipo especial de función ya que devuelve Verdadero o Falso, en Lisp estos valores se representan:

Falso NIL , ()

Verdadero T ó cualquier otra cosa distinta de NIL

Los nombres de predicado suelen terminar con la letra P.

Predicados que distinguen el tipo de dato: NUMBERP, LISTP, ATOM y STRINGP

Devuelven T cuando su argumento pertenece al tipo de dato sobre el que se pregunta y NIL en otro caso.

Ej.: (numberp 12) -> T

(numberp ‘A) -> NIL

(listp ‘(1 2) ) -> T

(atom ‘(1 2) ) -> NIL

(atom ‘A ) (atom ‘A ) -> T-> T

(atom T ) -> T

(listp ‘B ) -> NIL

(atom NIL ) -> T

(stringp “casa”)-> T

Page 16: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Predicados (II)Predicado EQUAL

Acepta dos argumentos de cualquier tipo y devuelve T si éstos son iguales.

Ej.: (equal ‘ (A (B C) 2) ‘ (A (B C) 2) ) -> T

(equal 1 ‘ (B C) ) -> NIL

(equal 3 (+ 1 2 ) ) -> T

Predicados sobre números: ZEROP, LESSP (<), y GREATERP (>)

ZEROP, devuelve T si su argumento es cero y NIL en caso contrario. Utilizado con frecuencia como condición de terminación en recursividad.

LESSP o <, devuelve T cuando el primer argumento es menor que el segundo y NIL en caso contrario

Ej.: (lessp 5 7) -> T

(equal A (+ 1 B) ) (equal A (+ 1 B) ) -> ¿?-> ¿?

(setq A 3 ) -> 3

(< 6 6 ) -> NIL

(< 7 6 ) -> NIL

Page 17: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Predicados (III) GREATERP o >, devuelve T cuando el primer argumento es mayor

que el segundo y NIL en caso contrario.

Existen otros tres predicados sobre números <=, >= e =.

Todos estos predicados devolverán error si sus argumentos no son números.

Ej.: (greaterp 7 6) -> T

(> 5 8) -> NIL

Predicados que actúan sobre listas: NULL, y MEMBER

NULL, devuelve T si el argumento es NIL o lista vacía, NIL en caso contrario. Utilizado con frecuencia como condición de terminación en recursividad sobre listas.

Ej.: (null NIL) -> T

(setq n 0)-> 0 (= n 0)-> T

(= 0 3)-> NIL

(null T ) -> NIL

Page 18: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Predicados (IV)Predicados que actúan sobre listas: NULL, y MEMBER

MEMBER, tiene como argumentos un átomo y una lista, devuelve NIL si el átomo no se encuentra en la lista, en otro caso devuelve la sublista a partir de su primera aparición. Puede recibir también otros parámetros.

Ej.: (member ‘ A ‘(B A C)) -> (A C)

Funciones Lógicas: NOT, AND y OR

NOT de lisp equivale a la negación lógica.

AND pueden tener cualquier número de argumentos, equivale a la y lógica. Se van evaluando los argumentos, en el momento en que un argumento es NIL, deja de evaluar los argumentos y devuelve NIL. Si ningún argumento es NIL, devuelve el resultado de evaluación del último argumento.

Ej.: (and (zerop 3) ‘A) -> NIL (‘A no se evalúa)

(member ‘ A ‘(1 2 3))-> NIL

(member ‘ A ‘(A B C))-> (A B C)

(and (zerop 3) (+ ‘A ‘A)) -> NIL

(and T T (+ 1 2)) -> 3

Page 19: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Predicados (V)Funciones Lógicas: NOT, AND y OR

Podemos utilizar el AND como un if condicional, ya que sólo se ejecutará y devolverá el resultado de evaluar el último argumento en caso de que todas las expresiones anteriores sean verdaderas.

Ej.: (setq A 5) -> 5 (setq B 6) -> 6

(and (< A B) A) -> 5

(and (> A B) A) -> NIL

(setq A 5) -> 5 (setq B '(5)) -> (5)

(and (numberp A) (+ A A)) -> 10

(and (numberp B) (+ B B)) -> NIL (No da error porque (+ B B) no llega a evaluarse)

Page 20: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Predicados (VI)

Funciones Lógicas: NOT, AND y OR

OR pueden tener cualquier número de argumentos, equivale al o lógico. Se van evaluando los argumentos, en el momento en que un argumento no es NIL, deja de evaluar los argumentos y devuelve el resultado de la evaluación. Si ningún argumento es cierto, devuelve NIL.

Ej.: (or (zerop 3) (member 1 ‘(2 1 3)) (equal ‘A ‘B)) -> (1 3)

(or (member A ‘(2 1 3)) (equal ‘A ‘A)) -> T

(or (member 4 ‘(2 1 3)) (equal ‘A ‘B)) ->NIL

Page 21: Lenguaje de Programación LISP Parte 3. 3 Primitivas Básicas 3.1 PRIMITIVAS NUMÉRICAS 3.2 PRIMITIVAS DE ASIGNACIÓN 3.3 PRIMITIVAS QUE ACTUAN SOBRE LISTAS

Primitivas de Depuración

Primitivas TRACE y UNTRACE

TRACE, se aplica sobre un nombre de función. Provoca, como efecto lateral, que cada vez que llamemos a la función sobre la que hemos aplicado el trace, se escriba un mensaje por pantalla.

Ej.: (trace cdr)

(cdr (cdr ‘(1 2 3))) Entering CDR, argument list ( (1 2 3) ), result (2 3) Entering CDR, argument list ( (2 3) ), result (3) -> (3)

UNTRACE, inhabilita la salida de las trazas sobre la función a la que se aplica.

Ej.: (untrace cdr) (cdr (cdr ‘(1 2 3))) -> (3)