Bienvenido al sector de Internet que no sabías que existía.

domingo, 2 de junio de 2019

Tutorial de Cualquiera++

En esta pequeña guía mencionaremos algunos aspectos de Cualquiera++ que todo principiante debe tener en cuenta a la hora de comenzar a programar en este bello lenguaje. Comencemos:

Vamos a suponer que el lector ya cuenta con los conocimientos básicos de la programación, y se maneja con un nivel intermedio de confianza en otros lenguajes como C++, o C, o el que sea. Este artículo utilizará C++ como referencia a la hora de mencionar las diferencias que Cualquiera++ tiene respecto a C++, debido a que como podemos ver por el nombre, Cualquiera++ se ha basado en C++; de hecho, es una versión completamente mejorada y optimizada. Pero no me adelanto más, ¡empecemos de una vez!

Comportamiento del condicional 'if not' en Cualquiera++
A diferencia de otros lenguajes, Cualquiera++ no cuenta con el clásico operador 'if'. Para evaluar una condición, sólo es posible analizar si la condición no se cumple. Los creadores han optado por hacerlo de esta forma dado que acelera los tiempos de procesamiento y hace que el código sea más difícil de leer, y por lo tanto más difícil de vulnerar (Cualquiera++ es un lenguaje diseñado específicamente para que los hackers no puedan molestar).
Veamos algunos ejemplos:

if not(a > b){{
      // hace algo
}}

En este caso, solo se realiza el contenido dentro del condicional si 'a' no es mayor a 'b', es decir, si 'a' es menor o igual a 'b'.
Como podemos notar, la sintaxis es un poco diferente: se utilizan 2 llaves para abrir un condicional, y para abrir cualquier tipo de bucle o lo que fuera.

Tipos de variables en Cualquiera++
En este lenguaje podemos definir todos los tipos tradicionales admitidos en la mayoría de los lenguajes; es decir, int, float, double, char, etcétera. Tiene un tipo "string" nativo. Como método de prevención, sin embargo, el compilador intentará convertir la variable a todos los otros tipos de dato, por si el programador se ha equivocado a la hora de hacer el código. Por supuesto, ese caso nunca sucede, así que el programa siempre dará error.
Para evitarlo, debemos incluir el comando "please do not convert". Son cuatro comandos por separado, veremos el comando 'please' en detalle más adelante (Cualquiera++ le da mucha importancia a los buenos modales). Entonces, la declaración de una variable podría ser de la siguiente manera:

please do not convert int nota;;;
please do not convert string nombre = "Guido";;;

Podemos ver que es posible inicializar las variables en el momento de su declaración, como en el caso del string, y además vemos otra diferencia en la sintaxis: todos los finales de instrucción terminan con tres puntos y coma. Para asegurarse que el programador no se los olvide. De lo contrario, se dispara un comando 'shutdown' que apagará el ordenador en menos de 5 segundos. ¡Mucho cuidado! Recordemos que Cualquiera++ busca luchar contra el hackeo ilegítimo.

Bucles 'for' y 'while'
Estos dos bucles funcionan casi de la misma manera que en otros lenguajes, a diferencia de que, como no existe el condicional 'if', todos los controles se realizan de forma implícita con un 'if not'. Por lo tanto, se debe indicar que el bucle solamente se romperá cuando (en el caso del for) se agote el iterador, o (en el caso del while), cuando la condición sea falsa. Veamos un ejemplo para clarificarlo:

for (please do not convert int i=0; i<5; i.increaseBy(1)){{
      please do not break;;;
      // hace algo cinco veces
}}

Cosas que podemos notar de ese pedazo de código:
No existe la forma de incrementar una variable como i++, o como i+=1, o como i = i+1. Para ello existe el método increaseBy(num) que le suma 'num' a la variable. Puede utilizarse para operaciones aritméticas, o para sumar 1 en estos casos. Nuevamente, una prueba de que la ilegibilidad de Cualquiera++ es su mayor fortaleza.
Notamos también el uso de la palabra 'please' para indicar que el loop no debe romperse siempre. Es decir, la condición "i<5" se controla internamente con un "if not", por lo que podemos optar por escribir la condición negada, o bien agregar el comando 'please do not break' (internamente lo que hace es negar el resultado del 'if not' para que equivalga a un 'if' tradicional).

NOTA: dentro del "for" se utiliza solo un ";" y no tres.

Veamos el ejemplo de un while:

please do not convert int contador = 0;;;
while(contador < 5 or maybe contador == 5){{
      please do not break;;;
      // hace algo si se cumple la condición
      contador.increaseBy(1);;;
      reminder{{
            please break;;;
      }}
}}

