lunes, 22 de noviembre de 2010

REGLAS SEMANTICAS

Podemos encontrar el retorno de múltiples valores implementado en otros lenguajes con comportamientos diferentes. Por ejemplo, en el lenguaje LISP cuando se quiere obtener el valor retornado de una función que no retorna ningún valor el resultado es la constante NIL. En esta situación CoSeL genera una excepción. Como no hay ningún buen referente, se ha preferido definir la semántica o comportamiento que tendrán las funciones cuando se utiliza el retorno de múltiples valores. Definiremos este comportamiento a partir de ver todas las situaciones posibles.

Caso 1: Llamada Normal y Retorno de Ningún Valor

Cuando se llama a una función se espera que esta retorne un valor. Por lo tanto, en el caso que no retorne ningún valor se producirá una excepción. Esto se puede conseguir con la instrucción return void. Este comportamiento es muy util en las funciones de búsqueda, ya que en caso que no encuentre el valor buscado retornarán void. Si el código que llama a la función necesita obligatoriamente el valor buscado, se producirá una excepción indicando que algo ha ido mal en la ejecución del programa. Si no se genera la excepción, lo normal es que se produjera una excepción mas adelante y no quedaría claro que su origen era no haber encontrado un valor buscado.
La excepción por retornar cero valores la genera return void. Si queremos indicar una excepción diferente a la estandar se puede poner entre parentesis detras de void tal como sigue return void(excepción).

Caso 2: Llamada Normal y Retorno de Varios Valores

En CoSeL, el caso que se realiza una llamada normal y se retornan varios valores se considera correcto. El valor que se retornará será el de la primera expresión del return y el resto de expresiones ni se calcularán. Se ha considerado este comportamiento para conseguir que las funciones que retornan múltiples valores se puedan utilizar como funciones normales.
Por ejemplo, la función media calcula la media de los valores de una lista. Durante el cálculo obtiene la suma de todos los valores. Entonces, puede ser interesante retornar la media y la suma por si es necesaria.
Fun Media(l:List) =>
{
    Var suma=0.0;
    for (v<-l) suma=suma+v;
    return suma/l.Length, suma;
}
media([1,2,3,10,5])         --> 4.20000
values(media([1,2,3,10,5])) --> (4.20000,21.0000)

Caso 3: Llamada para Retorno de Múltiples Valores

Cuando se realiza una llamada que espera el retorno de un cierto número de valores y se retorna un número diferente se produce una excepción. Se ha considerado este comportamiento para facilitar la detección de bugs durante la ejecución de un programa. Otro comportamiento menos quisquilloso sería considerar correcto que se retornen más valores de los indicados en la llamada. Ya que esto podría esconder bugs en los programa, se obliga a indicar explicitamente esta posibilidad.

No hay comentarios:

Publicar un comentario