Notas de las versiones Euphoria

 
Versión 2.4 Edición Oficial, 3 de Julio de 2003:

  • Se extendieron define_c_proc() y define_c_func(), por lo que además de definir rutinas de C en .dll's externas y librerías compartidas, ahora puede definir los parámetros y valor de retorno para una rutina en código de máquina que su programa ponga en su propia memoria. Puede llamar a la rutina en código de máquina usando c_proc() o c_func(). Gracias a Daniel Kluss.
  • Mejora de rendimiento: get4() y put4() en database.e se aceleraron levemente. Son muy importantes en la velocidad final de EDS. Gracias a Derek Parnell.
  • Mejora de rendimiento: get_bytes() es mucho más rápida cuando la cantidad de bytes requeridos excede bastante la cantidad de bytes que quedan en el archivo. Gracias a Pier Feddema.
  • Traductor: Al traducir una rutina Euphoria enorme (varias cientas de sentencias Euphoria), el Traductor ahora llamará a una rutina desreferenciada, en lugar de usar sentencias de C en-línea. Esto reduce la posibilidad de exceder el límite de tamaño impuesto por el compilador C (especialmente Watcom C). También reduce el tamaño del .exe. Puesto que la rutina desreferenciada es más probable que esté en el cache que las sentencias en-línea, la diferencia de velocidad no es tan grande.
  • Código Fuente del Intérprete: se agregó runtime windows=4.0 en watexw.bat, al comando de enlace para generar exw.exe.
  • Se agregaron algunas verificaciones para tipos de argumento inválido y tipo de retorno inválido en las llamadas a define_c_func() y define_c_proc().
  • Algunos mensajes de errores de sintaxis son más descriptivos cuando están involucrados los identificadores de espacio de nombres.
  • Se modificó el programa tutorial filesort.ex para hacerlo más usable bajo Linux y FreeBSD.
  • Por defecto, safe.e es ahora menos estricto, verificación "solo bordes" de corrupción de la memoria, cuando la plataforma es WIN32. Frecuentemente, los programas Windows acceden a memoria que no se asignó usando allocate() de Euphoria.
  • error corregido: Cuando una constante literal de punto flotante en un programa Euphoria era más grande que 1e308, el Traductor ponía "inf" en init_.c. Esto provocaba qye el compilador de C emitiera un error de símbolo no definido. Gracias a Juergen Luethje.
  • error corregido: En un caso raro, el Traductor fallaba al emitir el código C para hacer una copia de una secuencia con múltiples referencias a ella, antes de sobrescribir un elemento de esa secuencia. Gracias a Juergen Luethje.
  • error corregido: En ciertos casos, cuando un programa Euphoria intercambiaba datos con una .dll escrita en Euphoria, los datos podían no liberarse (hasta que el programa terminaba). Gracias a Wayne Overman (Euman).
  • error corregido: Si utilizaba "asm" en su programa como una variable privada o nombre de parámetro, el Traductor usaría "_asm" en el código C. Esto no es aceptado por algunos compiladores de C. El Traductor ahora evitará de usar "_asm", tanto como "_try", "_Seg16", "_stdcall" y varios otros nombres de comienzan con un guión de subrayado que están reservados por varios compiladores de C. Gracias a George Papadopolous y Matt Lewis.
  • error corregido: Si el parámetro HOT_KEYS en ed.ex fuera fijado a FALSO, entonces Esc h Enter no bring up el indicador de ayuda. Gracias a J. Brown.

 
Versión 2.4 Edición Beta, 10 de Abril de 2003:

Esta edición actualiza los productos Intérprete Euphoria, Traductor Euphoria a C, y el Código Fuente del Intérprete, para Windows, DOS, Linux y FreeBSD.

Nuevas Características

  • bind y shroud ahora tienen la opción -out para especificar el archivo de salida, por lo tanto no se le pedirá que lo informe. Gracias a Jonas Temple, Rusty Davis y otros.
  • bind y shroud ahora tienen la opción -quiet que elimina las estadísticas y mensajes normales, y por lo tanto elimina la ventana emergente que normalmente aparece. Solamente se informan los errores. Gracias a Jonas Temple.
  • El mensaje de error de espacio de nombres que se emite cuando usted se refiere a un símbolo global que se define en dos o más archivos, ahora le da una lista de todos los archivos donde ese símbolo está definido. Gracias a Derek Parnell y Irv Mullins.
  • Traductor: En muchos casos, el código C generado para remainder(), la multiplicación entera y compare() es más pequeño y más veloz.
  • exw, ecw -wat: La desasignación del espacio para los números enormes de objetos pequeños (átomos o secuencias pequeñas) es mucho más rápida que en 2.4 Alpha. Gracias a Andy Serpa. (Observe que la asignación de números enormes de objetos pequeños en exw, o ecw -wat, se aceleró mucho en 2.4 Alpha, y ahora es mucho más rápida).
  • Cuando se crea el archivo ex.err, cualquier advertencia emitida por el programa se listará al final del archivo ex.err. Gracias a Al Getz.
  • El nombre del archivo ahora se incluye en el mensaje de alerta que obtiene para algunas de las advertencias comunes (variable no usada, variable no asignada a). Gracias a Al Getz.
  • Nuevo ícono: En Windows, los archivos de inclusión de Euphoria ahora están rotulados con la versión de escala de grises del icono E) de Euphoria. Esto le permite distinguir fácilmente los archivos ejecutables de los de inclusión. Gracias a Wolfgang Fritz.
  • Los subíndices de punto flotante fuera de límite se informaban después de redondear hacia el entero inferior. Ahora se informa el valor antes de redondear.
  • Euphoria Database System (EDS): db_rename_table() verifica si la tabla destino existe, antes de renombrarla. Gracias a Mike Nelson.
  • El primer valor devuelto por rand() (en ausencia de set_rand()) es ahora más "aleatorio". Gracias a Aku.

Errores corregidos

  • error corregido: Debido a cambios hechos en 2.4 Alpha, la rutina dir() para Borland y Lcc concatenaba los caracteres de atributos de archivos (si existían) al nombre del archivo. Gracias a Dr. Juan R. Herguijuela.
  • error corregido: No se emitía un mensaje de error cuando ')' seguía inmediatamente a ',' en una lista de declaración de parámetros de una rutina. Gracias a Brage Moris.
  • error corregido: Los subíndices positivos fuera de límite enormes (sobre 2 billones) se informaban como valores negativos enormes.
  • error corregido: repeat(0, size), donde 'size' era un número de punto flotante enorme, se informaba incorrectamente : "la cuenta de repetición no puede ser negativa". Ahora informa: "la cuenta de repetición es demasiado grande". Gracias a Martin Stachon.
  • error corregido: machine_proc(x, 5), donde 'x' era un número de punto flotante muy grande, informaba incorrectament: "se esperaba un entero, no una secuencia". Ahora informa: "El primer argumento para machine_proc/func tiene que ser un entero positivo pequeño". Gracias a Martin Stachon.

Versión 2.4 Edición Alfa, 21 de Febrero de 2003:

Nuevas Características

  • La mayoría de las excepciones a nivel de máquina (peek/poke a direcciones incorrectas, etc.) tanto en el programa principal como en las .dll, ahora las captura exw y exu, y se informan de la forma usual con un trazado completo yel volcado de variables en ex.err. Esto es una gran mejora respecto de los crípticos mensajes a nivel de máquina que normalmente obtiene al usar lenguajes compilados y en la mayoría de los lenguajes interpretados como "violación de segmento", "instrucción ilegal", etc. Gracias a Martin Stachon.
  • Además de __stdcall, ahora se soporta la convención de llamadas de C __cdecl, para llamadas a rutinas de C en .dll y también en call-backs a rutinas de Ephoria desde código C.
  • El soporte de nombres largos de Euphoria en DOS se extendió a Windows XP.
  • La ventana de trazado le muestra secuencias grandes en una vista formateada en una pantalla separada. Puede desplazarse a través de la secuencia completa.
  • pretty_print() se agregó a misc.e, mostrándole los objetos Euphoria con una vista agradable, estructurada y con muchas opciones de formato.
  • La impresión formateada de secuencias se hace ahora en ex.err, el comando ? y db_dump().
  • Euphoria Database System (EDS): db_rename_table(name, new_name) se agregó a database.e. La rutina fue provista por Jordah Ferguson, e incluida solamente con cambios triviales.
  • Linux/FreeBSD: system() no inicializa más curses cuando todavía no existe la ventana de la consola. Gracias a Daniel Johnson.
  • Se elevó a 30 la cantidad de niveles anidados de los archivos de inclusión (desde 10). Gracias a Tone Skoda.
  • Las rutas de las sentencias Include, pueden estar encerradas entre comillas dobles, de forma que las rutas que contienen espacios en blanco se pueden manejar correctamente. Esto se implementó realmente en 2.3, pero nunca fue documentado.
  • exw.exe, y cualquier ejecutable producido por el Traductor con Watcom, ahora tiene el subsistema establecido a 4.0, en lugar de 3.1. Esto mejora la apareciencia de la interfaz de usuario en algunos casos. La utilidad make31.exw creará una versión de exw.exe que soporte la interfaz de usuario de Windows 3.1 como antes, en el caso inverosímil que haya problemas de compatibilidad con Euphoria 2.3. Gracias a H. W. Overman, Brian Broker y otros por recomendar este cambio.
  • makecon.exw - creará una versión de exw.exe que opera como aplicación de consola - no emerge una ventana de consola, y se pueden redireccionar stdin/stdout.
  • trace(1, 2 y 3) se permiten ahora con bind -clear (todavía no está permitido con shrouded bind por cuestiones de seguridad). Gracias a Jonas Temple.
  • Traductor: Ahora puede hacer una .dll de Euphoria usando Lcc y usarla con programas interpretados corriendo bajo exw, y programas traducidos usando Borland y Watcom. Previamente, el programa principal se tuvo que compilar con Lcc.
  • Traductor: no usa más las opciones -m486 o -mpentium disponibles con GCC y DJGPP. Esas opciones causaban advertencias y el compilador de C, aparentemente establece el modelo de máquina correctamente por sí mismo. Gracias a Ken Rhodes.
  • Traductor: realizará ahora llamadas automáticas a tipos definidos por el usuario, en el caso inusual donde la rutina de tipos tenga efectos colaterales (establecer variables globales, operaciones E/S, etc.). Gracias a Andy Serpa.
  • euphoria\demo\bench compara el Intérprete de Euphoria y el Traductor Euphoria a C contra más de otros 20 lenguajes interpretados.

