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

Tema 2: Introducción a SchemeScheme 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

  • Upload
    others

  • View
    13

  • Download
    0

Embed Size (px)

Citation preview

  • 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