miércoles, 29 de diciembre de 2010

ATS - Tuplas, Funciones, local binding...

En este post se muestra un programa en Applied Type System (ATS) cuya finalidad es saber si un número es divisible de otro. Para esto se programa una función recursiva

fn menor(x:int, y:int): bool = if y > x then true else false
fun isDiv(x:int, y:int): bool = if x > y then isDiv(x-y, y) else ~menor(x,y)



Entre otras cosas se añade la detección automática de errores en los parámetros enviados:
  • Verificar errores en la cantidad de argumentos
  • Verificar valores positivos en los argumentos
El código implementado es el siguiente:

/* Probando Tuplas, declaracion de funciones
 *  y local binding
 * atscc -o manyFun manyFun.dats
 * ./manyFun 
*/


// Funcion recursiva para saber si un numero es divisible de otro
fn menor(x:int, y:int): bool = if y > x then true else false
fun isDiv(x:int, y:int): bool = if x > y then isDiv(x-y, y) else ~menor(x,y)


// Main
implement main(argc, argv) = let
  // Verificar errores en la cantidad de argumentos
  val () = 
  if argc < 3 then begin
    prerrf ("Cantidad de argumentos erronea: %i", @(argc));
    exit 1;
  end
  val () = assert(argc >= 3)
  // Asignar los argumentos en los variables
  val n1 = int1_of (argv.[1])
  val n2 = int1_of (argv.[2])
  // Verificar valores positivos en los argumentos
  val () = 
  if n1 < 1 then begin
    prerrf ("Argumento: %i debe ser positivo", @(n1));
    exit 1;
  end
  val () = assert(n1 >= 1)
  val () = 
  if n2 < 1 then begin
    prerrf ("Argumento: %i debe ser positivo", @(n2));
    exit 1;
  end
  val () = assert(n2 >= 1)
  
  in // Realizar operaciones
    printf("%d divisible entre %d ???: \n", @(n1, n2));
    print(isDiv(n1, n2)); print_newline();
  end

Para detalles sobre algún aspecto particular puede consultarse también el tutorial de ATS. Añado también un video que demuestra el funcionamiento del código:

Saludos
faith4of9the5heart

No hay comentarios:

Publicar un comentario