Expresiones, Literales y Listas
En esta sección, exploraremos los bloques básicos de construcción de valores en pixelWallE: los literales, cómo se combinan para formar expresiones y cómo organizar colecciones de datos usando listas.
Literales
Los literales son valores fijos que aparecen directamente en tu código. Son la forma más simple de expresión, ya que se evalúan a sí mismos.
-
Números: Representan valores numéricos enteros.
10 -5 3 0 -
Cadenas de Texto: Representan secuencias de caracteres, usualmente usadas para nombres de colores, códigos Hex, o mensajes.
"red" "#FF0000" "MiEtiqueta" "Hello PixelWallE" -
Booleanos: Representan valores de verdad: verdadero o falso.
true false -
Listas: Representan una colección ordenada de elementos del mismo tipo base.
List< int > [1, 2, 3]
List < string > ["red", "blue", "green"]
List< bool > [] // Lista vacía -
Llamadas a Funciones: Aunque son operaciones, el *resultado* de una función es un valor que puede ser tratado como un literal dentro de una expresión.
GetActualX() // Esto devuelve un número
IsBrushColor("blue") // Esto devuelve un booleanoConsulta la sección de Funciones para más detalles.
Expresiones
Las expresiones son combinaciones de literales, variables, operadores y llamadas a funciones que se evalúan para producir un valor. Este valor puede ser un número, una cadena de texto, un booleano o una lista.
Expresiones Unarias
Operan sobre un único operando.
-
Negación Numérica (`-`): Cambia el signo de un número.
-10 -(5 + 3) // Evalúa la expresión entre paréntesis primero -
Negación Lógica (`!`): Invierte un valor booleano.
!true // Se evalúa a false
!IsBrushColor("black") // Si IsBrushColor("black") devuelve true, esto evalúa a false
Expresiones Binarias
Operan sobre dos operandos y un operador.
Operadores Aritméticos:
- `+` (Suma)
- `-` (Resta)
- `*` (Multiplicación)
- `**` (Potencia)
- `%` (Módulo - resto de la división)
- `/` (División)
10 + 5 # Se evalúa a 15
GetActualY() * 2 # Multiplica la posición Y actual por 2
(GetActualX() + 1) / 2 # Suma 1 al resultado de GetActualX, luego divide por 2
4 ** 2 # Se evalúa a 16
10 % 3 # Se evalúa a 1
La suma (`+`) también puede ser utilizada para concatenar cadenas de texto.
"Pixel" + "WallE" # Se evalúa a "PixelWallE"
"Tamaño: " + GetCanvasSize() #Concatena texto y número (conversión automática)
Operadores Lógicos y de Comparación:
- `<` (Menor que)
- `<=` (Menor o igual que)
- `>` (Mayor que)
- `>=` (Mayor o igual que)
- `==` (Igual a)
- `!=` (Distinto de)
- `&&` (AND lógico)
- `||` (OR lógico)
GetActualX() > 100 # ¿Es la posición X mayor que 100? (Booleano)
IsColor("#00FF00", 5, 5) == true # ¿El píxel en (5,5) es verde? (Booleano)
true && (GetCanvasSize() > 50) # ¿Verdadero Y el lienzo es mayor de 50? (Booleano)
"red" != "blue" # ¿"red" es distinto de "blue"? (true)
Agrupación con Paréntesis
Los paréntesis `()` se usan para controlar el orden de evaluación de las expresiones, asegurando que ciertas partes se calculen antes que otras. Esto es fundamental para la claridad y la lógica de tus cálculos.
(5 + 3) * 2 # La suma (8) se hace antes que la multiplicación (8 * 2 = 16)
5 + (3 * 2) # La multiplicación (6) se hace antes que la suma (5 + 6 = 11)
Listas
Las listas son colecciones ordenadas y mutables de elementos del mismo tipo base (números, cadenas de texto o booleanos). Son útiles para almacenar y manipular conjuntos de datos, como una secuencia de colores o coordenadas.
Declaración e Inicialización
Se declaran usando la palabra clave List, seguida del tipo base de los elementos entre <> y un nombre identificador (el nombre de tu lista). Se pueden inicializar al mismo tiempo con un literal de lista.
myNumbers <- List< int >[1, 5, 10, 20]; # Declara e inicializa una lista de enteros
colors <- List< string > ["red", "green", "blue", "#FF0000"]; # Declara e inicializa una lista de cadenas
emptyList <- List< bool > []; # Declara e inicializa una lista de booleanos vacía
Una vez declarada, puedes asignar una nueva lista del mismo tipo.
myNumbers <- [100, 200]; # Reemplaza el contenido de myNumbers
Acceso a Elementos
Se accede a los elementos individuales por su índice (posición) dentro de la lista, usando corchetes [] después del nombre de la lista. Los índices en pixelWallE, como en muchos lenguajes, comienzan desde 0 para el primer elemento.
firstNumber = myNumbers[0]; # firstNumber ahora vale 1 (o 100 si se reasignó antes)
secondColor = colors[1]; # secondColor ahora vale "green"
lastColor = colors[colors.Length - 1]; # Accede al último elemento usando Length
Nota: Intentar acceder a un índice que no existe en la lista (un índice negativo o un índice mayor o igual que la longitud de la lista) generará un error de ejecución.
Métodos de Lista
Las listas tienen métodos integrados (funciones asociadas a la lista) para manipular sus elementos. Se llaman usando un punto . después del nombre de la lista, seguido del nombre del método y paréntesis () si el método requiere argumentos.
-
Add(item): Añade elitemespecificado al final de la lista. El tipo delitemdebe coincidir con el tipo base de la lista.myNumbers.Add(25); # myNumbers se convierte en [..., 25] colors.Add("yellow"); # colors se convierte en [..., "yellow"] -
RemoveAt(index): Elimina el elemento en elindexespecificado. El índice debe ser un número válido dentro del rango de la lista.myNumbers.RemoveAt(1); # Elimina el segundo elementoNota: Eliminar un índice fuera de rango generará un error de ejecución.
-
Clear(): Elimina todos los elementos de la lista, dejándola vacía.colors.Clear(); # colors ahora es una lista vacía [] -
Length: (Es una propiedad, no un método, por lo que no lleva `()`) Devuelve el número de elementos en la lista como un número entero.numColors = colors.Length; # numColors contendrá el número actual de elementos en colorsSe usa comúnmente para iterar sobre la lista o para verificar si está vacía.