Está en la página 1de 23

i i

“capitulo-1” — 2010/1/5 — 19:27 — page 1 — #1


i i

Í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

“capitulo-1” — 2010/1/5 — 19:27 — page 2 — #2


i i

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 3 — #3


i i

Capítulo 1

Introducción

Scheme es un dialecto de Lisp1 , de una familia de lenguajes de programación


inventados para tratar con palabras, frases e ideas en vez de tener que ver con
números. A veces se les llama lenguajes simbólicos.
Nuestro intérprete es un programa que funciona bajo Windows XP2 . Por tanto,
para cargarlo buscaremos entre los programas de Windows la carpeta «PLT» y
en ella encontraremos nuestro programa: DrScheme, dos clicks con el ratón y se
ejecutará el programa y nuestro escritorio se mostrará como en la figura 1.1.
La ventana superior es un editor de texto plano. Se puede escribir cualquier
cosa y hasta que no pulsemos el botón ejecutar «no pasa nada». En el editor
escribiremos definiciones de procedimientos y de variables. Más abajo volveremos
sobre él.
En la ventana inferior podemos interactuar con el intérprete: podemos escribir
y al pulsar intro obtendremos una cierta respuesta.

1.1. Interactuando con el intérprete


Si escribimos un número y pulsamos intro podemos observar lo que pasa.
Igual sucede si escribimos una palabra cualquiera.

> 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

“capitulo-1” — 2010/1/5 — 19:27 — page 4 — #4


i i

4 CAPÍTULO 1. INTRODUCCIÓN

Figura 1.1: Ventana inicial de DrScheme

¿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

“capitulo-1” — 2010/1/5 — 19:27 — page 5 — #5


i i

1.2. EL INTÉRPRETE SIGUE REGLAS 5

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.

Entre cada uno de éstos, el nombre de la operación y los operandos, escribi-


mos un espacio: el espacio indicará al intérprete dónde acaba una expresión.

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 «+».

En la figura 1.2 podemos ver el resultado de estas interacciones con el intérprete.

Figura 1.2: Interactuando con el intérprete

1.2. El intérprete sigue reglas


Scheme sigue ciertas reglas semánticas o de interpretación de expresiones:

1. Si la expresión leída es un número, devuelve el mismo número.

2. Si la expresión es un símbolo, lo interpreta como el nombre o identificador


de una variable y devuelve el valor de la misma. Si la variable no existe,
devuelve un error. Como en el ejemplo:
> sevilla
reference to an identifier before its definition: sevilla

3. Si la expresión es una lista3 , la interpreta como la aplicación de un procedi-


miento u operación. Justamente el procedimiento u operación cuyo nombre
es el primer elemento de la secuencia de expresiones. Como en el ejemplo:
> (+ 34 23)
57
3 Una lista es una serie de ítems entre paréntesis, separados por un espacio entre sí.

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 6 — #6


i i

6 CAPÍTULO 1. INTRODUCCIÓN

1.2.1. Forzando la interpretación


Si queremos escribir un símbolo y no deseamos que Scheme lo interprete como
el nombre de una variable ¿podemos hacer algo? Si queremos escribir una lista
y no queremos que Scheme la interprete como la aplicación de un procedimiento
¿podemos hacer algo? La idea, en ambos casos, es obligar a Scheme a interpretar
literalmente la expresión.
Existe un procedimiento primitivo quote que devuelve su argumento evitando
las reglas de interpretación. Repárese en que el argumento de quote no es inter-
pretado, a diferencia de lo que es normal en otros casos. Por ejemplo4 :

> (quote sevilla)


sevilla
> (print sevilla)
top-level: unbound variable: sevilla

El apóstrofo puede entenderse como una abreviatura de quote: evita la inter-


pretación de la expresión que le sigue y la devuelve literalmente. Por ejemplo:

> (quote sevilla)


sevilla
> ‘sevilla
sevilla
> ‘(34 56 78)
(34 56 78)

1.2.2. Los argumentos de los procedimientos


Para sumar lo que Scheme hace es aplicar el procedimiento «+» a los argu-
mentos «3» , «4» y «7». Y si queremos multiplicar el resultado por 5 ¿hemos de
interactuar con Scheme como sigue

> (+ 3 4 7)
14
> (* 14 5)
70

o podemos escribir una única expresión? Y si lo podemos hacer, ¿cómo?


Hemos de ver de más cerca cómo interpreta Scheme la aplicación de un proce-
dimiento.
Scheme interpreta la expresión que escribimos de izquierda a derecha de la
siguiente manera: lee un «(» ; comprueba si el último elemento de la expresión es un
«)» ; si lo es, interpreta toda la expresión como la aplicación de un procedimiento.
4 Print es un procedimiento primitivo. Su objetivo es escribir en el dispositivo de salida actual

