Los tipos simples, para simplificar, son de dos tipos solamente: o números o palabras. Nada es simple, y todo se puede complicar eventualmente (y lo hará), pero por lo pronto quedémonos ahí.
Arrancamos gore
u otro REPL desde nuestra línea de órdenes, y vamos
a ver cómo trabajar con estos datos. Ábrelo y
empieza a teclear números y palabras por separado
gore> 3
gore> "cosas"
Las palabras llevarán comillas alrededor. Incluso aunque se trate de una sola letra. El intérprete se acuerda de lo último que has tecleado, y puedes acceder a él usando ↑. Repitiendo y editando podemos pasar el día, así que vamos a empezar a hacer algo con estos números. Por ejemplo...
Los ordenadores, en realidad, son calculadoras con complicaciones. Lo más básico que se puede hacer es operaciones aritméticas. Go no tiene nada inesperado en este área. Suma, resta, multiplicación y división
gore> 3*8+5.2/8
que debe dar 24.65, un número real o float
en el argot del
lenguaje.
Adicionalmente, el operador %
te permite hacer división entera
gore> 17 % 3
3
La mayoría de los lenguajes con un intérprete tal como gore
se comportan de una forma similar, aunque algunos pueden tener otros operadores o llamar a los operadores no estándar de otra forma. Por ejemplo, si abres la consola de
desarrollo en tu navegador (con mayúsculas-control-k en Firefox, por
ejemplo), tendrás el mismo resultado, aunque estaremos trabajando en JavaScript.
Y aunque inicialmente hayamos metido a todos los números en el mismo saco, no todos son iguales. Los enteros o naturales y los números reales (los que tienen coma decimal) se comportarán de forma diferente, aunque no habrá que preocuparse (demasiado) por ello ahora mismo.
Los números que Go entiende son los números arábigos, vamos,
los de toda la vida. Si usamos números romanos como Ⅴ no los entenderá como tal,
sino como un carácter y nos dará un error de variable no definida. No en todos
los lenguajes es así. Perl 6 trabaja de forma nativa con este tipo de números,
y Ⅴ+5
resultará en el número 10, y 5**Ⅴ
en 3125. Los lenguajes de
programación, poco a poco, van empezando a usar el potencial completo de
Unicode, pero algunos lenguajes, como Python, JavaScript o Go todavía no han
llegado a hacerlo.
Sin embargo, todos estos lenguajes suelen incluir el operador módulo
y llamarlo %
, este operador devuelve el resto de dividir el
numerador, a la izquierda del mismo, del denominador, a la derecha:
gore> 17 % 11
6
Como buen lenguaje de programación, también podemos
Pero vamos a dar un paso hacia atrás, o hacia un lado, para reconocer que existen letras más allá de nuestro alfabeto latino. Empezando por los emojis, tales como este, ⌣, y terminando con los caracteres de alfabetos vivos o muertos como este ꡡ. Un lenguaje de programación moderno, y un ordenador moderno, debe ser capaz de trabajar con todos ellos.
"þor el poderoso ✌"
Como hemos visto más arriba, las cadenas o strings están rodeadas
por comillas, dobles "
o backticks `
. Las primeras
no pueden contener saltos de línea y permiten la utilización de secuencias
de escape, es decir, caracteres que permiten escribir cosas que no son
exactamente caracteres, como retornos de línea, tabuladores o incluso
colores.
Hemos elegido þ como carácter raro porque es uno de los pocos de este tipo que se pueden teclear fácilmente desde el teclado castellano. þ sale con AltGr + p. Otros caracteres son ß, que sale con AltGr + s u ø, que se obtiene con AltGr + o.
Cualquier tipo de cadena está compuesta por un número de caracteres
determinado, que se halla con len
:
gore> var cadena = "micadena"
gore> len(cadena)
8
Las cadenas están hechas de bytes individuales. Normalmente, cada caracter
ocupa un solo byte
aunque puede darse el caso que caracteres de otros idiomas
por ejemplo, el ruso, ocupen más de un byte
.
Las cadenas están divididas en los caracteres que lo componen, y podemos acceder a ellos
indicando su índice, que comienza por 0: "þor el poderoso ✌"[16]
devolverá el valor en byte
de ✌. También podemos acceder a grupos de
caracteres, usando el rango x:y
. cadena[0:3]
nos devolverá los 4 primeros
caracteres de la cadena. Otra opción válida sería cadena[:3]
. Como al acceder
a un caracter de una cadena obtenemos su valor en byte
y este es un valor
numérico, podemos aplicarle los operadores aritméticos.
Para la concatenación de cadenas, utilizaremos el caracter +
:
gore>> "Nos vamos "+"a la feria"
"Nos vamos a la feria"
Ojo: a partir de aquí es de Python
¿Y qué ocurre cuando tratamos de mezclarlas con los números? Pues que resulta en un error. Aparte de tener tipado pato, Python usa también comprobación dinámica de tipos para saber si se puede aplicar o no una operación a sus operandos. En este caso no encuentra ninguna forma sensata de sumar una cadena a un número, así que simplemente expresa su disconformidad con el asunto, diciendo que se trata de una operación inválida.
En el caso anterior, el intérprete nos ha dicho: TypeError: must be str, not int
. Pero es leer la palabra error y uno empieza a
sentirse culpable. Es culpa mía, todo lo hago mal, voy a empezar de
nuevo hasta que lo consiga.
Pero no hay por qué tomárselo así. Error es simplemente la forma en
la que los ordenadores nos dicen "No te he entendido bien". Los
ordenadores, y los intérpretes de lenguajes, son muy literales y todo
lo interpretan tal y como se ha tecleado. Miran, y si no te entienden te
lo dicen. Pero también te dan a entender que es un problema de
expectativas. Esperaban una cosa, y ha sido otra: must be str, not int
. Debe ser un str
, no un int
. Si fueran capaces de saber de
qué cadena se trata, ellos mismos lo harían. De hecho, algunos otros
lenguajes se comportarán de forma diferente. JavaScript, por ejemplo,
dirá que "3.4"+7
es, naturalmente, 3.47
haciendo una conversión
implícita de un número a una cadena. Otro lenguaje, R, te dirá: Error in "3.4" + 7 : argumento no-numérico para operador binario
. No le
gusta la cadena y no tiene reparos en decirlo, porque R es un lenguaje
estadístico, y por tanto (casi) matemático. Perl, sin embargo, llevará
el tipado pato hasta las últimas consecuencias, dando como resultado
10.4.
Lo que viene a querer decir que lenguajes diferentes van a entender esa expresión, forzosamente ambigua, de forma diferente. Pero si no la entienden, te van a dar alguna pista de por qué no lo han hecho.
Volvamos a Python: TypeError: must be str, not int
te
dice que hay un problema con el tipo de uno de los operandos, que debe
ser una cadena (str
), no un entero. Como sólo hay un entero, el
número 7, eso quiere decir que ahí es donde está el error, al menos
según Python. De hecho, si lo hacemos al revés, 7+"3.4"
, Python nos
dirá:
TypeError: unsupported operand type(s) for +: 'int' and 'str'
que es algo más informativo. Ya no te está diciendo que el entero es
un error, sino que alguno de los dos está equivocado. En las líneas
anteriores, además, te indica dónde ha ocurrido, aunque File "<stdin>", line 1, in <module>
no sea demasiado amigable.
En todo caso, estos mensajes te ayudan a entender dónde ha producido el malentendido y de qué se trata. Aunque estén en inglés (en la mayoría de los casos), conviene leerlos tranquilamente y comprender qué es lo que dicen, porque te da la pista de por qué el ordenador no ha sido capaz de entender lo que se le quería decir. En este caso, porque Python no sabe como sumar dos cosas que tienen un tipo diferente. Simplemente, a la siguiente, se le suministran cosas a los dos lados del signo + que sean compatibles y listos.
Y si todo falla, siempre puedes buscarlo en Internet. Eliminando lo
que sea específico de tu código, como nombres de variable y demás,
puedes
buscar el resto y
llegará, en la mayor parte de los casos,
a
StackOverflow donde
verás contextos similares y una solución al problema. En este caso, te
viene a decir que hay que hacer una conversión explícita:
7+float("3.4")
, lo que está totalmente de acuerdo
con el zen de Python:
>Explícito antes que implícito
Y, por supuesto, toda esta sección se corresponde al de
>Los errores no deben suceder en silencio
Como conclusión a esta sección: si el ordenador no te entiende y te lo dice cortésmente, lee, comprende, trata de adaptarte a lo que requiere, pero si todo falla, Google es tu amigo.
No es malo equivocarse. Sucede en las mejores familias, incluso en las operaciones más básicas. Para las cuales puedes usar Go como si fuera una calculadora un poco más complicada y que usara, además, cadenas de caracteres. Vale, una calculadora complicada y rara.