Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Capitulo 1
Capitulo 1
Índice general
1. Introducción 3
1.1. Interactuando con el intérprete . . . . . . . . . . . . . . . . . . . . 3
1.2. El intérprete sigue reglas . . . . . . . . . . . . . . . . . . . . . . . . 5
1.2.1. Forzando la interpretación . . . . . . . . . . . . . . . . . . . 6
1.2.2. Los argumentos de los procedimientos . . . . . . . . . . . . 6
1.2.3. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3. Definiciones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
1.3.1. Variables, accesibilidad, contexto . . . . . . . . . . . . . . . 9
1.4. El uso del editor . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
1.5. ¿Qué es un procedimiento . . . . . . . . . . . . . . . . . . . . . . . 10
1.6. Definición de procedimientos . . . . . . . . . . . . . . . . . . . . . 14
1.7. Proyectos de procedimientos . . . . . . . . . . . . . . . . . . . . . . 15
1.7.1. Procedimientos para dibujar al estilo Logo . . . . . . . . . . 15
1.7.2. Ejercicios . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
1.8. Apéndice . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
1.8.1. Solución a los ejercicios 1.2.3 . . . . . . . . . . . . . . . . . 22
1.8.2. Solución a los ejercicios 1.7.2 . . . . . . . . . . . . . . . . . 22
i i
i i
i i
i i
i i
i i
Capítulo 1
Introducción
> 765 ←֓
765
> sevilla ←֓
reference to an identifier before its definition: sevilla
1 Fue introducido por Sussman G.J. y Steele G.L. Jr. en 1975 en el MIT, AI Memo no
349 de título “Scheme: an Interpreter for Extended Lambda Calculus”. El 26 Septiembre del
2007 apareció la revisión 6 de las especificaciones de Scheme. Michael Sperber, R. Kent Dybvig,
Matthew Flatt, Anton van Straaten (Editores) han publicado un documento de unas 90 páginas
en que se establece el standard: Revised 6 Report on the Algorithmic Language Scheme.
2 DrScheme v. 4.1.5 de la Universidad de Rice. Hay versiones para otros sistemas operativos.
i i
i i
i i
4 CAPÍTULO 1. INTRODUCCIÓN
¿Por qué al escribir un número Scheme nos devuelve el mismo número y, sin
embargo, al escribir una palabra nos devuelve un mensaje de error?
¿Las palabras y los números son expresiones primitivas para Scheme?
¿Qué otras expresiones podemos escribir que Scheme entienda?
Ni los números ni las palabras son expresiones primitivas para Scheme. La ex-
presión más pequeña y, a la vez, indivisible que podemos escribir es uno cualquiera
de los 256 signos de la tabla ASCII. Podemos añadir más expresiones:
> 765 ←֓
765
> sevilla ←֓
reference to an identifier before its definition: sevilla
> 457
457
> (+ 34 23)
57
A continuación hemos escrito la expresión «+ 34 23» —es decir «suma 34
y 23»— entre paréntesis y la respuesta obtenido es la suma efectiva de dichos
números. Varias cosas hemos de retener:
i i
i i
i i
Las operaciones en Scheme siguen una notación prefija: esto es, primero se
escribe el nombre de la operación y a continuación los operandos.
Y hemos escrito la expresión entre paréntesis porque para Scheme una ex-
presión encerrada entre paréntesis significa la aplicación de una operación o
procedimiento, justamente la de aquel cuyo nombre sea el del primer elemento
en el paréntesis. En nuestro ejemplo «+».
i i
i i
i i
6 CAPÍTULO 1. INTRODUCCIÓN
> (+ 3 4 7)
14
> (* 14 5)
70
i i
i i
i i
Es decir, Scheme lleva a cabo dos aplicaciones (o dos operaciones), pero sus-
pende la primera, realiza la segunda y sólo cuando ha acabado ésta, continua
realizando la primera.
Podemos utilizar una representación arbórea para ilustrar esta idea. La expre-
sión «(*(+ 3 4 7) 5)» puede representarse en un árbol como sigue:
+ 5
3 4 7
i i
i i
i i
8 CAPÍTULO 1. INTRODUCCIÓN
1.2.3. Ejercicios
Cuál es el resultado dado por Scheme en respuesta a cada una de las siguientes
expresiones5:
1. 10
2. a
3. leon
4. (+ 5 3 4)
5. (- 9 1)
6. ‘roma
7. ‘roma leon
8. (+ 1 -2)
9. roma 10
10. (- 1 -2)
11. ‘sevilla
1.3. Definiciones
Anteriormente hemos visto una idea que no hemos terminado de explotar: la de
variable. Una variable es un par cuyo primer elemento ha de ser un nombre o iden-
tificador y cuyo segundo elemento es un objeto cualquiera que Scheme reconozca
como tal6 . Es decir:
V ariable =< nombre, valor >
En Scheme, antes de poder usar una variable en un programa hay que decla-
rarla. Una vez declarada, el valor de la variable puede ser cambiado7 .
Declaramos una variable mediante la forma especial Define. Define es un pro-
cedimiento primitivo: porque es un procedimiento que forma parte del interpre-
te mismo. Y es una forma especial porque, a diferencia de la generalidad de los
procedimientos, no interpreta su primer argumento sino que lo toma literalmente.
La sintaxis de Define es muy sencilla:
en el intérprete.
6 En La Revisón 5.a del Report se dice que el segundo elemento del par es una posición
i i
i i
i i
1.3. DEFINICIONES 9
Según este esquema podemos definir una variable cuyo nombre sea «sevilla» y
cuyo valor sea el número 5:
Una vez que hemos creado una variable, podemos cambiar su valor. O dicho
de otra manera: una variable permanece aunque su valor cambie. En los ejemplos
anteriores, la variable «sevilla» sigue siendo la misma aún cuando su valor cambiara
a 100, por ejemplo.
¿Cómo cambiamos el valor de una variable? set! es otro procedimiento primiti-
vo. Como define, es también una forma especial porque no interpreta su primer
argumento8, aunque sí su segundo. Su sintaxis es muy simple:
error. Por ejemplo set!: cannot set identifier before its definition: sevilla.
i i
i i
i i
10 CAPÍTULO 1. INTRODUCCIÓN
i i
i i
i i
(turtles)
(fd 50)
(lt 90)
(fd 50)
(lt 90)
(fd 50)
(lt 90)
(fd 50)
(lt 90)
Verá un cuadrado dibujado por la tortuga. Puede el lector empaquetar esa secuen-
cia de instrucciones en un único procedimiento de nombre «cuadrado» mediante
define:
9 Logo es un lenguaje de programación desarrollado en el MIT en 1967 bajo la dirección de
Seymour Papert.
i i
i i
i i
12 CAPÍTULO 1. INTRODUCCIÓN
i i
i i
i i
(define cuadrado
(lambda ()
(fd 50)
(lt 90)
(fd 50)
(lt 90)
(fd 50)
(lt 90)
(fd 50)
(lt 90) ))
Sin embargo, es mejor idea no prefijar el valor del lado —50 en lo anterior—,
antes bien dejarlo como algo variable que pueda ser modificado cada vez que se
aplique el procedimiento cuadrado.
(define cuadrado
(lambda (lado)
(fd lado)
(lt 90)
(fd lado)
(lt 90)
(fd lado)
(lt 90)
(fd lado)
(lt 90) ))
(fd lado)
(lt 90)
(define para-cuadrado
(lambda (lado)
(fd lado)
(lt 90)))
(define cuadrado
(lambda (lado)
(repite 4 ((para-cuadrado lado))) ))
i i
i i
i i
14 CAPÍTULO 1. INTRODUCCIÓN
i i
i i
i i
i i
i i
i i
16 CAPÍTULO 1. INTRODUCCIÓN
(clear)
1 (split (lt 180))
(sleep/yield 2)
(penup)
2 (fd 150)
(pendown)
(sleep/yield 2)
3 (repite 10 ((poligono 360 1) (lt 10)))
i i
i i
i i
i i
i i
i i
18 CAPÍTULO 1. INTRODUCCIÓN
5. Dibuje un triángulo equilatero. Gire un poco la tortuga, por ejemplo (lt 20).
Dibuje otra vez el mismo triángulo. Conseguirá un dibujo como el siguiente:
i i
i i
i i
Repita esa misma operación las veces necesarias para conseguir un dibujo
como el siguiente:
i i
i i
i i
20 CAPÍTULO 1. INTRODUCCIÓN
i i
i i
i i
10. Ahora ensaye con varias tortugas. Consiga que dibujen algo como lo siguiente:
1.7.2. Ejercicios
Definir los procedimientos:
1. Nombre: area-cuadrado
Argumentos: lado
Cálculo: lado * lado
2. Nombre: area-rectangulo
Argumentos: base altura
Cálculo: base * altura
3. Nombre: area-triangulo
Argumentos: base altura
Cálculo: (base * altura) / 2
4. Nombre: hipotenusa
Argumentos: a b
Cálculo: hipotenusa2 = a2 + b2
5. Nombre: cuadrado-binomio
Argumentos: a b
Cálculo: (a + b)2 = a2 + b2 + 2ab
Ahora podemos cerrar nuestra primera sesión con Scheme. Para ello, como con
cualquier otro programa Windows, abrimos el menú Archivo y elegimos Salir.
i i
i i
i i
22 CAPÍTULO 1. INTRODUCCIÓN
1.8. Apéndice
1.8.1. Solución a los ejercicios 1.2.3
> 10
10
> a
. . reference to an identifier before its definition: a
> leon
. . reference to an identifier before its definition: leon
> (+ 5 3 4)
12
> (- 9 1)
8
> ’roma
roma
> ’roma leon
roma
. . reference to an identifier before its definition: leon
> (+ 1 -2)
-1
> roma 10
. . reference to an identifier before its definition: roma
10
> (- 1 -2)
3
> ’sevilla
sevilla
(define area-rectangulo
(lambda (base altura)
(* base altura) ))
(define area-triangulo
(lambda (base altura)
(/ (* base altura) 2) ))
(define hipotenusa
(lambda (a b)
i i
i i
i i
1.8. APÉNDICE 23
(define cuadrado-binomio
(lambda (a b)
(+ (expt a 2) (expt b 2) (* 2 a b)) ))
i i
i i