Migración

  • Hemos migrado el Intérprete y Traductor a FreeBSD. El fuente tiene ahora varios #ifdef de C para FreeBSD.
  • Andy Cranston migró Euphoria a HP Unix, y planea hacerlo para Sun Unix.

Optimizaciones

- Intérprete -

  • Los típicos subrangos grandes son más rápidos. Cerca del 30% más rápidos para subrangos de 100 a 50000 en longitud (el consumo de recursos domina en los subrangos pequeños, y la carencia de cache afecta a los subrangos más grandes). Esto asume que el subrango es principalmente de números enteros (generalmente cierto), y se hace una copia real de los datos (generalmente cierto desde v1.4b).
  • Las sentencias que contienen múltiples concatenaciones &, son más rápidas.
            por ejemplo, en lugar que:
                 result = a & b & c
                 sea evaluada como:
                   1. copia a y b en temp
                   2. copia temp y c en result 
                      (a y b se copian dos veces!)
      
                 Ahora hacemos:
                   1. copia a, b y c directamente en result
    Por tanto, hay menos copiado de datos y pocas secuencias temporales para crear. Los operadores & adicionales en una expresión, (cuanto mayor es la aceleración), por ejemplo, con 3 operadores & algunos de los datos se copiaron 3 veces, etc. Jordah Ferguson precisó que esto era lento.
  • El tiempo implicado en llamar y volver de una rutina de call-back de Euphoria ha sido reducido cerca de 10%.
  • En exw y ecw -wat, la asignación del espacio para una gran cantidad de objetos es más rápida. Puede ser enormemente más rápida cuando están implicados centenares de millares o de millones de objetos.
  • Una compresión mejor UPX ha bajado algunos Kb de exw.exe contra 2.3 (aunque se agregó nuevo código). Gracias a Wolfgang Fritz.

- Sistema de Base de Datos Euphoria -

  • Las claves y registros se leen más rápido, debido a la rutina decompress() más rápida. Casi dos veces más rápida cuando la clave o los registros que se recuperarán constan principalmente de secuencias de caracteres o de números enteros pequeños. Este caso es absolutamente común.
  • El asignación del nuevo espacio en una base de datos es mucho más rápido, hasta 4 veces más, especialmente en bases de datos grandes con una lista grande de bloques libres.
  • La insersión y borrado de registros en tablas enormes son ahora mucho más rápidos. Combinado con los subrangos más veloces en Euphoria 2.4, database.e es ahora cerca de un 25% más rápida para una tabla con 10,000 registros y más de 3 veces más rápida para una tabla con 100,000 registros. Esto importa realmente solamente si usted está intentando insertar/borrar cientos de registros por segundo. En el caso típico de un operador humano que ingresa datos a través de la interfaz de usuario, usted nunca notaría el tiempo de insersión/borrado para un registro (algunos milisegundos). Derek Parnell precisó la lentitud.
  • db_select_table() es significativamente más rápida.
  • get4() es más rápido.

- Otras Optimizaciones -

  • bytes_to_int() en machine.e es más de 2 veces más rápido.
  • gets() es un 5% más rápido.
  • sort() y custom_sort() son un poco más rápidas. Gracias a Ricardo Forno por optimizar el algoritmo Shell sort.
  • Se agregaron al Traductor varias optimizaciones más. Esto produce ejecutables que son más pequeños y más rápidos que los de la versión 2.3. El Traductor 2.4 se probó exitosamente en cientos de miles de líneas de código Euphoria sin conocerse hasta hoy errores en la generación del código. Algunos resultados de las pruebas de rendimiento del Traductor están en euphoria\demo\bench.

Errores Reparados

- Código Fuente -

  • error corregido: El archivo por lotes gnubsd refería a syncolor.c y syncolor.o. (gnuexu estaba bien).
  • error corregido: Karl Bochert indicó un cambio necesario en el código de C para hacer que poke() trabaje con versión más reciente de Lcc. El cambio corrigió el Traductor (con versiones recientes de Lcc) y el Código Fuente del Intérprete (compilado con Lcc).

- Intérprete -

  • error corregido: Una cancelación del programa puede ocurrir en situaciones cuando una rutina call-back se llama indirectamente en forma recurrente. Gracias a Matthew Lewis y George Papadopoulos.
  • error corregido: En un ciclo for, en el nivel superior de un programa (fuera de cualquier rutina), que incrementaba la variable del ciclo en un entero distinto del valor +1 por defecto, el end for tardaba 15 veces más que lo necesario debido a la corrección de un error que se hizo en noviembre de 1999. El end for solamente era lento, no el código contenido enel cuerpo del ciclo. Antoine Tammer detectó esto.
  • error corregido: En XP, cuando abre una nueva ventana DOS que tiene más de 25 líneas, la Máquina Virtual de DOS (VDM, por sus iniciales en inglés), al principio se confunde respecto de la cantidad de líneas reales. La primera vez (solamente) en que ejecuta un programa Euphoria en esa ventana, si lo ejecuta cerca del mismo fondo de la pantalla, la salida puede desaparecer, o el VDM o Euphoria puede informar un error, etc. Euphoria (ex.exe) ahora detecta los casos raros en que el VDM se confunde y limpia la pantalla, el cual elimina la confusión. Un problema similar existió en NT, y se lo solucionó unos pocos años atrás.
  • error corregido: El intérprete se refería a "call-back desde Windows" en ex.err, aún en Linux o FreeBSD. Ahora dice "call-back desde una fuente externa" en aquellos sistemas. Gracias a Pete Eberlein.
  • error corregido: Cuando no se podía encontrar un archivo de inclusión, el mensaje de error se refería a "euphoria\include". Ahora usa %EUDIR%\include.
  • error corregido: No se generará más un mensaje de error en ninguna plataforma para without profile_time. Gracias a Alan Oxley.

- Traductor -

  • error corregido: Al asignar el resultado de un cálculo aritmético (típicamente una multiplicación) que involucra a dos enteros, a una variable declarada como átomo, donde la variable átomo (en el mismo bloque básico) se asigna a un valor entero, el Traductor no podía emitir ningún código para comprobar si hay desbordamiento entero (resultado fuera de +/- mil millones). Esto provocaba una cancelación del programa. Gracias a Andy Serpa.
  • error corregido: el comando strip.exe de DJGPP en emake.bat fallaría en XP, 2000 debido a un error en DJGPP. Ahora emake.bat tiene: SET LFN=n para trabajar alrededor del error en strip.exe.
  • error corregido: El código traducido compilado con Borland C no producía INF's y NAN's, como Watcom y Lcc. En su lugar, se cancelaba al ocurrir un desbordamiento de punto flotante (más de 1e308), o se calculaba un resultado indefinido de punto flotante. El Código Fuente del Intérprete también se corrigió para aquellos que desean compilar exw.exe usando Borland C. Gracias a Andy Serpa.
  • error corregido: En el primer bloque básico de una rutina Euphoria (es decir, antes de cualquier sentencia de control de flujo) peek4u(), peek4s(), y la operación "add integer 1", a veces se descuidaría comprobar si hay un posible desbordamiento entero de 31 bits al asignar a una variable privada declarada como átomo, a menos que la variable hubiera sido inicializada previamente. Gracias a Mike Duffy.
  • error corregido: En algunos casos, al asignar un elemento de la secuencia a una variable declarada como entero, y conocida para tener un valor entero en este punto, no se manejaba correctamente el caso donde el elemento era un valor entero almacenado en forma de double de C.
  • error corregido: En casos extraños, el Traductor puede emitirdos operadores unarios negativos en una fila, el cuál sería interpretado por un compilador de C como el operador "--" de decremento de C.
  • error corregido: Las .dll de Euphoria no siempre liberaban correctamente el almacenamiento asignado por el programa principal y viceversa. La memoria se podría agotar, con lo que podría obtener una cancelación a nivel de máquina. Gracias a H. W. Overman.

    Nota: Debido a esta corrección, cualquier .dll de Euphoria creada con el Traductor versión 2.3 o anterior, tiene que ser re-traducida con la versión 2.4, y recompilada, para interconectar con el intérprete Euphoria 2.4 (o posterior) o código traducido. Las nuevas .dll creadas con la versión 2.4 o posterior, no funcionarán con el intérprete de la versión 2.3 o anteriores, excepto en casos triviales.

  • error corregido: La función sleep(x) solamente "dormía" por 'x' milisegundos al usar la librería en tiempo de ejecución de Lcc. Ahora "duerme" por 'x' segundos, para consistir con la documentación de Euphoria para sleep(). Gracias a Wolfgang Fritz.
  • error corregido: En algunas versiones de Linux, un programa Euphoria traducido/compilado podía cancelarse si la salida estándar se redirigía, por ejemplo para CGI.
  • error corregido: En algunas versiones de Linux, un programa Euphoria traducido/compilado podía cancelarse si se llamaba a máquina (M_GET_SCREEN_CHAR, {row, col}).
  • error corregido: En algunos casos, el código no era correcto cuando se le asignaba a una variable entera el menos unario de una variable átomo.
  • error corregido: En un caso muy raro, un valor no inicializado en memoria se podía usar para determinar si un valor literal de punto flotante se debería tratar como entero o no. Podía resultar un código incorrecto.

- Enlazador -

  • error corregido: El enlazador se estrellaría después de ver un comentario sin carácter de nueva línea, solo EOF, en la última línea de un archivo. Algunas versiones de Win32Lib.ew tenían esto. Gracias a Henri Goffin.
  • error corregido: El informe del uso de bind/shroud todavía decía "-scramble", en lugar de "-clear" y tenía otros errores en Linux/FreeBSD. Gracias a Chris Bensler.
  • error corregido: bind/shroud -clear podía dejar de renombrar una variable privada, cuando una variable local anterior se renombraba con el mismo nombre. Gracias a Pete Lomax.
  • error corregido: Cuando a un archivo de inclusión le faltaba \n en la última línea, bind/shroud -clear olvidaba dejar un cierto espacio en blanco antes de la palabra siguiente en el archivo principal. Gracias a Pete Lomax.
  • error corregido: Si usted definió una constante que nunca se utilizaba, y fue definida usando una expresión que contenía un operador menos binario, un error del sintaxis podría ocurrir en el archivo enlazado o encriptado que usted crea. Gracias a Chris Bensler.

- Rutinas de Librería -

  • error corregido: walk_dir("/",...) fallaba en Linux. Gracias a Ricardo Forno.
  • error corregido: db_compress() de EDS tenía un error si el archivo de base de datos o su ruta contenía un caracter en blanco. El caracter en blanco es correcto hoy en todas las plataformas, excepto DOS. Gracias a Virtual B.
  • error corregido: wildcard_file() en euphoria\include\wildcard.e ahora es sensible a las mayúsculas en Linux/FreeBSD (pero todavía es insensible en DOS/Windows). Gracias a Jeff Fielding.
  • error corregido: dir() no siempre informaba correctamente el tamaño de archivos mayores a 1 Gb. Ahora maneja hasta 4 Gb. Posiblemente fallaría la aritmética utilizada en el tamaño del archivo. Gracias a Ricardo Forno.
  • error corregido: where() no siempre informaba correctamente las posiciones del archivo mayores a 1 Gb. Posiblemente fallaría la aritmética utilizada en la posición. Ahora maneja hasta 2 Gb.
  • error corregido: ex, exw, ec -wat, ecw -wat: La función dir() para DOS y Windows no manejaba correctamente los comodines cuando aparecía una barra invertida al final del archivo o de la ruta del directorio. Gracias a Juergen Luethje.

- Espacio de nombres -

  • error corregido: Si intentaba declarar una nueva variable, usando un calificador de espacio de nombres, por ejemplo, integer y:x (que es ilegal) no lo informaría, y solo ignoraría la parte "y:", mientras y:x era una rutina (no una variable) en un archivo anterior. Esto ahora se captura como error. Gracias a Martin Stachon.
  • error corregido: Al declarar el tipo de un parámetro, usando un tipo global que estaba definido en más de un archivo, obtendría un mensaje de error confuso que indica que "se espera un tipo aquí". Ahora usted obtendrá un mensaje que precisa que el tipo requiere un identificador de espacio de nombres para resolverlo. Gracias a Juergen Luethje.
  • error corregido: Se ha mejorado el mensaje de error que obtiene si especifica un calificador del espacio de nombres y ': ', pero olvida seguirlo con un identificador adecuadamente constituido. Gracias a Carl White.

- Programas de Demostración -

  • error corregido: En el programa de demostración window.exw, allocate(64) y allocate(16) causaban una pérdida de almacenamiento. Gracias a Wolfgang Fritz y Jordah Ferguson.

- Trazado/Depuración -

  • error corregido: Cuando se ejecutaba trace(0), seguido luego por trace(1), sin E/S a pantalla en el medio, los valores de algunas variables en la pantalla de trazado no se actualizaban. Gracias a Ricardo Forno.
  • error corregido: with trace / with profile / trace(3), usados juntos, producían líneas fuente basura en ctrace.out. Gracias a Kat.

Versión 2.3 Edición Oficial, 11 de Febrero de 2002:

Esta versión actualiza el Intérprete de Euphoria, el Traductor Euphoria a C, y el Código Fuente del Intérprete, para todas las plataformas.

  • La versión DJGPP del código fuente del intérprete ahora usa los rótulos dinámicos de GNU C, igual que la versión Linux. Esto permite que alcance plena velocidad, sin la necesidad de ninguna optimización a nivel de ensamblador. Gracias a Bernie Ryan.
  • The Código Fuente del Intérprete incluye ahora un documento introductorio que describe cómo funciona el intérprete.
  • En la Edición Completa, bind.bat y bindw.bat ahora usan exw para ejecutar el enlazador/encriptador. Esto evita problemas con los nombres largos en algunos sistemas. Mientras esté corriendo el enlazador/encriptador, aparecerá una ventana de consola. Gracias a "void", Bruce Axtens, y otros.
  • error corregido: Debido a un error en la librería de WATCOM C 10.6, los intérpretes ex y exw, y el código traducido a C y compilado con Watcom, podría obtener un resultado incorrecto de la función where() de Euphoria cuando el archivo se abre en modo append, y el puntero de archivo estaba en la porción no comprometida del archivo (no escrito al disco aún). El error se solucionó al tener flush() de Euphoria el archivo en este caso particular, antes de llamar la rutina de Watcom. Gracias a Bob Elia.
  • error corregido: Un error introducido en el enlazador de 2.3 beta, podía provocar que una llamada de una función en la última línea del programa se ignorara. Gracias a Wolfgang Fritz.
  • error corregido: Varios archivos Euphoria en la distribución WIN32+DOS32 tenían terminadores de línea estilo Linux (\n solamente). Esto complicaba su edición usando el Bloc de Notas y otros editores. Gracias a Pete Lomax.
  • error corregido: Si "with type_check" estaba activo, ed.ex obtenía una falla de type_check cuando se presionaba la tecla Esc. Gracias a Kenneth Orr.

 
Versión 2.3 Edición Beta, 15 de Enero de 2002:

Esta versión actualiza el Intérprete de Euphoria, el Traductor Euphoria a C, y el Código Fuente del Intérprete, para todas las plataformas.

  • Ahora puede sobreescribir una rutina incorporada de Euphoria con su propia variable o el identificador del espacio de nombres del mismo nombre. Esto fue permitido previamente solamente para las rutinas definidas por el usuario. Además de dar a programadores más libertad, permitirá que RDS agregue nuevas rutinas incorporadas en el futuro sin alterar el código existente.
  • Se quitó la advertencia sobre tener símbolos globales múltiples con el mismo nombre en diversos archivos de fuente. Dejó de ser necesario puesto que se le pedirá proveer un identificador del espacio de nombres si usted hace realmente una referencia ambigua a un símbolo global.
  • Ahora puede tener las barras \ (o las de Linux /) en el final de todos los nombres de directorio en EUINC, y usted puede tener espacios en blanco en el nombre de directorio.
  • Para eliminar la confusión, el enlazador/encriptador ahora suprimirá el archivo de salida si un error fatal ocurre durante el enlazado o la encriptación.
  • Se hicieron numerosas mejoras y correcciones en la documentación. Gracias a Igor Kachan.
  • Las antiguas definiciones de funciones pre-ANSI del código fuente del intérprete, se actualizaron al estilo ANSI que es más compatible con C++.
  • error corregido: Con DJGPP C, al compilar el código producido por el Traductor, o compilando el código de fuente de Intérprete, había un error de asignación de memoria que podría hacer perder un poco de tiempo, o, en casos raros, causar una caida.
  • error corregido: En Windows, usando el Intérprete, o en un programa Traducido, a veces se necesitaba presionar Enter dos veces para salir de la ventana de consola. Gracias a Tone Skoda.
  • error corregido: La función Euphoria dir(), implementada para Lcc o Borland, no manejaba correctamente los directorios cuando tenían marcado un atributo adicional, como READ_ONLY. Gracias a Euman, quien encontró el problema, y luego mostró como corregir el código fuente del Intérprete para dir().
  • error corregido: Ahora puede declarar un identificador de espacio de nombres con el mismo nombre que una función incorporada, sin causar muchos errores. Gracias a Martin Stachon (aunque él recomendó una solución diferente).
  • error reparado - Enlazador: se le agregó el soporte para la nueva variable de entorno, EUINC. Gracias a Ross Boyd.
  • error reparado - Enlazador: Bind -clear no funcionaba bien al agregar archivos de recursos al .exe enlazado. Gracias a Wolfgang Fritz.
  • error reparado - Enlazador: Al usar el binder interactivamente, podría obtener un error de "variable no inicializada" al intentar sustituir un icono de Windows. Gracias a Tony Steward.
  • error reparado - Enlazador: En algunos casos la palabra clave "constant" se excluiría de la salida encriptada, cuando la línea anterior de entrada tiene una declaración de constante terminada en ']'. Gracias a Ross Boyd.
  • error reparado - Enlazador: Cuando una expresión general, (no solo una cadena entre comillas), se usaba como argumento de routine_id(), las rutinas locales que eran potencialmente el blanco de esa expresión, deberían tener que cambiar sus nombres (a menos que se usara -clear), causando así que routine_id() devolviera -1 en tiempo de ejecución. Las rutinas globales eran correctas.
  • error reparado - Enlazador: El enlazador/encriptador continuaba corriendo aunque faltase un archivo de inclusión. Gracias a Ross Boyd.
  • error reparado - Enlazador para Linux: El error de la ruta de búsqueda en Linux para ejecutables enlazados, supuestamente corregido en la versión 2.3 Alpha, no lo estaba del todo. Ahora corregido. Gracias a Ken Rhodes.
  • error reparado - Enlazador para Linux: bindu -clear y shroud -clear con un archivo conteniendo terminadores de línea \r\n estilo DOS/Windows, daba errores de "caracter ilegal" cuando se ejecutaba su programa encriptado, y "no enlazado correctamente" al ejecutar su programa enlazado.
  • error reparado - Fuente del Intérprete: El comando link para construir el intérprete DOS con WATCOM C, listaba un archivo .obj inexistente.

 
Versión 2.3 Edición Alfa, 30 de Noviembre de 2001:

Esta versión actualiza el Intérprete de Euphoria: para WIN32, DOS32 y Linux. También actualiza el Traductor Euphoria a C para todas las plataformas, y presenta un nuevo producto - el Código Fuente del Intérprete Euphoria.

  • Cambiaron los precios e incentivos de registración.
    • El Intérprete tiene solo una opción:: WIN32, DOS32 y Linux, antes $59, por solo $39.

    • El código fuente del Intérprete (menos unas pocas funcionalidades registradas) está disponible ahora por $49. Vea más detalles en licencia del fuente y register.doc.

    • El Traductor continua costando $29.

    • Cuando los usuarios de Dominio Público alcanzan 300 sentencias, no perderán más el diagnóstico del error en tiempo de ejecución. Solamente perderán la utilidad trace().

    register.doc tiene más detalles, incluyendo los requisitos para obtener actualizaciones gratuitas.

  • Ahora, el intérprete Euphoria puede generarse con 6 compiladores distintos, sobre 3 plataformas.
  • Los nuevos calificadores del espacio de nombres eliminan el conflicto de nombres entre símbolos globales idénticos declarados en diferentes archivos de inclusión. También ahora, los símbolos locales sobrescribirán los símbolos globales del mismo nombre, en lugar de provocar un error. Ver Reglas de ámbito.
  • El Intérprete de la Edición Completa viene con un nuevo enlazador/encriptador de 2 pasos que elimina todas las rutinas y constantes no utilizadas, dando por resultado archivos ejecutables más pequeños. También tiene la opción clear para enlazar el fuente, por lo que puede conseguir mensajes de error comprensibles de sus usuarios.
  • Se introdujo una nueva variable de entorno, EUINC. Si está presente, especifica una lista adicional de directorios en los que se buscarán archivos de inclusión. El directorio que contienen el archivo principal es el primero en que que se busca, luego en los directorios en EUINC, y entonces en euphoria\include.
  • El Intérprete ahora soporta un nuevo modo de trazado: trace(3). Este modo registra en un archivo todas las sentencias Euphoria ejecutadas, por lo que verá la última sentencia ejecutada en el momento de cualquier colapso, así como las 499 sentencias que la preceden. Esto es particularmente útil en el caso de los colapsos a nivel de máquina donde Euphoria no es capaz de escribir un archivo ex.err. Gracias a Matthew Lewis.
  • El Intérprete Euphoria ahora puede pasar más datos Euphoria (átomos y secuencias), a archivos .dll codificados en Euphoria y generados por el Traductor. Use los nuevos tipos E_ en dll.e
  • En Linux se agregó RTLD_GLOBAL en la llamada a dllopen(). Esto le permite enlazar correctamente con más librerías compartidas.
  • En Linux, al usar #! en la primera línea, el archivo fuente se convierte directamente en ejecutable, por lo que no se necesita más la extensión .exu del archivo. Los programadores Linux prefieren frecuentemente que sus archivos ejecutables no tengan extensión.
  • Las rutinas call-back de Windows ahora pueden tener 9 argumentos (eran 8). Gracias a Matt Lewis.
  • Además del C_DOUBLE (punto flotante de 8 bytes), ahora se soporta C_FLOAT (punto flotante de 4 bytes) para argumentos y valores de retorno desde rutinas C. Gracias a David Guy.
  • Las .dlls de Windows abiertas con open_dll(), ahora se cierran automáticamente cuando termina el programa. Esto evita una pequeña pérdida de memoria. Gracias a Euman.
  • safe.e tiene una nueva opción para comprobar solo los bordes de bloques registrados y no preocuparse si se utilizan otros bloques de memoria.
  • get_bytes() es un 30% más rápida.
  • Se aceleró allocate_string(). Gracias a Aku.
  • El programa de demostración mydata.ex ahora usa una base de datos EDS.
  • error reparado - Traductor: Cuando una variable global o local que contiene una secuencia o un número de punto flotante se asignaba al resultado de una función, en algún punto durante la llamada, la variable global o local se sobreescribía, produciendo cierto daño que provocaría más adelante el colapso del programa. Gracias a Sergio Gelli.
  • error reparado - Intérprete para Linux: Los programas de más de mil líneas tenían la posibilidad (quizá el 20%) de tener un colapso de sus sentencias al ejecutarse.
  • error reparado - Intérprete: s[i][j]...[k] = s causaba el colapso del intérprete, es decir, una asignación de una secuencia completa al elemento de un elemento de sí misma, usando 2 o más niveles de subíndices. Gracias a Henri Goffin.
  • error reparado - Enlazador para Linux: (Ken Rhodes) Los programas ejecutables enlazados guardados en alguna parte de la ruta de búsqueda no funcionaban correctamente salvo que estuvieran en el directorio actual o se le especificara la ruta completa al ejecutable.
  • error reparado - Enlazador: "with profile_time" en un programa enlazado o encriptado, causaría una caida.
  • error reparado - Intérprete DOS: En image.e, se corrigió put_screen_char() para tener: if overflow > 0 then ... en lugar de: if overflow then ...
  • error reparado - Intérprete: Una optimización de tiempo para subrangos podría causar en casos raros, la pérdida de mucho espacio. Se ajustó la optimización para manejar esos casos. Gracias a Brian Clausing.
  • error reparado - safe.e: free() y free_low() no liberaban realmente el bloque de memoria, y en Linux free() podía causar una violación de segmento. Las mismas rutinas en machine.e estaban bien.
  • error reparado - Traductor para DJGPP: Se corrigieron un par de diferencias de menor importancia de ex.exe en la exhibición del texto.
  • error reparado - define_c_var(): trabaja también en WIN32. Se corrigió la documentación.

Versión 2.2 Edición Oficial para WIN32+DOS32, 14 de Enero de 2000:

  • Ahora se emiten mensajes de error mejores desde el intérprete, y desde el programa de enlazado, para algunos errores típicos que los usuarios puedan cometer al enlazar un programa.
  • Se mejoró la documentación en algunos lugares.
  • El programa de demostración window.exw muestra como cargar el icono de Euphoria contenido en exw.exe
  • Language War usa la versión mejorada de putsxy.e de Jiri Babor.

 
Versión 2.2 Edición Beta para WIN32+DOS32, 23 de Diciembre de 1999:

La mayoría de las nuevas rutinas desarrolladas para Euphoria 2.2 en Linux, se migraron a WIN32 y DOS32. Ellas son: sleep(), chdir(), flush(), lock_file(), unlock_file(), crash_file(), get_screen_char() y put_screen_char(). Referirse más abajo a las notas para Linux, para obtener una descripción de esas rutinas, o LIBRARY.DOC.

