racket
Éric Tanter
March 21, 2012
last updated: Wednesday, March 21st, 2012
Copyright © 2011 by Éric Tanter
The electronic version of this work is licensed under the Creative Commons Attribution Non-Commercial No
Derivatives License
Este mini-curso tiene como objetivo entregarle las nociones básicas para programar en
Scheme siguiendo buenas prácticasde programación funcional. Esta materia es indispensable para luego poder seguir el curso de lenguajes, que sigue el libro PLAI de Shriram
Krishnamurthi.
Se usa el lenguaje Racket, un super Scheme con variadas y poderosas librerías, y su ambiente
de desarrollo, DrRacket.
PrePLAI también está disponible en PDF. Sin embargo, PrePLAI está sujeto a cambios en
cualquier momento, así que accederlepor la web es la mejor manera de asegurarse de estar
viendo la última versión.
Agradezco comentarios, sugerencias y correcciones; ¡no dude en contactarme por email!
Agradecimientos: Gracias a los miembros del laboratorio PLEIAD y del curso de Lenguajes
de Programación de la Universidad de Chile por sus correcciones y sugerencias, en particular
a Javiera Born, Ismael Figueroa y Rodolfo Toledo.1
1
Elementos Básicos
El ambiente de desarrollo (IDE) DrRacket divide inicialmente el espacio en dos partes, una
para definiciones, y otra para interactuar con el lenguaje directamente, al estilo de un terminal Unix. Usaremos la forma interactiva para empezar a explorar el lenguaje.
1.1
Tipos primitivos
Números, incluyendo fracciones y números imaginarios:
> 1
1
> -3
-3> 4.02
4.02
> 6.02e+23
6.02e+23
> 1+2i
1+2i
> 4/3
4/3
Booleanos:
> #t
#t
> #f
#f
Strings (incluyendo caracteres Unicode):
> "hola"
"hola"
> "hola \"mundo\" feliz"
"hola \"mundo\" feliz"
> " x:(µ↵.↵!↵).xx"
" x:(µ↵.↵!↵).xx"
Símbolos:
> ’hola
’hola
2
Un símbolo es un valor atómico. Por ende, determinar la igualdad de dos símbolos es barato
(tiempo constante), a diferenciade una comparación de strings (lineal).
Otros tipos primitivos incluyen caracteres, bytes y byte strings, void, undefined, y estructuras
de datos como pares, listas, cajas, tablas de hash, y vectores. Veremos algunos más adelante.
1.2
Usar funciones predefinidas
Scheme es un lenguaje con sintáxis prefijada con paréntesis. El primer elemento después del
paréntesis "(" es la función aaplicar, y todo lo demás hasta el paréntesis ")" correspondiente
son los argumentos (separados por espacios). Por ejemplo, para aplicar funciones aritméticas
(que reciben un número variable de argumentos):
> (+ 1 2)
3
> (* 2 4 5)
40
> (- 1 1/4)
3/4
Eso significa que los paréntesis en Scheme tienen un significado (¡y muy importante!). Las
pueden ver como el equivalente de las paréntesis deaplicación de funciones y procedimientos en otros lenguajes (por ejemplo foo(1) en C se escribe (foo 1) en Scheme).
Y similarmente para otras funciones matemáticas y lógicas:
> (+ 1 (- 3 4))
0
> (sqrt -1)
0+1i
> (or (< 5 4)
(equal? 1 (- 6 5)))
#t
> (and (not (zero? 10))
(+ 1 2 3))
6
Como se puede apreciar en el último ejemplo, en Scheme, todo lo que no es #f es verdadero.
Manipulación destrings:
> (string-append "ho" "la")
"hola"
> (string-length "hola mundo")
3
10
> (substring "Apple" 1 3)
"pp"
> (string->symbol "Apple")
’Apple
Hay varias formas de imprimir, por ejemplo printf:
> (printf "hola⇠n")
hola
> (printf "hola ⇠a ⇠s⇠n" "mundo" "feliz")
hola mundo "feliz"
Scheme es un lenguaje seguro (¡no hay segmentation faults!). Al invocar una función con
argumentosdel tipo equivocado, se genera un error:
> (+ 1 "hola")
+: expects type as 2nd argument, given: "hola";
other arguments were: 1
El mensaje de error explica claramente lo que pasó. Es importante notar que el error se
reporta en tiempo de ejecución. Scheme no es un lenguaje estáticamente tipeado, al igual
que JavaScript y Python, entre otros.
Ejercicio: imprima (con printf) la raíz...
Regístrate para leer el documento completo.