Tema 2: Introducción a Scheme
Sesión 3: Introducción a Scheme (1)
martes 15 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
martes 15 de febrero de 2011
Scheme como lenguaje de programación
• Dialecto de LISP
• MIT 1975, Guy L. Steel y Gerarld J. Sussman
• Lenguaje académico, ligado a cursos de introducción a la computación en universidades de EEUU (Libro SICP, Abelson y Sussman)
• Lenguaje para iniciar a la programación en los institutos en EEUU (Bootstrapworld o How to Design Programs)
martes 15 de febrero de 2011
Scheme es actual
• Colección de programas en Scheme (http://www.rodoval.com/paginalen.php?len=Scheme)
• Scheme Gimp (http://gimp.org.es/tutoriales/schemebasic/) , Scheme está dentro de Gimp para extender la herramienta de tratamiento de imágenes
• Recetas en Scheme (http://schemecookbook.org/Cookbook/WebHome)
• PLaneT (http://planet.plt-scheme.org/) , un repositorio de paquetes escritos en Scheme.
martes 15 de febrero de 2011
Elementos de un lenguaje
• Primitivas
• Mecanismos de composición
• Mecanismos de abstracción
martes 15 de febrero de 2011
Lenguaje interpretado
• Arrancamos DrRacket
• Vamos a probar algunas expresiones
(+ 2 3)(+ (* 2 3) (+ 1 2 3 4) (/ 12 3))(> 3 (+ 2 5))(and (> 3 1) (= (* 2 3) (/ 12 2)))(string-append "hola" "adios")
Read
EvalPrint
martes 15 de febrero de 2011
Composición de expresiones
• Primitivas = +, *, >, =, and, string-append, …
• Valores = números, booleanos, strings, …
• Un paréntesis abierto '(' lanza la función que hay a su derecha
• Composición = anidar expresiones
martes 15 de febrero de 2011
Evaluación de expresiones
• Paréntesis: evaluación de procedimientos
(- (+ 5 8) (+ 2 4))
martes 15 de febrero de 2011
Booleanos
#t ;verdadero#f ;falso (> 3 1.5)(= 3 3.0)(equal? 3 3.0)(or (< 3 1.5) #t)(and #t #t #f)(not #f)(not 3)
martes 15 de febrero de 2011
Números
numbercomplexrealrationalinteger
(
Caracteres
• Se soportan caracteres internacionales y se codifican en UTF-8
#\a#\A#\space#\ñ#\á
(char
Símbolos
'hola(symbol 'hola-que)(symbol->string 'hola-que)'mañana'lápiz ; aunque sea posible, no vamos a usar acentos en los símbolos; pero sí en los comentarios(symbol? 'hola) ; #t(symbol? "hola") ; #f(symbol? #f) ; #f(equal? 'hola 'hola)(equal? 'hola "hola")
martes 15 de febrero de 2011
Abstracción: Forma especial define para dar valores a variables
(define ) Sintaxis:
(define pi 3.14159)(sin (/ pi 2))(define a (+ 2 (* 3 4)))
Semántica:1. Se evalúa la 2. El resultado de la evaluación queda asociado al
martes 15 de febrero de 2011
Abstracción: Forma especial define para crear funciones
Sintaxis: (define ( ) )
(define (cuadrado x) (* x x))
(define (divisor x y) (= 0 (remainder y x)))
martes 15 de febrero de 2011
Ejercicio
• Define una función que devuelva la mitad de una cadena. Ejemplo:
(mitad-cadena “hola”)“ho”(mitad-cadena “pepito”)“pep”
martes 15 de febrero de 2011
Solución
(define (mitad-cadena cad) (substring cad 0 (quotient (string-length cad) 2)))
martes 15 de febrero de 2011
Estructuras de control: Forma especial if
Sintaxis: (if condicion expresion-true expresion-else)
(define (mayor-que-cinco x) (if (> x 5) 'mayor-que-cinco 'menor-o-igual-que-cinco))
Sólo se evalúa la expresión asociada al resultado de la condiciónLos siguientes ejemplos no darían error:
(if (> 7 5) (+ 2 1) (/ 3 0))(if (< 7 5) (gfdgfg 2) (+ 2 2))
martes 15 de febrero de 2011
Estructuras de control: Forma especial cond
(cond ( ) ( ) ... (else ))
Sintaxis:
(cond ((> 3 4) '3-es-mayor-que-4) ((< 2 1) '2-es-menor-que-1) ((= 3 1) '3-es-igual-que-1) ((= 2 2) '2-es-igual-que-2) ((> 3 2) '3-es-mayor-que-2) (else 'ninguna-condicion-es-cierta))
martes 15 de febrero de 2011
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
(define a (+ 1 2))(define b ‘hola)(define c “pp”) 3 hola pp
a b c
- 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:
- Una expresión en Scheme puede ser simplemente un símbolo, que Scheme evaluará y devolverá su valor
> a3> c“pp”
- Los nombres de funciones también son símbolos y Scheme también los evalúa:
sin+(define (cuadrado x) (* x x)) proc
cuadrado
proc
+
proc
sin
miércoles 16 de febrero de 2011
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
5hola
holaa
miércoles 16 de febrero de 2011
Recursión
(define (factorial x) (if (= x 0) 1 (* x (factorial (- x 1)))))
(define (suma-hasta x) (if (= 0 x) 0 (+ x (suma-hasta (- x 1)))))
No existen los bucles en programación funcional
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 (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))
; Función (divisor? x y) que comprueba si un número es divisor de otro
(define (divisor? x y) (= 0 (remainder y x)))
miércoles 16 de febrero de 2011