Algunos arreglos de errores de plataforma cruzada y otras mejoras misceláneas fueron llevados a cabo durante la migración a Linux. Estas correcciones y mejoras se migraron nuevamente a WIN32+DOS32. Ver las notas de la versión para Linux (debajo).

Además, se hicieron las siguientes mejorías específicamente para WIN32 y DOS32:

  • exw.exe contiene el icono Euphoria que Windows ahora lo muestra automáticamente. El icono es una contribución de Gary Dumer. Los usuarios registrados pueden cambiar este icono cuando enlazan un programa.
  • exw.exe es ahora un ejecutable comprimido de solo 73K. Se lo comprimió usando la herramienta de compresión UPX para archivos ejecutables.
  • ex.exe se actualizó con la última versión del expansor DOS CauseWay. Se eliminó un problema en el que CauseWay a veces lo limitaría a 64Mb de memoria bajo algunas configuraciones de DOS y se corrigieron algunos errores menores.
  • error corregido: El seguimiento del error podía estrellarse o imprimirse con errores a veces al ocurrir una falla type_check. Podía suceder solamente cuando 1 se sumaba expresión, y el resultado no entero de la expresión se asignaba a una variable declarada como número entero.
  • error corregido: Si text_rows() se llamaba como primera rutina que necesita una ventana de la consola WIN32, Euphoria no podría fijar el nuevo número de líneas del texto en la consola.

 
Versión 2.2 Edición Oficial para Linux, 22 de Noviembre de 1999:

  • Todas las plataformas: error corregido: Si una rutina Euphoria se llamaba a sí misma recursivamente desde el interior de un ciclo for, y en un nivel de recursión el ciclo for contaba hacia el límite superior, y en otro nivel de recursión el ciclo for contaba hacia el límite inferior, el ciclo for funcionaría incorrectamente probablemente en uno de los niveles. Gracias a Delroy Gayle.
  • Se mejoró la documentación en muchos lugares, especialmente con respecto a la plataforma Linux.

Versión 2.2 Edición Beta para Linux, 22 de Octubre de 1999:

La mayoría de estas características y arreglos de errores también estarán disponibles en la Versión 2.2 para WIN32 + DOS32.

  • platform() se movió de misc.e a exu para eliminar el consumo de recursos en la llamada a la función. platform() ahora computa sin perder tiempo. El compilador simplemente agrega el valor constante apropiado.
  • lock_file() y unlock_file() se han agregado para permitir que los procesos múltiples compartan el acceso a los archivos. Esto puede ser importante en la programación CGI y otras áreas.
  • flush() forzará el contenido del búfer de memoria hacia un archivo o un dispositivo.
  • chdir() cambiará a un nuevo directorio actual y le permitirá saber si la operación fue correcta.
  • sleep() suspenderá la ejecución de su programa por una cantidad de segundos, y le permitirá al sistema operativo programar otro proceso.
  • put_screen_char() escribirá un caracter y sus atributos (colores, etc.) a la pantalla.
  • get_screen_char() leerá un caracter y sus atributos desde la pantalla.
  • save_text_image() ahora funciona en Linux (como en DOS32). Copia una imagen rectangular de texto de la pantalla.
  • display_text_image() ahora funciona en Linux (como en DOS32). Escribe una imagen rectangular de texto en la pantalla.
  • La advertencia de "corto-circuito" ahora da el nombre del archivo y el número de línea de la llamada posiblemente corto-circuitada. Se hicieron aclaraciones menores en algunos otros mensajes de error.
  • Se hicieron mejoras menores a ed y search.
  • Se solucionó un problema de portabilidad en how2reg.ex.
  • Se comprimió mejor a exu. Ahora es realmente un poco más pequeño, aunque se le agregó funcionalidad.

 
Versión 2.2 Edición Alfa de pruebas para Linux, 24 de Agosto de 1999:

Muchas de estas funcionalidades y corrección de errores estarán disponibles también en la versión 2.2 para WIN32 + DOS32.

  • La documentación se actualizó para incluir información específica de Linux para las rutinas de la biblioteca y Euphoria en general.
  • Ahora existe una Edición Completa para Linux, incluyendo enlazado y encriptación. Ver register\register.doc.
  • Ahora hay soporte de ratón en el modo de texto usando get_mouse(). Tiene que tener corriendo el servidor GPM. Este funciona en una consola de texto o en una ventana xterm.
  • Linux: define_c_var(nombre) devolverá la dirección de una variable global de C en una librería compartida.
  • Se confirmó que puede llamar rutinas Euphoria desde las rutinas C de Linux sando exactamente el mismo mecanismo que Euphoria de WIN32. Ver euphoria/demo/linux.
  • Se agregó un ejemplo de como crear sus propias rutinas de la librería compartida y de llamarlas desde Euphoria. Ver euphoria/demo/linux.
  • Todas las plataformas: crash_file(archivo) provocará que se escriban los mensajes de diagnóstico en archivo, en lugar de ex.err. Puede usar crash_file("/dev/null") para obtener diagnósticos en pantalla pero no a un archivo. crash_file("") equivale a "sin diagnósticos" (a pantalla o ex.err).
  • El modo de Trazado en xterm ahora detecta las teclas F1/F2.
  • time() ahora informa la hora la del CPU.
  • search, guru y cdguru ahora ponen su salida en el directorio $HOME en lugar del actual.
  • #! quedó restringido a la primera línea de un archivo.
  • Todas las plataformas: En ed, los comandos Esc-N, Esc-D, Esc-F y Esc-R mostrarán inmediatamente su última elección. Puede presionar flecha hacia arriba/fecha hacia abajo para ver otras opciones, o limpiar la elección. Si usted comienza a escribir sin corregir, limpiará la opción y tomará su nueva entrada.
  • free_console() fijará los parámetros de la terminal de nuevo a normal. Normalmente, al funcionar un programa Euphoria, los parámetros se fijan en la manera que curses los desea y se fijan de nuevo a normal cuando el programa termina. Si su programa necesita terminar de una manera extraña (con excepción de llamar a abort()), se debería llamar primero a free_console().
  • error corregido: get() ahora considera a '\r' como un espacio. Esto es importante al leer archivos de DOS.
  • Todas las plataformas: error corregido: No se mostraba inmediatamente una falla type_check cuando se sumaba 1 a una variable entera que estaba establecida al máximo valor entero (1070 millones). Gracias a Jeff Fielding.
  • Todas las plataformas: error corregido: No siempre se detectaba un exponente incorrecto en un número de punto flotante. Gracias a Lionel Wong.
  • Todas las plataformas: El funcionamiento del asignador de almacenamiento se ha mejorado en ciertos casos. Se corrigió un error que podría hacer al intérprete estrellarse cuando casi se queda sin memoria.

 
Versión 2.2 Edición pre-Alfa #4 para Linux, 15 de Julio de 1999:

  • Puede llamar rutinas de C en librerías compartidas de Linux (archivos .so). Ver algunos ejemplos en euphoria/demo/linux/callc.exu.
  • Si su programa no emite nada en la ventana xterm, exu no mostrará el mensaje "Presione Enter".
  • Todas las plataformas: ed ahora le permite recordar los comandos anteriores, usando flecha hacia arriba y flecha hacia abajo, similar a doskey en DOS y a shell history en Linux. Esto funciona con cualquier cadena que escriba para Esc-N (nuevo archivo), Esc-D (comando de Linux), Esc-F (encontrar cadena) o Esc-R (reemplazar cadena).Además, ahora puede usar las teclas de flecha, Inicio, Fin, Supr, etc. para editar cadenas antes de presionar Enter.

 
Versión 2.2 Edición pre-Alfa #3 para Linux, 8 de Julio de 1999:

  • En una ventana xterm, exu lo invitará a presionar Enter antes de terminar. Sin esto, xterm restaura la pantalla tan rápidamente que usted no ve ninguna salida o mensaje de error.
  • Se hizo un cambio en el código interno de la función rand() de Euphoria (El algoritmo no cambió). Esperanzadamente esto permitirá a rand() trabajar en todas las distribuciones de Linux. Permítanos saber si rand() aún falla.
  • ed: El comando Esc-H mostrará los archivos de ayuda de Euphoria. Esto se cortó en pre-alpha#2.
  • En una ventana xterm, video_config() de Euphoria ahora informa la cantidad correcta de líneas y columnas - esto ayuda a que ed funcione mucho mejor. ed trabajará con el tamaño inicial de la ventana en efecto cuando ed inicia.
  • ed: Las teclas F1, F2, F3, F4, Inicio, Fin, y Supr ahora funcionan en xterm (bajo Red Hat 5.2 al menos). Las otras teclas F ya estaban funcionando. Re Pag/Av Pag y algunas otras teclas no funcionarán todavía - considérese libre de agregar sus propias teclas "alternativas".
  • exu es aún más pequeño - solo 82K.

 