Vemos varias estructuras nuevas en este código. Vamos a explicarlas:
No existe el operador "<=", es decir "menor o igual", por lo que se debe incluir el "igual" como condición separada.
Los operadores lógicos son "and also", "or maybe", "exclusive or maybe", "not really", a diferencia de otros lenguajes. Su uso es análogo a "and", "or", "exclusive or" (pocos lenguajes tienen este notable operador), "not".
El bucle "reminder" se emplea para recordarle al compilador que debe romper el 'while' cuando no se cumpla la condición. Esto se debe agregar cuando el bucle tiene una longitud mayor a 5 líneas, o cuando no estamos seguro si lo recordará. Pues, el compilador solamente recuerda las últimas 3 instrucciones dadas, como forma de optimizar la memoria RAM utilizada.
Solamente debemos incluir un "please break;;;" dentro del mismo en el caso de un while. Podemos ver el bloque 'reminder' utilizado también en otros bucles como el 'switch', o en definición de algunas funciones. Pero eso lo veremos más adelante.

El operador 'please'
A diferencia de otros lenguajes, Cualquiera++ busca tratar de una forma más amigable al programador, y espera lo mismo de quien escriba el código. Por lo tanto, todas las instrucciones descritas a continuación deben incluir el comando 'please' en el comienzo:

  • please break
  • please do not convert
  • please do not break
  • please run
  • please do not shutdown(this)
  • please compile
  • please keep going
Hay algunos más, pero no los incluiremos todos en este artículo para evitar posibles fallas de seguridad. Recalcamos, la esencia de Cualquiera++ es su perfecta seguridad. ¡No podríamos dar todos los comandos así sin más!
Algunos de los comandos que no hemos explicado:
-"please run" se debe incluir al comienzo de cualquier código escrito en Cualquiera++, de lo contario el programa nunca se iniciará.
-"please do not shutdown(this)" es un comando que debe incluirse si uno no desea que ante el menor fallo de optimización su ordenador se apague (Cualquiera++ a menudo interpreta cosas erróneamente como fallas de la seguridad). shutdown(this) es una función de la biblioteca 'safety', que se debe importar al comienzo del programa si se desea incluir el 'please do not shutdown(this)'.

NOTA: Las bibliotecas se importan de la siguiente manera, al comienzo del código:

   please #include <nombreDeBiblioteca> thank{{sys.compiler;;;please do not answer;;;}}
Luego veremos el bloque "thank" en detalle.

NOTA 2: algunos novatos creen que si no se importa la biblioteca 'safety' entonces no se podrá llamar al método shutdown() que apaga el ordenador, pero eso no es cierto. Cualquiera++ puede hacerlo porque tiene otro método idéntico propio. Esta llamada, sin embargo, se anula al utilizar el 'please do not shutdown(this)'

Otro error común es pensar que la parte que dice (this) es un parámetro. Esto es falso. "shutdown(this)" es el nombre completo de la función.

-"please compile" es un comando opcional, que no realiza nada a nivel software, pero genera la ilusión de que el programador está proporcionando motivación y ánimos al compilador, y le genera felicidad.

-"please keep going" es una forma alternativa de escribir 'please do not break'. Su función es exactamente la misma, pero a veces el programador querría optar por cambiar un poco las palabras para no aburrir al compilador.

Los otros comandos que contengan 'please' serán notificados al programador a medida que se tope con el error "#ERRORNAME: BePolite (line X)". Eso significa que en la línea número X falta un comando 'please'.

Definición de funciones
En Cualquiera++, la definición de funciones se escribe de la siguiente manera: (ejemplo con función que suma dos enteros)

please do not convert the following
please let me define functionName(param1, param2){{
      param1 istype int;;;
      please do not convert param1;;;
      param2 istype int;;;
      please do not convert param2;;;
      please do not convert int suma = param1.increaseBy(param2);;;

      please return suma;;;
      thank{{
            functionName;;;
            please do not answer;;;
      }}
}}

