miércoles, noviembre 18, 2009

Harbour VS xHarbour, Las diferencias verdaderas (Parte 3)

Bloques de código extendidos:

Ambos compiladores soportan en tiempo de compilación bloques de código extendidos, para usar no solo funciones sino también instrucciones y comandos, pero con una pequeña diferencia. Harbour utiliza los delmitadores de bloque de código estándar de Clipper {}
      ? eval( { | p1, p2, p3 |
? p1, p2, p3
return p1 + p2 + p3
}, 1, 2, 3 )
Mientras que xHarbour utiliza los "<>"
      ? eval( < | p1, p2, p3 |
? p1, p2, p3
return p1 + p2 + p3
>, 1, 2, 3 )
En Harbour los bloques de código extendidos trabajan como funciones anidadas y soportan todos los atributos de una función, por ejemplo, pueden tener sus propias variables STATIC u otras declaraciones las cuales son locales al bloque de código extendido únicamente y no afectan al resto del código fuera del bloque.

En xHarbour el compilador no fue totalmente optimizado para soportar dicha funcionalidad, y los bloques de código extendidos fueron agregados a las estructuras del compilador existentes lo que causa que no todas las construcciones del lenguaje trabajen con bloques de código extendidos creando un conjunto de bugs muy serios, por ejemplo, el siguiente código tiene serios errores de sintaxis y sin embargo xHarbour lo compila sin ningún error, lo que causa resultados inesperados en tiempo de ejecución:
      #ifndef __XHARBOUR__
#xtranslate \<|[]| => {||
#xcommand > [<*x*>] => }
#endif
proc main()
local cb, i
for i:=1 to 5
cb := <| p |
? p
exit
return p * 10
>
?? eval( cb, i )
next
return
Se pueden hacer varios ejemplos similares en xHarbour con errores que son causados principalmente por la falta de soporte a funciones anidadas en la estructura del compilador.

Estos errores podrían ser corregidos si se invierte un poco de tiempo en depurar el compilador xHarbour.

Continuará.....

No hay comentarios.: