Contenido

Funciones

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
 }

Parámetros

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);
    }
}
Deja 3, 5 y 2

Múltiples parámetros

Desde ReKarel 2.0.0

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);
    }
}
Avanza 2, deja 8 y avanza

Valor de retorno

Desde ReKarel 2.0.0

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.

Valor de retorno entero

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();
        }
    }
}

Valor de retorno booleano

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();
        }
    }
}