—normalmente la pantalla— su argumento.

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 7 — #7


i i

1.2. EL INTÉRPRETE SIGUE REGLAS 7

A continuación lee la siguiente expresión, que ha de ser el nombre de un proce-


dimiento. Sustituye dicho nombre por su valor, esto es la operación en que consiste
(por ejemplo, el nombre «+» lo sustituye por la operación de sumar).
Pero Scheme no puede aplicar la operación de sumar en el vacío: necesita unos
argumentos, unos números que sumar. Una vez leído el nombre del procedimien-
to y hecha la sustitución, Scheme lee la siguiente expresión en la secuencia y la
interpreta según las reglas que hemos visto más arriba, sustituyendo la expresión
por el valor resultante de esta interpretación. ¿Qué significa esto? Supongamos
que existe una variable global de nombre «leo», cuyo valor sea 56. La expresión
siguiente es correcta:
> (+ 100 leo)
156
¿Por qué? Lo que Scheme hace al interpretar esa expresión puede esquemati-
zarse como sigue:
1. ( ... ) ¿es una lista?
2. Si es una lista aplica el procedimiento cuyo identificador es «+».
3. Interpreta cada argumento:
a) 100 ⇒ 100
b) leo —un identificador, luego lo sustituye por su valor— ⇒ 56
Si aplicamos esta misma idea, podemos contestar a la pregunta planteada más
arriba afirmativamente. En efecto, podemos escribir:
> (* (+ 3 4 7) 5)
70
Abstractamente podemos representarnos cómo interpreta Scheme esta expre-
sión:

Aplica procedimiento multiplicar a


Aplica procedimiento sumar a 3 y 4 y 7
y 5.

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

“capitulo-1” — 2010/1/5 — 19:27 — page 8 — #8


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:

(def ine nombrevariable valor)


5 Es conveniente que el estudiante conteste en una hoja y después compruebe las respuestas

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

(location) de la memoria. A lo albergado en dicha posición se llama «valor».


7 Dentro del con-texto en que aparezca. Véase el apartado .

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 9 — #9


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:

(def ine sevilla 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:

(set! nombrevariable nuevovalor )

1.3.1. Variables, accesibilidad, contexto


Cuando escribimos algo en el intérprete, La expresión escrita es evaluado en el
entorno global del intérprete. En este entorno existen los procedimientos primiti-
vos. Se puede imaginar ese entorno global como una lista de palabras: los nombres
de los procedimientos primitivos. Al escribir una expresión o bien se evalúa y de-
vuelve un valor o bien se añade un ítem al final de la lista mencionada: es el caso
de las definiciones. Por ejemplo:
si se escribe (+ 2 5), el intérprete evalúa la expresión y devuelve 7.
si se escribe (define uno 2), el intérprete añade «uno» a la lista de palabras
o identificadores conocidos a la vez que lo asocia con el objeto 2. Por esto, es
posible modificar el valor asociado con la variable definida. Define declara
y crea una variable y set! permite modificar su valor.

Bienvenido a DrScheme, versión 372 [3m].


Lenguaje: Texto (MzScheme, incluye R5RS).
>(+ 2 5)
7
>(define uno 2)
>uno
2
>(set! uno 3)
>uno
3
>

Este comportamiento descrito no cambia porque se escriban las expresiones en el


editor y se ejecute el programa. Tampoco hay diferencias entre versiones:
8 Aunque si el nombre o identificador dado no lo es de una variable existente, se produce un

error. Por ejemplo set!: cannot set identifier before its definition: sevilla.

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 10 — #10


i i

10 CAPÍTULO 1. INTRODUCCIÓN

Bienvenido a DrScheme, versión 4.2.3 [3m].


Lenguaje: R5RS.
>(+ 2 5)
7
>(define uno 2)
>uno
2
>(set! uno 3)
>uno
3
>

1.4. El uso del editor


Todos los ejemplos que hemos escrito en la ventana del intérprete pueden ser
escritos también en la ventana del editor. La figura 1.3 lo muestra.
Al pulsar el botón ejecutar obtenemos una respuesta en la ventana del intér-
prete. Repárese en que si el intérprete encuentra un error, proporciona un mensaje
y no continua leyendo las expresiones siguientes a aquella que produce el error. En
la figura 1.4 puede apreciarse el uso de «;» para comentar o anular la lectura de
una expresión.

1.5. ¿Qué es un procedimiento


Sustituya el lector la primera línea del editor —actualmente #lang scheme—
por lo siguiente:
#lang scheme/gui
A continuación presione el botón de nombre «Salvar»; cree una nueva carpeta y
déle un nombre al fichero. Copie el fichero «logo.ss» —existente en el CD— a la
carpeta recién creada. Escriba las siguientes líneas:
(require graphics/turtles)
(require "logo.ss")

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 11 — #11


i i

1.5. ¿QUÉ ES UN PROCEDIMIENTO 11

Figura 1.3: Uso del editor

(turtles)

Observará que aparece una nueva ventana de nombre «turtles». Escriba en el


intérprete (fd 50). Observará que, en la ventana «turtles», la flechita se mueve
hacia delante y deja una línea recta como rastro: es la conocida tortuga de Logo 9 .
Pruebe el lector la siguiente secuencia de aplicaciones de procedimientos:

(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

“capitulo-1” — 2010/1/5 — 19:27 — page 12 — #12


i i

12 CAPÍTULO 1. INTRODUCCIÓN

Figura 1.4: Uso de punto y coma

(define cuadrado procedimiento ).


En el lugar ocupado por procedimiento ha de escribirse una expresión lambda.
Lambda es una forma especial que identifica una expresión como consistiendo en
un procedimiento, por ejemplo:
(lambda ()
(fd 50)
(lt 90)
(fd 50)
(lt 90)
(fd 50)
(lt 90)
(fd 50)
(lt 90) )
Por tanto, una expresión lambda tiene tres elementos:
lambda argumentos secuencia-instrucciones
1.o 2.o 3.o
Según esto, «cuadrado» es un identificador o nombre cuyo valor es toda la expresión
lambda:

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 13 — #13


i i

1.5. ¿QUÉ ES UN PROCEDIMIENTO 13

(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) ))