Cosas nuevas en este código:
  • 'please let me define' es el comando que se utiliza para definir funciones. Así como en Python es "def", y en Javascript es "function".
  • 'please do not convert' debe ser incluido antes de la definición de la función, pues como Cualquiera++ no admite funciones con tipo de dato (como en C++ uno podría decir "int algo(x,y)", debemos aclararle que no la convierta.
  • 'the following' significa que el tipo de dato al que nos referimos está en la siguiente línea. Esto es análogo a escribir 'please do not convert please let me define functionName' en una sola línea, pero a veces el compilador libera la RAM antes y se olvida lo que está haciendo. Es una buena práctica utilizar 'the following' al definir funciones. No lleva ";;;" al final.
  • 'istype' se utiliza para indicar el tipo de dato que es un parámetro de la función. Esto es obligatorio. Por supuesto, a continuación se le debe indicar que no lo convierta.
  • NOTA: no podemos primero indicar 'istype' para todas las variables y luego indicar que no lo convierta, porque correríamos el riesgo de que el compilador libere RAM y olvide la instrucción.
  • El bloque 'thank', se utiliza para agradecer a la función por haber hecho su trabajo. El bloque 'thank' solo toma como contenido el nombre de la función, y como por default retorna "#ERRORNAME: YouAreWelcome" debemos aclararle que no responda con el statement 'please do not answer'. Pues, el compilador intenta ser educado, pero al solo poder hacerlo mediante un error, el ordenador lo interpreta como una falla de seguridad y se apaga.
NOTA: No utilizamos el bloque "reminder" porque en este caso toda operación está dentro de un margen de 3 líneas. Si tuviésemos la declaración de param1 a 6 líneas de distancia de la declaración de 'suma' como param1.increaseBy(param2), deberíamos incluir un 'reminder{{please keep going;;;}}' en el medio.
Operaciones matemáticas básicas (resta, división, multiplicación)
La suma ya hemos visto que puede ser realizada mediante el comando increaseBy(num). Veamos cómo realizar multiplicaciones:
Dado que no existe ninguna forma de multiplicar dos números, debemos hacer un bucle 'for' que sume X cantidad de veces. Por ejemplo, para hacer 2 * 3:

please do not convert int num1 = 3;;;
please do not convert int num2 = 2;;;
please do not convert int suma = 0;;;
please do not read emoji;;;
for(please do not convert int i=0; i<num1; i.increaseBy(1)){{
      please do not break;;;
      suma.increaseBy(num2);;;
}}

Luego, a "suma" se le sumará "2" unas "3" veces.
Lo único nuevo acá es "please do not read emoji". Esto se debe incluir porque, en este caso, al reemplazar num1 con '3' en la condición del for tendremos "i<3", y el compilador puede interpretar <3 como un corazón y causar un error que apagará la computadora.

Para darle amor al compilador, el programador debe optar por agregar comandos 'please' vacíos.
NOTA: incluir un 'please do not answer', porque Cualquiera++ automáticamente responde con un "#ERRORNAME: YouAreWelcome" y apaga el ordenador.
Ejemplo:

      please;;;
      please do not answer;;;
      please;;;
      please do not answer;;;

Por otro lado, si deseamos multiplicar números que son ambos no enteros (1.5 * 2.3, por ejemplo), o son ambos negativos, deberemos crear un script en otro lenguaje e importarlo como biblioteca, dado que Cualquiera++ no lo admite. Cualquiera++ puede importar bibliotecas en C, C++, o C#.

Sin embargo, si tuviéramos sólo uno de ellos negativo o con parte fraccionaria, no habría problema dado que increaseBy() puede trabajar con cualquier tipo de dato (incluso no números).
Eso sí, debemos aclarar que no convierta el número, y que es un float (o double, o long float, etc.) Por ejemplo, si sumaramos a+1,5:

      a.increaseBy(please do not convert 1,5 float);;;

Y si el número fuera negativo, debemos aclararle que es 0 menos que el número, e incluir el comando 'isnegative' al final, para evitar que se malinterprete como un error (y ya sabemos qué pasa cuando Cualquiera++ halla un error... SHUTDOWN), de la siguiente manera (para hacer a-5):

      a.increaseBy(please do not convert 0-5 isnegative);;;

Esto se debe a que la función increaseBy(x) internamente comienza con la instrucción "x istype auto;;;", sin un 'please do not convert', dado que asume que será un 'int' (y lo convertirá exitosamente, si es un 'int'). Pero 1,5 no es int (es un 'float' o 'double'), y -5 tampoco (es un 'isnegative int', o 'isnegative').

PROTIP:
Para dividir, podemos hacer dos bucles 'for' anidados, que controlen todas las multiplicaciones posibles y guarden el valor cuando se cumpla la condición de que su multiplicación sea igual al primer número. No haremos el programa porque la forma más corta de hacerlo lleva alrededor de 50 líneas.
Sugerimos utilizar otro lenguaje para realizar operaciones aritméticas.

Esto es todo por hoy.
Esto ha sido una breve introducción a Cualquiera++. Recomendamos que experimenten con este maravilloso lenguaje, y encuentren los errores por su cuenta, dado que esa es la mejor manera de aprender. Posiblemente deban encender su computadora varias veces, ya que cualquier error se interpreta como violación de la seguridad. Incluso hay algunos errores que eliminan el sistema operativo completo, o archivos muy importantes.
No diremos cuales, dado que allí radica la gracia y la diversión de aprender Cualquiera++ :)

¡Diviértanse!

Cualquier duda, dejar un comentario; gustosos la responderemos.

Un guiño del escritor:
please thank{{please do not convert reader isObject;;;please do not answer;;;}}

(veremos clases y objetos en otro artículo)