martes, noviembre 24, 2009

Harbour VS xHarbour, Las diferencias verdaderas (Parte 9)

Funciones con un número variable de parámetros.

Ambos compiladores soportan esta característica, pero en xHarbour no hay soporte para parámetros sin nombre. En Harbour puedes declarar algunos parámetros con nombre y otros sin nombre, como en otros lenguajes de programación:
      func f( p1, p2, p3, ... )
Los parámetros sin nombre puede ser usados en distintas instrucciones pasándolos usando el operador "...".

Por ejemplo como elemenos de un arreglo:
      proc main()
AEval( F( "1", "2", "A", "B", "C" ), {|x, i| qout( i, x ) } )
func f( p1, p2, ... )
? "P1:", p1
? "P2:", p2
? "other parameters:", ...
return { "X", ... , "Y", ... "Z" }
Como índices de un arreglo:
      proc main()
local a := { { 1, 2 }, { 3, 4 }, 5 }
? aget( a, 1, 2 ), aget( a, 2, 1 ), aget( a, 3 )
func aget( aVal, ... )
return aVal[ ... ]
Como parámetros de una función.
      proc main()
info( "test1" )
info( "test2", 10, date(), .t. )
proc info( msg, ... )
qout( "[" + msg +"]: ", ... )

El operador "..." guarda las referencias cuando se envían parámetros y puede ser usando también en bloques de código, por ejemplo:
      bCode := { | a, b, c, ... | qout( a, b, c ), qout( "[", ..., "]" ) }
Todos los parámetros pueden ser accesados usando la función hb_aParams() pero en xHarbour esto funciona correctamente solo para funciones las cuales no usan ningún parámetro local, o declaradas con un número variable de parámetros, o cuando el número de parámetros declarados no es mas pequeño que el número de parámetros enviados, este código ilustra el comportamiento:
      proc main()
p1("A","B","C")
p2("A","B","C")
p3("A","B","C")
p4("A","B","C")
p5("A","B","C")
proc p1
? procname()+"(), parameters:", pcount()
aeval( hb_aParams(), {|x,i| qout(i,"=>",x) } )
proc p2
local l
? procname()+"(), parameters:", pcount()
aeval( hb_aParams(), {|x,i| qout(i,"=>",x) } )
proc p3(x)
? procname()+"(), parameters:", pcount()
aeval( hb_aParams(), {|x,i| qout(i,"=>",x) } )
proc p4(...)
? procname()+"(), parameters:", pcount()
aeval( hb_aParams(), {|x,i| qout(i,"=>",x) } )
proc p5(a,b,c,d,e)
? procname()+"(), parameters:", pcount()
aeval( hb_aParams(), {|x,i| qout(i,"=>",x) } )
En xHarbour solo es posible declarar todos los parámetos sin nombre, ejemplo:
      func f( ... )
y luego acceder a ellos usando las funciones hb_aParams() o PVALUE() (en Harbour se llama HB_PVALUE()). No hay soporte para el uso simultáneo de variables con nombre y el operador "...".

En xHarbour, debido al comportamiento revertido de referencias almacenadas en elementos de un arreglo, las operaciones de asignación a los elementos de un arreglo retornado por hb_aParams(), cambian los parámetros correspondientes pasados por referencia. Esto no sucede en Harbour donde las referencias a los elementos almacenados en un array funcionan como en Clipper.

Continuará...

No hay comentarios.: