Cómo definir una función
Como se puede apreciar en la gramática del lenguaje, a la hora de definir una función se pueden hacer para varias a la vez, siempre y cuando todas vayan a tener exactamente los mismo tipos, tanto en sus parámetros como en su tipo de retorno, y sean además condicionales o no.
Para definir una función se escribirá primero su nombre. Éste debe empezar por letra y puede ir seguido de tantas letras, números o “_” como se desee. Si queremos definir más de una función de golpe bastará con poner una coma “,” y seguidamente escribir otro nombre de función, así tantas veces como queramos.
Una vez definidos todos los nombre de funciones se procederá a escribir “:” lo que implica que comenzamos a definir sus tipos.
Una función puede tener o no parámetros de entrada, es decir, argumentos. Pero siempre ha de tener un tipo de retorno.
Si la función que estamos definiendo tiene algún argumento, entonces escribiremos a continuación el nombre del tipo del primer argumento. Éste tipo debe ser uno de los siguientes:
-El mismo tipo que estamos especificando.
-Uno de los tipos genéricos definidos en la zona de GENÉRICOS.
-Alguno de los tipos declarados en la zona de dominios.
Si el tipo es alguno de los definidos en los dominios, y este a su vez posee genéricos que esperan ser instanciados, es aquí donde debemos instanciarlo.
Si el tipo es el propio que estamos definiendo, éste nunca debe aparecer
instanciado ya tenga genéricos o no.
Si queremos definir más argumentos de entrada para la función que
estamos definiendo, bastará con escribir una coma “,” y volver a
repetir la operación.
Una vez terminada
la zona de definición de parámetros de entrada escribiremos “->”
o “-/>” dependiendo de cómo queramos que sea la función. Si
escribimos “-/>” estaremos declarando al función como condicional
y por lo tanto deberemos escribirle al menos una precondición en la zona de
precondiciones. Si por el contrario escribimos “->” significará que la función
que estamos definiendo no está condicionada.
Seguidamente escribiremos un único tipo de retorno para la función que
estamos definiendo de igual modo en que se especificaron los tipos de los parámetros
de entrada.
Y con esto queda definida una nueva función dentro del tipo que estemos
especificando, o varias en su caso. Veamos algunos ejemplos:
Suma,producto:Natural*Natural->Natural
SumaLista:Lista-/>Natural
OrLista:Lista(Lista(Natural))->Booleano
Crear:->Pila