martes, noviembre 17, 2009

Harbour VS xHarbour, Las diferencias verdaderas (Parte 2)

Nuevas instrucciones del lenguaje:

1. FOR EACH

Harbour soporta toda la funcionalidad de xHarobur y ofrece también características adicionales no disponibles en xHarbour:

a) Permite iterar mas de una variable:
         FOR EACH a, b, c IN aVal, cVal, hVal
? a, b, c
NEXT
b) Permite establecer un orden descendente usando la clausula DESCEND:
         FOR EACH a, v IN aVal, cVal DESCEND
? a, b
NEXT
c) Tiene soporte nativo para hashes:
         FOR EACH x IN { "ABC" => 123, "ASD" => 456, "ZXC" => 789 }
? x, "@", x:__enumKey()
NEXT
d) Permite asignar elementos de cadenas de caracteres:
         s := "abcdefghijk"
FOR EACH c IN @s
IF c $ "aei"
c := UPPER( c )
ENDIF
NEXT
? s // AbcdEfghIjk
e) Proporciona a la OOP control de variables enumerativas, lo cual es muy importante cuando mas de una variable es iterada o cuando FOR EACH es llamado recursivamente.
         hVal := { "ABC" => 123, "ASD" => 456, "ZXC" => 789 }
FOR EACH x IN hVal
? x:__enumIndex(), ":", x:__enumKey(), "=>", x:__enumValue(), ;
"=>", x:__enumBase()[ x:__enumKey() ]
NEXT
f) Proporciona un mecanismo OOP muy flexible para sobrecargar el comportamiento del FOR EACH para objetos definidos por el usuario añadiendo a los mótodos enumerativos los métodos __enumStart(), __enumStop(), __enumSkip() los cuales permiten implementar muchos algoritmos enumerativos distintos dependiendo de los datos usados.

g) No tiene ninguna limitación codificada para llamadas recursivas (solo limitado por la memoria disponible y el tamaño del stack del HVM [Harbour Virtual Machine]):
         proc main()
p( 0 )
return
proc p( n )
local s := "a", x
? n
if n < 1000
for each x in s
p( n + 1 )
next
endif
return
En xHarbour existe la función HB_ENUMINDEX() la cual es portada por Harbour en la librería XHB.


2. WITH OBJECT / END[WITH]


En harbour no tiene ninguna limitación codificada para llamadas recursivas (está limitada solo por la memoria disponible y por el tamaño del stack del HVM).
      proc main()
p( 0 )
return
proc p( n )
? n
if n < 1000
with object n
p( n + 1 )
end
endif
return
También utiliza un interfaz OOP como FOR EACH, de tal forma que es posible usar :__withObject() para acceder/asignar el valor actual de WITH OBJECT.

En xHarbour existen las funciones HB_QWITH(), HB_WITHBOJECTCOUNTER() y HB_RESETWITH() las cuales están soportadas por Harbour en la librería XHB.LIB

3. SWITCH / [CASE / [EXIT] / ...] OTHERWISE / END[SWITCH]

En Harbour se usa una tabla de saltos con valores predefinidos que proporciona un aumento de velocidad significativo en comparación con la evaluación secuencial de PCODE como la instrucción DO CASE hace.

En xHarbour SWITCH no usa dicha tabla de saltos y genera un PCODE similar al usado por DO CASE o por IF / ELSESIF y solo el cálculo del valor principal del SWITCH es optimizado y reutilizado para todas las intrucciones de tal forma que el aumento de velocidad es relativamente pequeño.

En xHarbour, en vez de utilizar la clausula OTHERWISE se utiliza DEFAULT.

Los valores que el SWITCH de Harbour soporta números enteros y cadenas de caracteres, ejemplo:
      switch x
case 1 ; [...]
case 10002 ; [...]
case "data" ; [...]
otherwise ; [...]
endswitch
xHarbour soporta unicamente numeros enteros y cadenas de caracteres con un solo caracter como "A", "!", "x", " ", ....

4. BEGIN SEQUENCE [WITH ]
[ RECOVER [ USING ] ]
[ ALWAYS ]
END SEQUENCE

Esta estructura, similar a la de Clipper es unica para Harbour, en xHarbour existe una versión limitada de la estructura anterior de la forma:
      TRY
[ CATCH [] ]
[ FINALLY ]
END
TRY tiene exactamente la misma funcionalidad que:
   BEGIN SEQUENCE WITH {|e| Break(e)}
Con excepción de la implementación de SWITCH, en todas las instrucciones descritas anteriormente, xHarbour causa una reducción del desempeño en la evaluación del PCODE, aun si el programador no las utiliza todas. En Harobur están implementadas de forma distinta de tal forma que no causan sobrecarga ni lentitud a otro código.

Continuará.....

1 comentario:

Anónimo dijo...

¿ Ya Harbour solucionó el problema de que una Sentencia BEGIN SEQUENCE no puede estar dentro de una estructuta DO WHILE ?

Porque este fue uno de los puntos que me hicieron decidirme por xHarbour y su TRY CATCH que lo puedo colocar donde yo quiera y trabaja perfectamente.