Download Introducción a Scheme
Document related concepts
no text concepts found
Transcript
Tema 2: Introducción a Scheme Sesión 4: Introducción a Scheme (2) miércoles 16 de febrero de 2011 Referencias • DrRacket (http://racket-lang.org/) • A brief tour of DrScheme (http://www.plt-scheme.org/software/drscheme/ tour/) • Structure and Interpretation of Computer Programs (http://mitpress.mit.edu/ sicp/full-text/book/book.html), Abelson y Sussman, MIT Press 1996 (pp.1-13), en concreto los capítulos 1.1.1.-1.1.4, 1.1.6 SICP: The elements of programming: Expressions, Evaluation Combinations, Conditional Expressions and Predicates, Naming and Environment, Compound procedures • Teach yourself Scheme (versión HTML, versión PDF) • Simply Scheme online miércoles 16 de febrero de 2011 Más sobre símbolos - Cuando definimos un identificador (símbolo), queda ligado o asociado (bind) al resultado de la evaluación de la expresión de la parte derecha del define: a b c (define a (+ 1 2)) (define b ‘hola) (define c “pp”) 3 hola pp - Una expresión en Scheme puede ser simplemente un símbolo, que Scheme evaluará y devolverá su valor - Los nombres de funciones también son símbolos y Scheme también los evalúa: > a 3 > c “pp” sin + (define (cuadrado x) (* x x)) cuadrado sin + proc miércoles 16 de febrero de 2011 proc proc Eval y quote • Los símbolos son datos primitivos: pueden ligarse a otros símbolos o pasarse como parámetro • quote se utiliza para que su argumento no se evalúe (azúcar sintáctico del lenguaje: tilde ‘) • eval evalúa los argumentos que se le pasan (lenguaje Pretty Big en DrRacket). Funcionamiento: eval evalúa el argumento que recibe (siguiendo el modelo de evaluación de Scheme) y lo devuelve nuevamente evaluado (define a ‘hola) (define hola 5) a --> hola ‘a --> a (eval ‘a) --> hola (eval a) --> 5 miércoles 16 de febrero de 2011 hola a hola 5 Recursión No existen los bucles en programación funcional (define (factorial x) (if (= x 0) 1 (* x (factorial (- x 1))))) (define (suma-hasta x) (if (= 0 x) 0 (+ x (suma-hasta (- x 1))))) miércoles 16 de febrero de 2011 Ejemplos con cadenas ; Funciones primero y resto de una cadena (define (primero cad) (string-ref cad 0)) (define (resto cad) (substring cad 1 (string-length cad))) ; Función veces: devuelve el número de veces que aparece un caracter en una cadena (define (veces cad elem) (cond ((equal? "" cad) 0) ((equal? (primero cad) elem) (+ 1 (veces (resto cad) elem)) (else (veces (resto cad) elem))))) miércoles 16 de febrero de 2011 Ejemplos con cadenas y caracteres ; Funciones siguiente y anterior de un caracter (define (siguiente car) (integer->char (+ 1 (char->integer car)))) (define (anterior car) (integer->char (- (char->integer car) 1))) ; Función codifica una cadena aplicando siguiente a cada uno de sus caracteres (define (codifica pal) (if (equal? "" pal) "" (string-append (string (siguiente (primero pal))) (codifica (resto pal))))) ; Función descodifica una cadena aplicando anterior a cada uno de sus caracteres (define (descodifica pal) (if (equal? "" pal) "" (string-append (string (anterior (primero pal))) (descodifica (resto pal))))) miércoles 16 de febrero de 2011 Listas: elemento fundamental de Scheme (list 1 2 3 4) ; list crea una lista '(1 2 3 4) ; otra forma de definir la misma lista (car '(1 2 3 4)) ; primer elemento de la lista (cdr '(1 2 3 4)) ; resto de la lista (cons 1 '(2 3 4)) ; devuelve una nueva lista con un nuevo elemento a su cabeza (append '(1) '(2 3 4) '(5 6)) ; construye una lista nueva concatenando '() ; lista vacía (cdr '(1)) ; devuelve la lista vacía (null? '(1)) ; comprueba si una lista está vacía ‘(hola que tal) ; quote no evalúa los argumentos (list hola que tal) ; list evalúa sus argumentos miércoles 16 de febrero de 2011 Programas ejemplo ; Función (lista-hasta x) que devuelve una lista de números 1..x en orden decreciente (define (lista-hasta x) (if (= x 0) '() (cons x (lista-hasta (- x 1))))) ; Función (potencias-2 x) que devuelve una lista con las potencias de 2 hasta x (define (potencias-2 x) (if (= x 0) '(1) (append (list (* 2 (car (potencias-2 (- x 1))))) (potencias-2 (- x 1))))) miércoles 16 de febrero de 2011 Programas ejemplo ; Función (divisor? x y) que comprueba si un número es divisor de otro (define (divisor? x y) (= 0 (remainder y x))) ; Función (filtra-divisores lista x) que devuelve una lista con los números de la lista original que son divisores de x (define (filtra-divisores lista x) (cond ((null? lista) '()) ((divisor? (car lista) x) (cons (car lista) (filtra-divisores (cdr lista) x))) (else (filtra-divisores (cdr lista) x)))) ;Función (divisores-n x n) que devuelve una lista con los divisores de un número n (define (divisores-n x n) (filtra-divisores (lista-hasta x) n)) miércoles 16 de febrero de 2011