Versión 2.2 Edición pre-Alfa #2 para Linux, 6 de Julio de 1999:

  • Se enlazó estáticamente la librería ncurses en exu.
  • exu es ahora un ejecutable comprimido (97K).
  • error corregido: ed ahora puede editar archivos cuyo nombre está en mayúsculas.
  • Se quitó la demora de una fracción de segundo al presionar la tecla Esc en ed.

 
Versión 2.2 Edición pre-Alfa #1 para Linux, 1 de Julio de 1999:

  • Se liberó la primera versión de Euphoria para Linux.

 
Versión 2.1 Edición Oficial para WIN32 + DOS32, 29 de Marzo de 1999:

  • Se optimizaron las actualizaciones de la pantalla de trazado. Se eliminaron los refrescos innecesarios del código fuente y de las variables a la pantalla. Cuando un refresco es necesario, ahora es ligeramente más veloz. Esto hace una notable diferencia en exw.exe, y también en ex.exe en los modos de gráficos de píxel. Para ex.exe en los modos de texto, reduce el parpadeo de la pantalla levemente.
  • El programa install ya no necesita que la ruta tenga menos de 128 caracteres. Se le advertirá simplemente si no lo es. Las nuevas versiones de DOS permiten rutas más extensas. Gracias a Steve Adams.
  • Se agregó una verificación de error adicional a unregister_block() en safe.e. Gracias a David Guy.

 
Versión 2.1 Edición Beta, 5 de Marzo de 1999:

  • Se convirtieron a HTML los archivos en el directorio euphoria\doc. Todo archivo .doc en el directorio doc tiene su correspondiente archivo .htm en el directorio euphoria\html. Se hicieron muchas mejoras y aclaraciones en la documentación.
  • Ahora se le advertirá cuando tiene código inmediatamente después de las sentencias exit, return o abort(). Este código puede que nunca se ejecute. Sugerido por Gabriel Boehme.
  • safe.e ya no incluye a graphics.e. Esto elimina posibles conflictos de nombres cuando se sustituye a safe.e con machine.e.
  • Usando código suministrado por David Guy, safe.e le permitirá agregar o quitar de la "lista de direcciones seguras" los bloques de memoria asignados externamente. Ver las nuevas rutinas de librería: register_block() y unregister_block().
  • message_box() ahora usa el identificador de la ventana activa, en lugar de NULL. Esto fuerza al usuario a contestar a su mensaje antes de que él pueda continuar interactuando con su programa. Lo no prevendrán de interactuar con otros programas. Gracias a Austin C.
  • Se aceleraron un 5% get() y value(). Gracias a Gabriel Boehme.
  • Se hizo a exw.exe menos propenso a colgarse misteriosamente cuando lo ataca un virus.
  • sanity.ex verifica su instalación de Euphoria. Se le avisará si las variables PATH o EUDIR no existen, o si sus archivos ex.exe, exw.exe, pdex.exe, o pdexw.exe están dañados o incorrectamente instalados en euphoria\bin.
  • La seguridad de los programas bound y scrambled se ajustó un poco más. Gracias a Rusty Davis.
  • Para ahorrar espacio en euphor21.zip, el programa de instalación genera los archivos HTML y DOC desde una fuente común, usando el generador de documentación de Junko Miura. En el proceso, se borra el generador, pero puede descargarlo desde el sitio de RDS.
  • Al ocurrir un error type_check se le advertirá si el tipo devolvió erróneamente una secuencia para el resultado "true/false". Previamente, un resultado de secuencia era informado simplemente como un error type_check. Sugerido por Ralf Nieuwenhuijsen.
  • El código de demo\win32\winwire.exw se aclaró considerablemente.
  • El programa install le advertirá de cambiar su archivo autoexec.bat cuando instale una nueva versión de Euphoria en una unidad diferente.

 
