Funciones
En Piola, las funciones se llaman pega. Defines un bloque de trabajo, le das un nombre, y después lo mandas a hacer.
Declaración básica
Section titled “Declaración básica”pega saludar(nombre) { "Wena, " + nombre + "!"}
altiro(saludar("Tulio")) // → Wena, Tulio!altiro(saludar("Bodoque")) // → Wena, Bodoque!La sintaxis es pega nombre(parámetros) { cuerpo }.
Retorno implícito
Section titled “Retorno implícito”La última expresión del cuerpo es el valor que devuelve la función. No necesitas escribir nada extra:
pega titular(periodista, noticia) { periodista + " informa: " + noticia}
altiro(titular("Tulio Triviño", "¡Mañana es sábado!"))// → Tulio Triviño informa: ¡Mañana es sábado!devolver explícito
Section titled “devolver explícito”A veces necesitas salir antes del final. Usa devolver:
pega pronostico_policarpo(temperatura) { cachai (temperatura > 100) { devolver "Señal de mal pronóstico, como siempre" } cachai (temperatura < -50) { devolver "Tampoco eso, Policarpo" } "Pronóstico: " + temperatura + " grados (probablemente equivocado)"}
altiro(pronostico_policarpo(200))// → Señal de mal pronóstico, como siempreSin parámetros
Section titled “Sin parámetros”Una pega puede no recibir nada:
pega es_hora_de_noticias() { altiro("¡Buenas noches!") altiro("Yo me llamo Tulio Triviño") altiro("¡Y esto es 31 minutos!")}
es_hora_de_noticias()Múltiples parámetros
Section titled “Múltiples parámetros”pega reporte_de_campo(reportera, lugar, noticia) { reportera + " desde " + lugar + ": " + noticia}
altiro(reporte_de_campo("Patana", "el desierto", "hace calor aquí"))// → Patana desde el desierto: hace calor aquíFunciones como valores (Próximamente)
Section titled “Funciones como valores (Próximamente)”Las funciones son ciudadanos de primera clase en Piola. Se pueden guardar en variables, pasar como argumentos, y retornar desde otras funciones.
// Guardada en una weawea investigar = pega misterio(ser_vivo) { "El misterio de los seres vivos: ¿Por qué " + ser_vivo + " hace lo que hace?"}
altiro(investigar("el oso"))// → El misterio de los seres vivos: ¿Por qué el oso hace lo que hace?// Pasada como argumentopega presentar(intro_fn, contenido) { wea intro = intro_fn() intro + " — " + contenido}
pega intro_bodoque() { "Juan Carlos Bodoque"}
altiro(presentar(intro_bodoque, "Hoy: los pingüinos"))// → Juan Carlos Bodoque — Hoy: los pingüinosRecursión
Section titled “Recursión”Una pega puede llamarse a sí misma. El ejemplo clásico que confirma que el intérprete funciona:
pega fibonacci(n) { cachai (n <= 1) { n } si no { fibonacci(n - 1) + fibonacci(n - 2) }}
altiro(fibonacci(10)) // → 55Un ejemplo más 31 minutos:
// Cuenta cuántas veces Maguito puede repetir una frase antes de que explotepega repetir(frase, veces) { cachai (veces == 0) { "¡Quiero hacer mi show!" } si no { altiro(frase) repetir(frase, veces - 1) }}
repetir("¡Quiero hacer mi show!", 3)// → ¡Quiero hacer mi show!// → ¡Quiero hacer mi show!// → ¡Quiero hacer mi show!// → ¡Quiero hacer mi show!Closures
Section titled “Closures”Una pega recuerda el entorno donde fue creada. Si una función interna referencia una variable de su función contenedora, la captura:
pega crear_corresponsal(nombre) { pega reportar(noticia) { nombre + " reporta: " + noticia // ← captura 'nombre' del exterior } reportar}
wea patana = crear_corresponsal("Patana Tufillo")wea juanin = crear_corresponsal("Juanín Juan Hope")
altiro(patana("hay tráfico en la autopista"))// → Patana Tufillo reporta: hay tráfico en la autopista
altiro(juanin("Colo-Colo perdió otra vez"))// → Juanín Juan Hope reporta: Colo-Colo perdió otra vezErrores comunes
Section titled “Errores comunes”pega titular(periodista, noticia) { periodista + ": " + noticia}
titular("Tulio")// Error: La pega espera 2 args, le pasaste 1.wea nombre = "Calcetín con Rombos Man"nombre()// Error: 'texto' no es una pega papito.devolver "esto no está dentro de nada"// Error: 'devolver' solo puede usarse dentro de una pega papito.Referencia rápida
Section titled “Referencia rápida”// Forma básicapega nombre(param1, param2) { // cuerpo resultado // ← retorno implícito}
// Con retorno explícitopega nombre(param) { cachai (param == nada) { devolver "sin valor" } "valor: " + param}
// Sin parámetrospega hacer_algo() { altiro("hecho")}
// Guardada en variablewea mi_pega = pega calcular(x) { x * 2}