Valores Simples

  • Cadenas de caracteres
  • Booleanos y nil
  • Palabras clave
  • Números
    • Aritmética
  • Asignación: def

Valores simples

Antes de poder hacer algo con un lenguaje de programación, necesitamos tener datos para manipular. En Clojure, los datos se representan con valores, y los tipos más simples de valores son los números, las cadenas de caracteres, los booleanos, nil y las palabras claves.

Cadenas de caracteres

¿Qué es una cadena de caracteres? Es un fragmento de texto. Para crear una cadena es necesario delimitar los caracteres con comillas dobles.

El último ejemplo muestra como incluir comillas en una cadena: es necesario escribir una barra invertida antes de las comillas. Asegurate siempre de usar comillas dobles para crear una cadena.

Referencia: String

"Hola, Mundo!"
"Las cadenas pueden contener muchos, muchos caracteres"
"Alicia dijo, \"Podemos ir a tomar el té.\""

Booleanos y nil

Un booleano indica que algo es verdadero o es falso y en Clojure los escribimos como true o false, respectivamente. Cuando programamos, es común hacer preguntas del tipo “¿Hoy es el cumpleaños de tal persona?” o “¿Esta materia se dicta en el primer cuatrimestre?” para saber si algo es cierto. La respuesta a estas preguntas, es un valor booleano.

nil es un valor especial que se utiliza para representar la ausencia de un valor. Una particularidad de nil es que se comporta como false cuando lo usamos donde normalmente usaríamos un booleano mientras que el resto de los tipos de datos se comportan como true.

Referencia: Truthiness

true
false
nil

Palabras clave

Las palabras clave son el tipo de dato que puede resultar más extraño porque, a diferencia de los números, las cadenas de caracteres y los booleanos, no tienen un análogo en el mundo real. A veces ayuda pensar que son un tipo especial de cadena de caracteres que se usa para etiquetar cosas. Es común ver (y usar) palabras clave para las claves de un mapa (un mapa es una estructura de datos que vamos a estudiar en breve).

:trinity
:first
:last

Números

Enteros

Clojure tiene varios tipos de números.

Empecemos con los enteros que incluyen al cero y tanto números positivos como negativos. Se escriben como los escribimos en cualquier otro lado.

0
12
-42

Números decimales

Seguimos con los decimales, a los que también se los llama “de punto flotante”. Los podemos identificar porque contienen un punto decimal.

0.0000072725
10.5
-99.9

Fracciones

Por último, tenemos las fracciones. Una computadora no puede representar perfectamente a todos los números decimales y es posible que utilice una misma representación para más de un número. Esto no ocurre con las fracciones que son siempre exactas. Las podemos reconocer por la barra inclinada “/”:

Es importante tener en cuenta que, al igual que en la clase de matemática, el denominador de una fracción no puede ser igual a 0.

1/2
-7/3

Aritmética

En Clojure, es posible sumar, restar, multiplicar y dividir números. Sin embargo, estas operaciones aritméticas no se escriben en la forma que las escribimos en papel. Veamos algunos ejemplos:

(+ 1 1)  ;=> 1 + 1 = 2
(- 12 4) ;=> 12 - 4 = 8
(* 13 2) ;=> 13 * 2 = 26
(/ 27 9) ;=> 27 / 9 = 3

Notaciones infija y prefija

En notación prefija, los operadores +, -, * y / aparecen antes que los números. Esta notación se ve distinta a la notación a la que estamos acostumbrados, conocida como notación infija, en donde los operadores aritméticos aparecen entre los operandos.

Lenguajes como JavaScript utilizan notación infija, mientras que Clojure utiliza notación prefija exclusivamente. La notación prefija es útil por varias razones, pero antes de enumerarlas, veamos un ejemplo de una expresión infija y su equivalente en notación prefija:

Infija:  1 + 2 * 3 / 4 + 5 - 6 * 7 / 8 + 9

Prefija: (+ (- (+ (+ 1 (/ (* 2 3) 4)) 5) (/ (* 6 7) 8)) 9)

Por qué la notación prefija es mejor?

Precedencia explícita

Hacé de cuenta que te olvidaste el orden en el que tienen que realizarse las operaciones aritméticas. En la expresión infija, vamos a obtener resultados diferentes dependiendo qué operación realicemos primero: la suma o la división. Esto no es un problema con la notación prefija porque la “precedencia” es explícita. En otras palabras, hay un único orden de evaluación posible debido a que cada expresión está delimitada por paréntesis y el operador está siempre delante de los operandos.

Infija:  1 + 2 / 3
Prefija: (+ 1 (/ 2 3))

Menos repetitiva

Otra ventaja de la notación prefija es que no hace falta repetir el operador cuando lo aplicamos sobre varios operandos.

Infix:  1 + 2 + 3 + 4 + 5 + 6 + 7 + 8 + 9
Prefix: (+ 1 2 3 4 5 6 7 8 9)

Aritmética con distintos tipos de números

Hasta ahora estuvimos realizando operaciones aritméticas con enteros únicamente. Sin embargo, nada nos impide utilizar decimales o fracciones:

(+ 4/3 7/8)   ;=> 53/24
(- 9 4.2 1/2) ;=> 4.3
(/ 27/2 1.5)  ;=> 9.0

Asignación: def

Es muy difícil escribir un programa si tenemos que escribir los mismos valores una y otra vez. A través de una asignación podemos darle un nombre a un valor que es mucho más fácil de escribir ¡y recordar! que el valor en sí.

Asginando nombres a valores: def

Podemos asignar un nombre a un valor usando def. El nombre que se le asigna al valor se llama símbolo.

Referencia: Assignment def

(def mangos 3)
(def naranjas 5)
(+ mangos naranjas)
;=> 8

Asignando resultados a símbolos

Como se puede ver en el ejemplo de abajo, las asignaciones no están limitadas a valores simples. Es posible asignar un nombre al resultado de cualquier operación. Además, la última línea del ejemplo muestra cómo utilizar un símbolo para referirse al valor que le fue asignado.

(def frutas (+ mangos naranjas))
(def promedio-frutas (/ frutas 2))
promedio-frutas
;=> 4

EJERCICIO 1: Aritmética básica

  • ¿Cuántos minutos pasaron desde que llegaste al curso?
  • Convertir el resultado de minutos a segundos.

EJERCICIO 2 [BONUS]: Minutos y segundos

  • Convertir 1000 segundos a minutos y segundos.
  • Utilizar números separados para los minutos y los segundos.
  • (quot x y) te da el cociente de dividir x por y.
  • (rem x y) te da el resto de dividir x por y.

Volvé al primer slide, o andá al outline del curriculum.