Está en la página 1de 2

ESTRUCTURAS DE CONTROL

Evaluación condicional

(cond (prueba1 expr1)


(prueba2 expr2)
...
(else exprn))

La primera expresión para la que la prueba resulte ser cierto (cualquier cosa salvo #f
cuenta como cierto) será evaluada. Si todas las pruebas resultan ser #f, se evalúa la
cláusula else.

Una variante de la cláusula cond es

(cond...
(test => expr)
...)

En este caso, expr debe resultar en una función que toma un solo argumento. Si test
resulta ser cierto, se llama a la función anterior con el valor devuelto por test.

Scheme también tiene

(if test then-expr else-expr)

pero se usa mucho menos porque cond es más general y normalmente resulta más
legible.

Bucles

Los bucles en Scheme suelen tomar la forma de una recursión final. Un ejemplo clásico
es la función factorial, que puede definirse sin recursión final como:

(define (factorial n)
(cond ((= n 0) 1)
(else (* n (factorial (- n 1))))))
(factorial 5)
;; => 120

o una función de orden superior como map, que aplica una función a cada elemento de
una lista, puede también definirse sin recursión final de la siguiente forma:

(define (map f lst)


(cond ((null? lst) lst)
(else (cons (f (car lst))
(map f (cdr lst))))))
(map (lambda (x) (* x x)) '(1 2 3 4))
;; => (1 4 9 16)
Podemos definir ambas usando la recursión final como sigue. La expresión let con
nombre y la sentencia do son azúcar sintáctica que simplifica las definiciones con
recursión final.

(define (factorial n)
(let loop ((fact 1)
(n n))
(cond ((= n 0) fact)
(else (loop (* n fact) (- n 1))))))
(factorial 5)
;; => 120

(define (map f lst)


(do ((lst lst (cdr lst))
(res '() (cons (f (car lst)) res)))
((null? lst) (reverse res))))
(map (lambda (x) (* x x)) '(1 2 3 4))
;; => (1 4 9 16)

Adviértase que en ambos casos se prefiere la versión con recursión final debido a su
menor uso de espacio.

Entrada/salida

Scheme tiene el concepto de puertos de donde leer o a los que escribir. Scheme define
tres puertos por defectos, accesibles con las funciones current-input-port, current-
output-port y current-error-port.

Hola Mundo
(let ((hola-mundo
(lambda ()
(display "Hola, mundo")
(newline))))
(hola-mundo))

o, simplemente

(display "Hola, mundo\n")

o, más sencillo todavía

"Hola, mundo"

También podría gustarte