Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Manual Scheme
Manual Scheme
; comentario en un línea.
#| comentario en
varias líneas. |#
> 'gato
'gato
> (+ 14 (* 23 42))
VARIABLES Y ASIGNACIONES
Existen varias formas de declarar variables en Scheme. En
general, una variable global se define con la función (define
variable value), mientras que una variable local se define con la
función (let ((variable value) …) body). Se tiene además la
función (set! variable value) la cual permite asignar un nuevo
valor a una variable ya existente.
>x
error: x undefined
; es equivalente a:
> ((lambda (x y)
(* x y)) 3 (+ 3 2))
Nombre de variables
Recordar que Scheme es case-sensitive, por lo cual distingue
entre mayúsculas y minúsculas. El nombre de una variable
debe comenzar con un carácter alfabético, y puede contener
además, caracteres numéricos y otra serie de símbolos (! $ % &
/ * + - . : < = > ? @ _ ~). Siempre se debe procurar que el
nombre de la variable sea lo suficientemente descriptivo.
1. Números
El tipo de dato number se puede clasificar en varios subtipos:
integer (e.g., 5), rational (e.g., 8/3), real (e.g., 5.0) y complex
(e.g., 3+4i).
procedimientos numéricos
(+ a b ...) retorna a + b + ...
(- a b ...) retorna a - b - ...
(* a b ...) retorna a * b * ...
(/ a b ...) retorna a / b / ...
(sqrt a) retorna la raíz cuadrada de a
(abs a) retorna el valor absoluto de a
(sin a) retorna el seno de a
(cos a) retorna el coseno de a
(tan a) retorna la tangente de a
(asin a) retorna el arcoseno de a
(acos a) retorna el arcocoseno de a
(atan a) retorna el arcotangente de a
(max a b c ...) retorna el valor máximo entre los args
(min a b c ...) retorna el valor mínimo entre los args
(remainder a retorna el residuo de a / b
b)
(expt a b) retorna la potencia ab
(exp a) retorna la potencia ea
(log a) retorna el logaritmo en base 10 de a
(gcd a b c ...) retorna el máximo común divisor
(lcm a b c ...) retorna el mínimo común múltiplo
(floor a) retorna a redondeado al piso
(ceiling a) retorna a redondeado al techo
(truncate a) retorna la parte entera de a
(round a) retorna a redondeado
(random k) Retorna un número aleatorio entre 0 y k-1
procedimientos numéricos
(complex? a) retorna #t si a es un número complejo
(real? a) retorna #t si a es un número real
(rational? a) retorna #t si a es un número racional
(exact? a) retorna #t si a es un número exacto
(inexact? a) retorna #t si a es un número inexacto
(integer? a) retorna #t si a es un número entero
(even? a) retorna #t si a es un número par
(odd? a) retorna #t si a es un número impar
(zero? a) retorna #t si a es cero
(positive? a) retorna #t si a es un número positivo
(negative? retorna #t si a es un número negativo
a)
(number? a) retorna #t si a es un número
2. Booleanos
Son un tipo de dato lógico que puede tomar dos valores:
verdadero o falso, los cuales son representados como (#t
#true) y (#f #false) respectivamente. En general son false los
números que representan el 0, las cadenas vacías y las listas
vacías. Todo lo demás es true.
operadores lógicos
(and obj1 obj2 ...) retorna #t si todos los objs son #t
(or obj1 obj2 ...) retorna #t si algún obj es #t
(not obj) si obj es #t retorna #f
operadores de comparación
(= obj1 obj2) retorna #t si obj1 = obj2
(< obj1 obj2) retorna #t si obj1 < obj2
(<= obj1 obj2) retorna #t si obj1 <= obj2
(> obj1 obj2) retorna #t si obj1 > obj2
(>= obj1 obj2) retorna #t si obj1 >= obj2
predicados de igualdad
(= obj1 obj2) compara dos números
(equal? obj1 obj2) compara dos objetos cualquiera
3. Caracteres
Un carácter corresponde aproximadamente con un grafema
(letra, número, signo de puntuación u otro símbolo). En
Scheme, los caracteres (char) tienen la sintaxis #\char (e.g.,
#\a #\b #\c) y se asocian a valores escalares en el estándar
Unicode o ASCII.
6. Parejas y listas
El tipo de dato compuesto más simple es la pareja: una entidad
formada por exactamente dos elementos de cualquier tipo.
Para definir una pareja, Scheme utiliza la función (cons elem1
elem2) (e.g., (cons 'pez #false)).
7. Procedimientos
Una función o procedimiento se considera un tipo de dato
primitivo. Un dato primitivo es aquel que puede ser el valor de
una variable, un argumento de una función, el valor que
devuelve una función o incluso el componente de una
estructura de datos mayor.
CONDICIONALES
(if condición
Se evalúa una condición, si es verdadera se ejecuta la
expresionTrue
expresionTrue, si es falsa se ejecuta la expresionFalse.
expresionFalse)
(cond
(condicion1 exp1) Corresponde a varios if anidados. Ejecuta la exp de la
(condicion2 exp2) primera condición evaluada como verdadera. Si
... ninguna condición se cumple, retorna la exp asociada
(else expn)) al else.
(case (clave)
Permite ejecutar una acción (exp) entre varias en
((value1) exp1)
función del valor (value) de una expresión (clave). Si el
((value2) exp2)
valor de la clave no corresponde a ninguno, se ejecuta
...
la expresión else.
(else expn))
1. Condicional if
La expresión (if condición exp-verdad exp-falso) permite
evaluar una condición y retornar una expresión si dicha
condición es verdadera o falsa (la expresión en caso de que la
condición sea falsa es opcional, se puede omitir).
> (define x 3)
Su sintaxis es la siguiente:
(cond
(condición1 expresión1)
(condición2 expresión2)
...
(else expresiónElse))
> (cond
((> 2 5) "2 es mayor que 5")
((< 1 3) "1 es menor que 3")
((= 3 7) "3 es igual que 7")
(else "ninguna condición es cierta"))
3. Condicional Case
La sentencia case permite ejecutar una de entre varias
acciones en función del valor de una expresión. Primero se
evalúa la expresión clave, dando como resultado un número,
luego se recorren las varias opciones dentro de la estructura
buscando el número que coincida con uno de los valores
disponibles. Cuando se encuentra la primera coincidencia, se
ejecuta la expresión asociada. Si no se encuentra ninguna
coincidencia con ningún valor, se ejecuta la expresión asociada
a la sección else.
Su sintaxis es la siguiente:
> (f 4)
BUCLES Y RECURSIÓN
En programación funcional pura no existe el concepto de bucle,
sin embargo, no es necesario si se tiene la recursión. Una
función es recursiva cuando se llama así misma.
ENTRADA Y SALIDA
procedimientos de entrada
lee lo que se escribe por teclado. Convierte el input en un
(read) dato de tipo símbolo (por lo cual si se escriben varias
palabras, solo guarda la primera)
lee lo que se escribe por teclado. Convierte el input en un
(read-char)
dato de tipo caracter
procedimientos de salida
(newline) imprime en pantalla una línea en blanco
(display obj) imprime en pantalla el objeto especificado
ITERACIÓN
En el paradigma funcional no existe el concepto de iteración,
sin embargo, este es implementado por medio de la
recursividad. Scheme, al ser un lenguaje de programación
funcional impuro, tiene una estructura de iteración simple,
denominada do.
> (factorial 3)
Para ejecutar (factorial 3):
- En la primera iteración i = 3 y a = 1. Como la condición (zero? i) es falsa y no se tiene
una expresión (exp), se realiza entonces una segunda iteración.
- En la segunda iteración i = 2 y a = 3. Como la condición (zero? i) es falsa y no se tiene
una expresión (exp), se realiza entonces una tercera iteración.
- En la tercera iteración i = 1 y a = 6. Como la condición (zero? i) es falsa y no se tiene
una expresión (exp), se realiza entonces una cuarta iteración.
En la cuarta iteración i = 0 y a = 6. Como la condición (zero? i) es verdadera, se retorna
la expresión (res) la cual equivale a a = 6. Por o cual la respuesta de (factorial 3) es 6.
> (divisores 6)
> (sumaInt+ -2 2 1)
"Los parámetros no son enteros positivos "
> (for-each (lambda(x) (printf "~a \n" x)) (list 'a 'b 'c 'd))
a
b
c
d
> (suma 6 4 4)
14