Pero la idea de procedimiento hasta aquí sugerida ha de completarse mediante una


abstracción. Si se analiza la anterior definición, se observará que hay una secuencia
de dos instrucciones que se repite cuatro veces:

(fd lado)
(lt 90)

Es posible empaquetar esta secuencia de dos instrucciones en otro procedimiento,


por ejemplo:

(define para-cuadrado
(lambda (lado)
(fd lado)
(lt 90)))

y hacer uso de este procedimiento dentro de la definición abstracta de cuadrado:

(define cuadrado
(lambda (lado)
(repite 4 ((para-cuadrado lado))) ))

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 14 — #14


i i

14 CAPÍTULO 1. INTRODUCCIÓN

El lector puede repetir la experiencia descrita hasta aquí ensayando a defi-


nir rectangulo. Analice, finalmente, que un cuadrado es un caso particular de
rectángulo: aquel que tiene sus lados iguales.
En síntesis tenemos:
1. Un procedimiento es una expresión lambda.
2. Según los casos, puede tener o no argumentos.
3. Consiste en una secuencia de instrucciones o aplicaciones de otros procedi-
mientos.

1.6. Definición de procedimientos


Una operación de cálculo suele llamarse procedimiento, así «+», «-», «*» y «/»
son, respectivamente, los nombres de las cuatro operaciones aritméticas elementa-
les. Cada una de ellas es un procedimiento primitivo. Pero a partir de ellas podemos
definir nuevos procedimientos. Por ejemplo, podemos definir un procedimiento de
nombre suma2 que a un argumento numérico le sume 2.
El esquema general para definir un procedimiento es:
(def ine suma2 lambda-expresión)
La forma general de una expresión lambda es:
(lambda (arg1 arg2 . . . argn) expresión de cálculo)
La definición del nuevo procedimiento puede ser escrita así:
(define suma2
(lambda (n)
(+ 2 n)
))
Donde «n» es el nombre dado al único argumento de la expresión lambda. En
la expresión de cálculo (+ 2 n) se usa n, por tanto se aplica la regla 2 de la sección
1.2. Esto se hará en el momento en que apliquemos el nuevo procedimiento:
> (suma2 65)
67
El intérprete, al leer (suma2 65) actúa como sigue:
ENTORNO DEL PROCEDIMIENTO SUMA2

suma2 = (lambda (n) (+ 2 n))


( (lambda (n) (+ 2 n)) n)
n = 65
( (lambda (65) (+ 2 65)) 65)
(+ 2 65)
67

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 15 — #15


i i

1.7. PROYECTOS DE PROCEDIMIENTOS 15

1.7. Proyectos de procedimientos


Dividiremos esta sección en tres partes, correspondientes a lo siguiente:
1. Procedimientos para dibujar al estilo Logo
2. Procedimientos con números
3. Procedimientos con «palabras»

1.7.1. Procedimientos para dibujar al estilo Logo


