tema 2: introducción a scheme - rua:...

15
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

Upload: lequynh

Post on 11-Feb-2018

213 views

Category:

Documents


1 download

TRANSCRIPT

Page 1: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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

Page 2: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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

Page 3: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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

Page 4: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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

Page 5: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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

(<= 2 3 3 4 5)(max 3 5 10 1000)(/ 22 4)(quotient 22 4)(remainder 22 4)(equal? 0.5 (/ 1 2))(= 0.5 (/ 1 2))(abs (* 3 -2))(sin 2.2)

(number? 1)(integer? 2.3)(integer? 4.0)(real? 1)(positive? -4)(negative? -4)(zero? 0.2)(infinite? 2.0)(finite? +inf.0)(even? 2)(odd? 3)(exact? 5) (inexact? +inf.0)

martes 15 de febrero de 2011

Page 6: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

Caracteres

• Se soportan caracteres internacionales y se codifican en UTF-8

#\a#\A#\space#\ñ#\á

(char<? #\a #\b)(char-numeric? \#1) ; relacionados: char-alphabetic?; char-whitespace?, char-upper-case?; char-lower-case?(char-upcase #\ñ)(char->integer #\space)(integer->char 32) ;#\space(char->integer (integer->char 5000))

martes 15 de febrero de 2011

Cadenas

(make-string 5 #\o) --> "ooooo" (string #\h #\o #\l #\a) --> "hola"(substring "Hola que tal" 2 4)(string? "hola")(string->list "hola") (string-length "hola") (string-ref "hola" 0)(string-append "hola" "adios")(string=? "Hola" "hola")(string=? "hola" "hola")(string<? "aab" "cde")(string>=? "www" "qqq")

martes 15 de febrero de 2011

Page 7: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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 <símbolo> <expresión>) Sintaxis:

(define pi 3.14159)(sin (/ pi 2))(define a (+ 2 (* 3 4)))

Semántica:1. Se evalúa la <expresión>2. El resultado de la evaluación queda asociado al <símbolo>

martes 15 de febrero de 2011

Page 8: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

Abstracción: Forma especial define para crear funciones

Sintaxis: (define (<nombre-funcion> <args>) <cuerpo>)

(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

Page 9: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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

Page 10: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

Estructuras de control: Forma especial cond

(cond (<exp-cond-1> <exp-consec-1>) (<exp-cond-2> <exp-consec-2>) ... (else <exp-consec-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

Page 11: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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

Page 12: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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

Page 13: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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

Page 14: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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

Page 15: Tema 2: Introducción a Scheme - RUA: Principalrua.ua.es/dspace/bitstream/10045/19672/3/tema2.pdf · ... MIT Press 1996 (pp.1-13), ... ligado a cursos de introducción a la computación

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