Me he encontrado con varios vídeos en Youtube que hablan de cómo utilizar dBASE, o incluso Clipper, utilizando emuladores como DosBOX para MS-DOS.
Chico, esto trae memorias. dBASE III+ fue un auténtico éxito comercial, pues permitía manejarse con bases de datos de manera muy, muy sencilla, imperativamente, eso sí (no como SQL, que se supone que lo hace todo por ti), pero de forma que, si sabes lo que estás haciendo, el acceso a la base de datos sea muy rápido.
Podías manejarte con una base de datos mediante las opciones de los menús, pero es que también podías utilizar comandos que permitían hacer consultas, modificar la estructura de la base de datos, añadir, modificar o eliminar registros...
Por ejemplo, lo que sigue es el ¡Hola, mundo!
procedure main()
* This is an example
clear
? "Hello, the weather is fine today"
return
Poco después surgió Clipper, ¡un compilador! Podías distribuir ejecutables de tus programas, sin necesidad de que el cliente tuviese instalado dBASE.
El siguiente código crea una base de datos de contactos:
* Inicia la base de datos de contactos
procedure ini_contactos()
create contactos
use contactos
* Campo nombre
append blank
replace field_name with "nombre"
replace field_type with "c"
replace field_length with 30
* Campo email
append blank
replace field_name with "email"
replace field_name with "nombre"
replace field_type with "c"
replace field_length with 20
close
return
La instrucción create crea una base de datos nueva, que se almacena en el archivo contactos.dbf (de nuevo, que recuerdos). La instrucción use la abre, y creamos los campos necesarios, para cerrarla con close.
Podemos crear un contacto molón como el que aparece abajo, con el siguiente procedimiento:
* Inserta un nuevo contacto
procedure inserta_contacto(nombre, email)
use contactos
append blank
replace nombre with nombre
replace email with email
close
return
Parece que una empresa ha recogido el testigo de dBASE, dBASE LLC. Pero lo que me ha impresionado más es que... ¡existe un alternativa moderna, de código abierto, llamada Harbour. He podido compilar el código que he escrito ahí arriba, y funciona creando un archivo de código fuente C que después debes compilar.
Clipper existió en una época en la que todas las interfaces eran de texto, sobre MS-DOS, por lo que, para pedir unos datos...
* Pide los datos de un nuevo contacto y lo inserta
procedure nuevo_contacto()
local nombre, email
clear
* Muestra el prompt de entrada
@ 5, 10 say "Nombre:" get nombre
@ 7, 10 say "Email :" get email
inserta_contacto( nombre, email )
return
Sí, efectivamente, la arroba permite mover el cursor a un punto determinado de la pantalla, y say permite escribir algo en ella. Con get, en cambio, pedimos un contenido para una variable. Como se puede ver, las variables no tienen tipo, adoptando el tipo del valor que almacenan (como Python).
Una curiosidad: ojeando el código generado:
HB_INIT_SYMBOLS_BEGIN( hb_vm_SymbolInit_CONTACTOS )
{ "CONTACTOS", {HB_FS_PUBLIC | HB_FS_FIRST | HB_FS_LOCAL}, {HB_FUNCNAME( CONTACTOS )}, NULL },
{ "INI_CONTACTOS", {HB_FS_PUBLIC | HB_FS_LOCAL}, {HB_FUNCNAME( INI_CONTACTOS )}, NULL },
...
HB_FUNC( INI_CONTACTOS )
{
static const HB_BYTE pcode[] =
{
36,3,0,176,2,0,106,10,99,111,110,116,97,99,
116,111,115,0,100,100,9,100,20,5,36,4,0,176,
3,0,9,100,106,10,99,111,110,116,97,99,116,111,
115,0,100,100,9,20,6,36,7,0,176,4,0,20,
0,36,8,0,106,7,110,111,109,98,114,101,0,78,
5,0,36,9,0,106,2,99,0,78,6,0,36,10,
0,92,30,78,7,0,36,13,0,176,4,0,20,0,
36,14,0,106,6,101,109,97,105,108,0,78,5,0,
36,15,0,106,7,110,111,109,98,114,101,0,78,5,
0,36,16,0,106,2,99,0,78,6,0,36,17,0,
92,20,78,7,0,36,18,0,176,8,0,20,0,36,
19,0,7
};
hb_vmExecute( pcode, symbols );
}
Esto explica por qué existió una herramienta que permitía decompilar código fuente para Clipper (llamada Rescue5, pensada para cuando perdías los fuentes), y que incluso era capaz de obtener los nombres de las variables... ¡precompilaba todo a una máquina virtual! Me preguntaba si ese p-code era el mismo del antiguo Pascal, pero ya he visto que no, aunque seguro que les sirvió de inspiración.

Top comments (0)