Logo tiene una ventaja sobre otros lenguajes de programación, a saber: hace
evidente que se puede programar para fijar ideas, conceptos, y explorar nuevas
ideas. Logo dispone de unas primitivas gráficas que están reproducidas, en parte,
en el módulo «turtles.ss». En el módulo «logo.ss» hemos establecido las siguientes
primitivas de Logo:
fd, abreviatura de «forward». Avanza n pixels la tortuga. Se aplica así:
(fd 45).
bk, abreviatura de «back». Retrocede n pixels la tortuga. Se aplica así:
(bk 45).
lt, abreviatura de «left». Gira n grados a la izquierda la tortuga. Se aplica
así: (lt 45).
rt, abreviatura de «right». Gira n grados a la izquierda la tortuga. Se aplica
así: (lt 45).
penup. Al moverse, la tortuga deja un rastro producido por una pluma apo-
yada en el lienzo. (penup) obliga a levantar la pluma y la tortuga se puede
mover pero no produce ningún dibujo.
pendown. Si la pluma está levantada, la baja y la tortuga vuelve a producir
dibujos. Se aplica así: (pendown).
repite. Obliga a que una lista de instrucciones se aplique n veces. Se aplica
así: (repite 10 ( (fd 10) (lt 20) ) ).
clear. Limpia la ventana de la tortuga y coloca a ésta en su posición primi-
tiva. Se aplica así: (clear).
erase. Mueve la tortuga y borra n pixels. Se aplica así: (erase 45).
split. Permite disponer de dos o más tortugas. Por ejemplo: (split (lt 180))
crea una nueva tortuga en el punto donde se encontraba la anterior pero su
flecha apuntará en dirección contraria. Las instrucciones que se apliquen a
continuación, serán realizadas por todas las tortugas. Cuando haya resuelto
el ejercicio 9.o, de los propuestos más abajo, pruebe el lector el siguiente
código:

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 16 — #16


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)))

sleep/yield. Permite retrasar n segundos la aplicación de una instrucción.


Se aplica así: (sleep/yield 2).
1. Supuesta la definición de rectángulo, definir un procedimiento que dibuje
algo así:

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 17 — #17


i i

1.7. PROYECTOS DE PROCEDIMIENTOS 17

2. En el ejercicio anterior habrá definido un procedimiento que ubique la tortuga


en el ángulo superior derecho del cuadrado recién dibujado. En este se trata
de que cada cuadrado tenga un lado de tamaño menor, por ejemplo: 50, 40,
30 y 20.

3. Dibuje un cuadrado de 50 × 50. Gire la tortuga, por ejemplo: (lt 20), y


vuelva a dibujar el mismo cuadrado. Defina un procedimiento que repita
esas dos instrucciones n veces. Pruebe con 3 veces y obtendrá el siguiente
dibujo:

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 18 — #18


i i

18 CAPÍTULO 1. INTRODUCCIÓN

4. Dibuje un cuadrado de 50 × 50. Encima dibuje otro de 40 × 40. Para dibujar


encima habrá de definir otro procedimiento que sitúe la tortuga en el lado
superior, un poco separada del ángulo izquierdo. Si lo repite 4 o 5 veces
tendrá un telescopio.

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

“capitulo-1” — 2010/1/5 — 19:27 — page 19 — #19


i i

1.7. PROYECTOS DE PROCEDIMIENTOS 19

Repita esa misma operación las veces necesarias para conseguir un dibujo
como el siguiente:

6. ¿Cómo podría conseguir el siguiente dibujo, sirviéndose de estas últimas


ideas?

7. Defina un procedimiento que dibuje un polígono regular. Supuesto que se lla-


ma «poligono» y que tiene dos argumentos: número de lados y longitud del la-
do, aplíquelo así: (poligono 3 50), (poligono 4 50), (poligono 360 1).

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 20 — #20


i i

20 CAPÍTULO 1. INTRODUCCIÓN

8. ¿Con qué procedimientos podría dibujar la siguiente imagen?

9. La aplicación de poligono: (poligono 360 1), dibuja un círculo. Si gira


un poco la orientación de la tortuga —por ejemplo: (lt 20)— y lo vuelve
aplicar, se dibuja un segundo círculo un poco a la izquierda y hacia abajo.
Si lo repite un cierto número de veces, conseguirá un dibujo parecido al
siguiente:

i i

i i
i i

“capitulo-1” — 2010/1/5 — 19:27 — page 21 — #21


i i

1.7. PROYECTOS DE PROCEDIMIENTOS 21

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

“capitulo-1” — 2010/1/5 — 19:27 — page 22 — #22


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

1.8.2. Solución a los ejercicios 1.7.2


(define area-cuadrado
(lambda (lado)
(* lado lado) ))

(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

“capitulo-1” — 2010/1/5 — 19:27 — page 23 — #23


i i

1.8. APÉNDICE 23

(sqrt (+ (expt a 2) (expt b 2))) ))

(define cuadrado-binomio
(lambda (a b)
(+ (expt a 2) (expt b 2) (* 2 a b)) ))

i i

i i

También podría gustarte