Versión 2.1 Edición Alfa de pruebas, 15 de Enero de 1999:

  • Hemos hecho algunos cambios en el embalaje, precios e incentivas de registración para el producto Euphoria:
    • Se redujo el precio del paquete Plataforma Dual (DOS32+WIN32) de $53 a $39 U.S.

    • Se discontinuó el paquete de Plataforma Unica (solo DOS32), anteriormente $32.

    • Se discontinuó el manual impreso. En su lugar, existe una versión oficial del mismo en HTML, incluido en el archivo .zip de la Edición de Dominio Público.

    • Todos los archivos de inclusión útiles de terceras partes, como Win32Lib.ew y algunos otros, estarán "estampados" por RDS con un número de código que los hace libres, igual que los archivos en euphoria\include. Ellos no sumarán a su sentencia de conteo, con tal que usted no los modifique perceptiblemente. Esto permitirá también a desarrolladores de terceras partes obtengan una información de diagnóstico mejor de sus usuarios.

    • Binding, shrouding y profiling ahora son parte de la Edición Completa únicamente. Estas son funcionalidades que los novatos no necesitan, pero que los programadores si pueden valorar.

  • Se agregaron los operadores de asignación abreviados   +=   -=   *=   /=   &= . Por ejemplo, en lugar de decir:
               count = count + 1
    
    Ahora puede decir:
               count += 1
    
    En lugar de decir:
               matrix[row][column] = matrix[row][column] * 5.0
    
    Ahora puede decir:
               matrix[row][column] *= 5.0
    
    En lugar de decir:
               test_scores[start..finish] = test_scores[start..finish] / 100
    
    Ahora puede decir:
               test_scores[start..finish] /= 100
    
    Ver más detalles en refman.doc.

  • Euphoria usa ahora la evaluación de "corto-circuito" de expresiones and y or en condiciones if/elsif/while. Por ejemplo, en una condición and:
               if A and B then ...
    
    el intérprete salteará la evaluación de la expresión B toda vez que la expresión A sea 0 (falso), puesto que sabe que el resultado total tiene que ser falso. En una condición or:
               while A or B do ...
    
    el intérprete salteará la evaluación de la expresión B toda vez que la expresión A sea no nula (verdadero), ya que sabe que el resultado total tiene que ser verdadero.

    El código de Euphoria escrito antes de la versión 2.1 puede no funcionar correctamente si la expresión B contiene una función con efectos secundarios tales como fijar una variable global, usar E/S, etc. Esta clase de código es en la práctica muy rara, pero en caso de ocurrir, ahora una advertencia se emitirá si una función con efectos secundarios puede cortocircuitarse.

    Al saltear la evaluación de B, la evaluación de cortocircuito es típicamente más rápida, y permitirá escribir sentencias como:

               if atom(x) or length(x)=1 then ...
    
    que generaría un error en las versiones más viejas de Euphoria siempre que x fuera un atom, puesto que el length() no se define para átomos.

    Ver más detalles en refman.doc.

  • Se agregaron varias nuevas rutinas.

    Incorporadas a ex.exe/exw.exe:
    profile() -
    activa/desactiva el análisis de perfiles, por lo que puede apuntar la ejecución de profile y profile_time en eventos en particular dentro del programa.
    system_exec() -
    el devuelve el código de salida de la llamada de un archivo .exe o .com, u otro programa Euphoria.
    equal() - compara por igualdad 2 objetos Euphoria. Es equivalente a: compare(a,b) = 0 pero más legible.

    Agregadas a varios archivos de inclusión:
    walk_dir() -
    viaja recursivamente a través de un directorio y sus subdirectorios, ejecutando la rutina que se le suministra.
    reverse() - devuelve una secuencia en orden inverso.
    sprint() - devuelve la representación de cadena de un objeto Euphoria.
    arcsin() - función trigonométrica inversa.
    arccos() - función trigonométrica inversa.
    get_bytes() - devuelve los siguientes 'n' bytes desde un archivo.
    prompt_number() - pide al usuario ingresar un número.
    prompt_string() - pide al usuario ingresar una cadena.
    instance() - WIN32: devuelve el handle de instancia de un programa.
    PI - se agregó la constante PI - 3.14159... a misc.e.

    Ver más detalles en library.doc.

  • Ahora se puede ver la documentación principal de Euphoria con el navegador de Internet. Los archivos de texto plano refman.doc y library.doc aún están en el subdirectorio doc, pero ahora tenemos refman.htm y library.htm en el nuevo subdirectorio html. Desarrollamos una herramienta (escrita en Euphoria) que nos permite fácilmente mantener actualizadas las versiones HTML y de texto plano de refman y library.
  • Se agrandó y clarificó la documentación en varias partes.
  • WIN32: se pueden crear una cantidad ilimitada de rutinas call-back en Euphoria, mientras cada rutina es una función con 0 a 8 parámetros. Ver platform.doc. En la vesión 2.0 usted podría solamente tener una rutina call-back que tenía que tener exactamente 4 parámetros.
  • Se agregó la palabra clave xor para complementar a: and/or/not y xor_bits(), por ejemplo:
               if a xor b then...
    
    xor también trabaja con secuencias. Es similar a or.
  • La rutina de librería dir(path) ahora soporta oficialmente el uso de comodines * y ? en la ruta que se le suministra. Esta característica estaba siempre disponible, pero no fue documentada hasta este momento. Por ejemplo:
               info = dir("mydata\\*.d?t")
    
  • optimización: se redujo en un 30% en promedio, el consumo de recursos en la subrutina call+return. El incremento de velocidad ocurre para todas las llamadas normales a funciones/procedimientos/tipos, verificaciones de tipos definidas por el usuario, llamadas a call_proc()/call_func() usando routine id, y call-backs de Windows. Solamente las llamadas recursivas tienen el mismo consumo que antes. Los programas con una razonablemente alta tasa de llamadas, pueden ser un 10% más rápidos debido a esto.
  • optimización: Se implementó la rectificación de saltos. El compilador optimizará los saltos en el código interno tal como un salto de A->B, donde la posición B contiene un salto a la posición C, se optimizará directamente como un salto de A->C. Aún algo como A->B->C->D se puede rectificar a A->D. Esto ocurre a menudo en los ciclos while que contienen sentencias if.
  • optimización: En muchos casos, las verificaciones de inicialización de variables se reemplazan ahora por "no-ops" después que se realiza la primera verificación. Euphoria ya tenía optimizadas muchas verificaciones en tiempo de compilación.
  • optimización: get() y value() son mucho más rápidos gracias a Jiri Babor y algunas otras optimizaciones de RDS. La nueva v2.1 de ex.exe con el nuevo get.e v2.1 es:

    1.45 veces más rápido leer una secuencia de números de punto flotante desde un archivo y
    2.25 veces más rápido cuando se lee una secuencia de enteros desde un archivo.

  • optimización: power(x,2) se convierte internamente a x*x, que es mucho más rápido en todos los casos, especialmente cuando x es un entero grande o un número de punto flotante.
  • optimización: Gracias a Jiri Babor, int_to_bits() es un 15% más rápido en la mayoría de los casos.
  • optimización: Trazar una secuencia extensa de píxeles en modos gráficos de 16 colores, es un 3% más rápido.
  • optimización: draw_line() aumentó su velocidad un poco.
  • Language War ha tenido una cirugía estética importante. Ahora corre en el modo 18 de gráficos de píxel (640 x 480 x 16 colores) en lugar de modo de texto. También tiene paralelismo de grano fino, es decir, virtualmente cualquier cosa puede ocurrir en paralelo a cualquier otra. Se pueden dibujar simultáneamente varios torpedos, fasores, etc., mientras las naves se mueven, se ingresan comandos, hay cosas explotando, etc. Incluso la sincronización necesaria para los efectos sonoros del altavoz de la PC es manejada por el planificador de tareas. No se ejecutan ciclos de demora durante el juego. La exploración de la galaxia ahora muestra una imagen a escala de la galaxia completa, en lugar que solamente un grupo de números.
  • El formato de impresión por defecto para átomos se cambió de "%g" a "%.10g". print(), ?, la utilidad trace, y los volcados en ex.err usan este formato. Esto permite que los enteros grandes de -9,999,999,999 a +9,999,999,999 se impriman como enteros, en lugar de usar notación científica. También aporta 10 dígitos de exactitud, en lugar de 6, al mostrar números fraccionarios. Art Adamson y otros dejaron claro que se tenían que mostrar más dígitos.
  • El estado de todos los parámetros with/without se guarda al comienzo de un archivo de inclusión, y se recupera al final de un archivo de inclusión. Un archivo de inclusión puede cambiar los parámetros, pero se restablecerán al terminar el archivo. Por ejemplo, las advertencias se tienen que desactivar dentro de un archivo de inclusión (y dentro de todos los archivos que incluya). Consecuentemente algunos programas ahora muestran advertencias donde antes no se mostraban.
  • Las advertencias se muestran ahora después que su programa termina la ejecución, por lo que no serán borradas por clear_screen(), graphics_mode(), etc. Consecuentemente algunos programas ahora muestran advertencias donde antes no se mostraban.
  • La seguridad del código encriptado y del código enlazado se mejoró gracias a las ideas aportadas por Rusty Davis. Cuando un programa enlazado inicia la ejecución, se realiza una verificación rápida de su integridad para detectar cualquier daño o violación. Aún se pueden agregar datos al final de un archivo .exe enlazado, mientras que su última línea es abort(x).
  • El editor ed le permite ahora ver y editar más allá de la columna 80.
  • ed tiene un nuevo comando: Esc-M (modificaciones). Demostrará las diferencias entre el archivo original en disco y el búfer de edición actual. Esto puede ser muy útil cuando usted se ha olvidado de qué cambios hizo, y se está preguntando si es seguro guardarlos.
  • La ventana de trazado ahora proporciona un comandoQ mayúscula que le permite al programa ejecutarse hasta el final, ignorando cualquier comando trace(1). El comando q minúscula le permite ejecutarse hasta el siguiente trace(1).
  • Se mejoró safe.e (versión de depuración de machine.e). Ahora capturará automáticamente los casos adicionales donde los datos se escriben ilegalmente momentos antes, o enseguida después, de los límites de un bloque asignado de la memoria. Esto puede ser particularmente útil en WIN32 donde Windows pudo sobreescribir uno de sus bloques de tamaño insuficiente. Sin una herramienta tal como safe.e, este tipo de error podría tomar horas o aún días encontrarlo.
  • Se creó el directorio euphoria\tutorial para mantener varios programas tutoriales pequeños.
  • El límite en la cantidad de archivos abiertos se elevó de 15 a 25. Tres de esos archivos son 0,1,2: entrada estándar, salida estándar y error estándar, por lo que ahora tiene hasta 22 archivos propios abiertos simultáneamente (por lo que sabemos, nadie excedió nunca el viejo límite, pero parecía sabio elevarlo).
  • Cuando el usuario simplemente escribe ex o exw y se le pregunta el nombre del archivo Euphoria .ex o .exw a ejecutar, command_line() ahora se actualizará para incluir como segundo argumento de la línea de comandos, el nombre del archivo, como si el usuario hubiera escrito originalmente: ex <nombre de archivo>. Gracias a Mathew Hounsell por sugerir esto.
  • mset.ex ahora guarda imágenes en formato .bmp. Antes usaba un formato comprimido no estándar.
  • lines.ex (lines.bat) ahora informa también las líneas no-en-blanco/sin-comentarios. Esto no es lo mismo que la "sentencia de conteo" usada por Euphoria para el límite del diagnóstico, pero está generalmente dentro del +/- 10%, asumiendo que usted escribe una sentencia por línea.
  • Los literales numéricos mayores que 1e308 (groseramente), se fijan ahora a +/- inf. Causaban un error de tiempo de compilación.

 
Versión 2.0 Edición Oficial, 25 de Marzo de 1998:

  • Cambió el procedimiento de instalación. El archivo Euphoria .zip contiene un gran archivo bundle.dat que contiene más de 100 archivos. Esto hace más sencillo de localizar los archivos importantes: readme.doc, install.bat, etc. que se deberían ver antes de realizar la instalación. Como resultado, el archivo .zip es 35K más pequeño.
  • shroud le avisará que use bind/bindw si intenta crear un archivo fuente encriptado con la extensión ".exe".

 
Versión 2.0 (Beta), 26 de Febrero de 1998:

  • El intérprete de WIN32, exw.exe, es ahora un verdadero programa WIN32 GUI. En la versión 2.0 Alpha era un programa WIN32 de consola que siempre estaba asociado con una consola o ventana DOS. Ahora se creará una ventana de consola de estilo DOS, solamente si su programa necesita una.exw creará automáticamente una nueva ventana de consola la primera vez que su programa escriba en pantalla , lea desde el teclado. o llame a cualquier rutina de librería que necesite una consola para funcionar. La consola desaparecerá automáticamente al teminar la ejecución del programa.
  • Una nueva rutina de librería, free_console(), borrará inmediatamente la ventana de consola si existe una.
  • La Edición Completa de Euphoria provee la opción -scramble de bind y shroud para mejorar la seguridad de los programas que distribuye.
  • Ahora puede pasar átomos Euphoria a rutinas de C como argumentos de punto flotante de 64 bits de C, y recibir un resultado de punto flotante desde una función de C.
  • exw.exe (beta) corre de 10% a 15% más rápido que exw.exe (alpha) (basado en sieve.ex, shell.ex, etc.). El compilador WATCOM C estaba haciendo mal el trabajo de optimización de una sección crítica del intérprete cuando generaba exw.exe, pero producía un código excelente al generar ex.exe. Con algunos cambios triviales en el código del intérprete de C, WATCOM produce código excelente para ambas plataformas.
  • El programa promedio tiene 60K más de memoria disponible, antes de tener que usar el archivo de intercambio.
  • Se eliminó el límite en el tamaño de un procedimiento simple, función o tipo.
  • Se eliminó el límite en el tamaño de una sentencia simple de alto nivel.
  • Se incrementó de 150 a 256 la cantidad total de archivos de inclusión que un programa puede tener.
  • Se agregaron algunas optimizaciones. Las siguientes nuevas formas de expresiones son más rápidas:
               2 * x 
               x * 2 
               1 + x 
    
    donde 'x' puede ser cualquier expresión de tipo átomo o secuencia.
  • El nuevo archivo de documentación, perform.doc, trae muchos consejos para programadores obsesionados con el rendimiento.
  • Si llama una rutina de C usando c_func(), pero la enlaza usando define_c_proc(), obtendrá un mensaje de error. Similarmente, si la llama usando c_proc(), pero la enlazó usando define_c_func() obtendrá un mensaje de error. Esta restricción estaba documentada, pero no realmente obligada a cumplirse en Alfa 2.0. Algunos programas escritos para la versión Alfa tendrán que ser corregidos.
  • Ahora verá el nombre real de la rutina C o Euphoria a la que está intentando llamar, al obtener un mensaje de error desde call_proc(), call_func(), c_proc(), o c_func().
  • La nueva opción -clear_routines de bind y shroud dejará los nombres de todas las rutinas sin encriptar. Esto es necesario si su programa llama a routine_id(). Se le avisará si usa routine_id() y no tiene elegida esta opción (los usuarios registrados pueden usar -scramble junto con -clear_routines para recuperar un alto nivel de encriptado).
  • Si un conflicto de nombres se presenta con un símbolo global, el encriptador le avisará, y después elige un nuevo nombre. Se usaba para abortar con un mensaje.
  • Ya no es más posible trazar o analizar código encriptado.
  • Se agregó un nuevo programa de demostración (hash.ex) a euphoria\demo.
  • Se movió freq.ex de euphoria\bin a euphoria\demo y se lo renombró como tree.ex.
  • Un nuevo archivo de documentación, bind.doc describe las características de bind.bat y shroud.bat. Se redujo la descripción anterior en refman.doc.
  • El archivo overview.doc da un vistazo rápido a todos los archivos de documentación.
  • La descripción de get_mouse() en library.doc discute el problema de los modos gráficos de ancho 320 (tiene que dividir el valor de la coordenada 'x' por 2).

 
