Una funcion en Karel es una instruccion definida por el usuario que puede ser llamada en cualquier momento. Se colocan despues de class program { y arriba del bloque de program().
Tienen la siguiente estructura
define NOMBRE () {
INSTRUCCIONES
}
A continuación se muestra un ejemplo de una función que gira a la derecha
class program {
define giraDerecha () {
turnleft();
turnleft();
turnleft();
}
program () {
giraDerecha();
turnoff()
}
}
Alternativamente, se puede usar la palabra clave void en vez de define
void NOMBRE () {
INSTRUCCIONES
}
Las funciones pueden recibir parámetros numéricos que pueden ser usados dentro de la función para cambiar su comportamiento, llevar una cuenta, etc.
Los parámetros se especifican después del nombre de la función:
define NOMBRE (PARAMETROS) {
INSTRUCCIONES
}
Veamos un ejemplo, donde creemos una función que deje tantos zumbadores como se pase en el parámetro
class program {
void dejaZumbadores (cantidad) {
iterate (cantidad) {
putbeeper();
}
}
program () {
dejaZumbadores(3);
move();
dejaZumbadores(5);
move();
dejaZumbadores(2);
}
}
Una función puede recibir más de un parámetro, cada parámetro debe estar separado por comas tanto en la definición de la función como en la llamada, veamos un ejemplo:
class program {
void avanzaDejaAvanza (pasos1, cantidad, pasos2) {
iterate (pasos1) {
move();
}
iterate (cantidad) {
putbeeper();
}
iterate (pasos2) {
move();
}
}
program () {
avanzaDejaAvanza(2, 8, 1);
}
}
Las funciones en Karel además pueden tener un valor de retorno, este puede ser una cantidad numérica o una condición booleana.
Para usar un valor de retorno necesitamos cambiar la definición de la instrucción para que incluya el tipo de dato a ser retornado por la función:
TIPO NOMBRE ([PARAMETROS]) {
INSTRUCCIONES
}
Una vez se especifica el tipo, se retorna el valor usando la sentencia return valor;. Todo los flujos de la función deben retornar un valor.
Para retornar un tipo entero basta con definir la instrucción de tipo int.
Veamos un ejemplo de un código que se orienta al norte.
class program {
// Calcula cuantos giros se necesitan para orientarse al norte
int alNorte() {
if (facingNorth) {
return 0;
}
if (facingEast) {
return 1;
}
if (facingSouth) {
return 2;
}
return 3;
}
program () {
// Usa la llamada como un número, gira tantas veces como retorne alNorte
iterate (alNorte()) {
turnleft();
}
}
}
Para retornar un tipo booleano, es decir, que sea verdadero o falso, se usa el tipo bool.
Veamos un ejemplo de un código quita los zumbadores si estos son 1, 3 o 5.
import rekarel.globals;
class program {
// Determina si el suelo tiene 1, 3 o 5 zumbadores
bool revisa() {
if (beepersOnFloor == 1) {
return true;
}
if (beepersOnFloor == 3) {
return true;
}
if (beepersOnFloor == 5) {
return true;
}
return false;
}
program () {
// Quita los zumbadores validos
if (revisa()) {
while(nextToABeeper )
pickbeeper();
}
}
}