Una funcion en Karel es una instruccion definida por el usuario que puede ser llamada en cualquier momento. Se colocan despues de iniciar-programa y arriba del bloque de ejecución.
Tienen la siguiente estructura
define-nueva-instruccion NOMBRE como
INSTRUCCION;
A continuación se muestra un ejemplo de una función que gira a la derecha
iniciar-programa
define-nueva-instruccion gira-derecha como
inicio
gira-izquierda;
gira-izquierda;
gira-izquierda;
fin;
inicia-ejecucion
gira-derecha;
apagate;
termina-ejecucion
finalizar-programa
Puedes usar el alias define en vez de define-nueva-instruccion.
define gira-derecha como
inicio
gira-izquierda;
gira-izquierda;
gira-izquierda;
fin;
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) como
INSTRUCCION;
Veamos un ejemplo, donde creemos una función que deje tantos zumbadores como se pase en el parámetro
iniciar-programa
define dejaZumbadores (cantidad) como
inicio
repetir cantidad veces
deja-zumbador;
fin;
inicia-ejecucion
dejaZumbadores(3);
move();
dejaZumbadores(5);
move();
dejaZumbadores(2);
termina-ejecucion
finalizar-programa
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:
iniciar-programa
define avanzaDejaAvanza (pasos1, cantidad, pasos2) como
inicio
repetir pasos1 veces
avanza;
repetir cantidad veces
deja-zumbador;
repetir pasos2 veces
avanza;
fin;
inicia-ejecucion
avanzaDejaAvanza(2, 8, 1);
termina-ejecucion
finalizar-programa
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 como
INSTRUCCIONES;
O con parámetros:
TIPO NOMBRE como
INSTRUCCION;
Una vez se especifica el tipo, se retorna el valor usando la sentencia regresa 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 define-cálculo.
Veamos un ejemplo de un código que se orienta al norte.
iniciar-programa
{ Calcula cuantos giros se necesitan para orientarse al norte }
define-calculo alNorte como
inicio
si orientado-al-norte entonces
inicio
regresa 0;
fin;
si orientado-al-este entonces
inicio
regresa 1;
fin;
si orientado-al-sur entonces
inicio
regresa 2;
fin;
regresa 3;
fin;
inicia-ejecucion
{ Usa la llamada como un número, gira tantas veces como retorne alNorte }
repetir alNorte veces
gira-izquierda;
termina-ejecucion
finalizar-programa
Para retornar un tipo booleano, es decir, que sea verdadero o falso, se usa el tipo define-condición.
Veamos un ejemplo de un código quita los zumbadores si estos son 1, 3 o 5.
usa rekarel.globales;
iniciar-programa
{ Determina si el suelo tiene 1, 3 o 5 zumbadores }
define-condicion revisa como
inicio
si zumbadores-del-piso == 1 entonces
regresa verdadero;
si zumbadores-del-piso == 3 entonces
regresa verdadero;
si zumbadores-del-piso == 5 entonces
regresa verdadero;
regresa falso;
fin;
inicia-ejecucion
{ Quita los zumbadores validos }
si revisa entonces
inicio
mientras junto-a-zumbador hacer
coge-zumbador;
fin;
termina-ejecucion
finalizar-programa