Versión 2.0 Edición Alfa, 5 de Noviembre de 1997:

  • Se agrega una nueva plataforma. exw.exe correrá programas Euphoria usando el sistema operativo WIN32 (Windows de 32 bits). ex.exe correrá programas usando DOS32 (DOS extendido). Ver más detalles en platform.doc.
  • Se agregaron las siguientes rutinas de librería.

    Tanto para DOS32 como WIN32:
    platform() -
    informa soobre cual plataforma se está ejecutando (la constante PLATFORM está disponible en Euphoria 2.2 y siguientes).
    routine_id() -
    obtiene un identificador entero pequeño para un procedimiento o función Euphoria.
    call_proc() - llama a un procedimiento Euphoria usando su ID.
    call_func() - llama a una función Euphoria usando su ID.
    custom_sort() -
    ordena una secuencia usando una función de comparación que usted esopecifica.
    poke4() -
    almacena un número en 4 bytes de memoria. poke4(address, value) es al menos 10 veces más rápida que: poke(address, int_to_bytes(value)). poke4() también funciona con secuencias de valores.
    peek4s() -
    lee 4 bytes de memoria como un entero con signo (funciona también con secuencias).
    peek4u() -
    lee 4 bytes de memoria como un entero sin signo (funciona también con secuencias). peek4u(address) es 10 veces más rápido que: bytes_to_int(peek({address, 4})).
    allocate_string() - asigna y almacena una cadena termina en 0 en la memoria.

    Para WIN32 solamente:
    open_dll() - abre un archivo dll de Windows.
    define_c_proc() - define una rutina C que se llamará desde Euphoria (sin valor de retorno).
    define_c_func() - define una rutina C que se llamará desde Euphoria (con valor de retorno).
    call_c_proc() - llama a una rutina de C desde Euphoria (sin valor de retorno).
    call_c_func() - llama a una rutina de C desde Euphoria (con valor de retorno).
    call_back() -
    obtiene una dirección de call-back, por lo que Windows puede llamar a su rutina Euphoria cuando el usuario interactua con su ventana.
    message_box() - muestra una ventana simple Sí/No/Cancelar.

  • Nuevos programas de demostración:
    • csort.ex
    • email.exw
    • window.exw
    • winwire.exw
    • dsearch.exw
  • Nuevos archivos de inclusión:

    safe.e - versión de depuración de machine.e
    misc.e - misceláneas
    dll.e - acceso a dll's
    msgbox.e - Caja de mensajes de Windows

  • Se hicieron las siguientes mejoras en la versión DOS32:
    • En sistemas Pentium y superiores, los cálculos en punto flotante son 20% más rápidos (en exw es un 20% más rápido que ex para 2.0).
    • printf() a la pantalla y print() a la pantalla son significativamente más rápidos en la mayoría de los casos.
    • La ventana de trazado se actualiza más rápido.
    • El análisis de prfiles por tiempo es más exacto regarding getc().
    • El demo mset.ex corre un 30% más rápido.


Items Destacados de Antiguas Ediciones

 
Versión 1.5a, 13 de Junio de 1997:

  • Se optimizan muchas operaciones y rutinas de librería.

    • get_key() es 100 veces más rápida que cuando no hay una clave en el búfer.

    • get_all_palette() es casi 100 veces más rápida, lo que hace a save_screen() mucho más rápida.

    • Se han incorporado las siguientes rutinas directamente en ex.exe, para evitar el consumo de recursos llamando a machine_proc() o machine_func(): pixel(), get_pixel(), mem_set(), mem_copy().

    • poke() de una secuencia larga en memoria, other than video memory, es un 50% más rápida.

    • pixel() es 4 veces más rápida en modo 19.

    • get_pixel() es más rápida en todos los modos.

    • display_image() es alrededor 30% más rápida en la mayoría de los modos y hasta 4 veces más rápida en modo 19 debido a que pixel() es más veloz.

    • Todas las operaciones aritméticas y de bits aplicadas a secuencias de enteros son un 29% más rápidas.

    • a & b (concatenación) es un 15% más rápida en la mayoría de los casos, y drásticamente más rápida en el caso en que una secuencia muy grande crece debido a la concatenación de muchas pequeñas.

    • getc() es un 12% más rápida.

    • match() es un 8% más rápida en casos típicos.

    • append()/prepend() son un 15% más rápidas en la mayoría de los casos.

    • find() de un entero dentro de una secuencia de enteros es un 64% más rápida.

    • La formación de una secuencia de dos elementos {a,b} es un 11% más rápida.

    • El copiado interno de una secuencia compartida cuando ya no se puede compartir es un 15% más rápido.

 
Versión 1.5, 21 de Marzo de 1997:

  • Se agregan las siguientes rutinas de librería, que se describen completamente en library.doc.

    • allow_break()
    • check_break()
    • mem_copy()
    • mem_set()
    • atom_to_float32()
    • atom_to_float64()
    • float32_to_atom()
    • float64_to_atom()
    • get_all_palette()
    • save_bitmap()
    • save_screen()
    • arctan()
    • and_bits()
    • or_bits()
    • xor_bits()
    • not_bits()
    • get_vector()
    • set_vector()
    • lock_memory()
    • tick_rate()

    Se agrega with profile_time (análisis de perfiles por tiempo para DOS32).

 
Versión 1.4b, Octubre de 1996:

  • mset.ex tiene una caja de selección más visible en su grilla. También tiene más velocidad.
  • ed.ex permite que los caracteres especiales mayores que el ASCII 127 se ingresen presionando la tecla Alt y escribiendo dígitos en el teclado numérico.

 
Versión 1.4a, Julio de 1996:

  • Se agrega la rutina de librería crash_message().
  • Los programas enlazados por los usuarios registrados, producirán ahora diagnósticos de errores en tiempo de ejecución sin importar el tamaño de los programas.
  • shroud.bat tiene una nueva opción: -full_keywords.

 
Versión 1.4, Mayo de 1996:

  • Ahora se puede convertir cualquier programa Euphoria en un archivo ejecutable_autónomo.exe.
  • Se elimina el archivo de expansión del DOS, DOS4GW.EXE.
  • Soporte para los nombres largos de Windows 95.
  • Soporte para interrupciones de software en DOS.
  • Nuevos programas utilitarios: key.ex, where.ex, ascii.ex, guru.ex.
  • Nuevo programa de demostración: dosint.ex.
  • Nuevas rutinas de librería: set_rand(), use_vesa().
  • Se pueden usar peek() y poke() con secuencias enteras de bytes.
  • Mejoras en el editor.
  • Reducción en el consumo de recursos en las secuencias.

 
Versión 1.3, Junio de 1995:

  • Ahora se pueden editar varios archivos, usando varias ventanas de edición.
  • Se agregan 20 nuevas rutinas de librería.
  • Se mejorán sustancialmente las prestaciones gráficas.

 
Versión 1.2, Marzo de 1994:

  • Se elimina un problema que impide a Euphoria correr en DOS bajo Windows.

 
Versión 1.1, Enero de 1994:

  • Se agregan varias características al lenguaje y programas de demostración.

 
Versión 1.0, Julio de 1993:

  • Euphoria fue lanzado, luego de tres años de investigación y desarrollo y seis meses de pruebas Beta. Muchas de las ideas detrás de Euphoria vienen de la Tesis de Maestría en Ciencias de la Computación de Robert Craig de la Universidad de Toronto. Aquella tesis estaba muy influenciada por el trabajo de John Backus sobre lenguajes de programación funcional.