Gambas
Introducción
Gambas (Gambas Almost Means Basic) es un lenguaje de programación de alto nivel
libre basado en BASIC y es distribuido bajo la licencia GNU GPL.
Permite crear formularios con botones de comandos, cuadros de texto y muchos otros
controles y enlazarlos a bases de datos como MySQL, PostgreSQL o SQLite además de
facilitar la creación de aplicaciones muy diversas como videojuegos (utilizando
OpenGL), aplicaciones para dispositivos móviles (en desarrollo pero muy avanzado),
aplicaciones de red (con manejo avanzado de protocolos HTTP, FTP, SMTP, DNS),
entre otras.
La documentación oficial de Gambas contiene mucha información acerca de las
funciones que existen en el lenguaje y la sintaxis para utilizarlas. Considere a la
documentación a partir de hoy como su mejor y fiel amigo en el estudio y la realización
de programas en Gambas.
Gambas permite escribir facilmente aplicaciones para la consola -en modo texto- y
aplicaciones gráficas.
IDE de Gambas
La ventana principal de Gambas versión 3 tiene un aspecto como lo muestra la imágen:
Podemos observar en la imágen los elementos principales que componen Gambas, los
cuales son los siguientes:
En la parte superior la barra de herramientas con botones para las acciones más
comunes en el desarrollo de aplicaciones.
En la izquierda se encuentra el visor de los archivos que contiene el proyecto
activo, en el se pueden abrir o cerrar todos los archivos que se hayan creado o
agregado al proyecto activo.
En la parte inferior se encuentra el visor de la consola. Todos los programas que
se desarrollen para la consola desplegarán su respectivo resultado en esta área.
Finalmente, en el centro de la pantalla se encuentra el editor de código para el
archivo activo. Notese que este editor tiene sus botones de acciones comunes y
permite tener abiertos varios archivos a la vez y navegar entre ellos mediante
pestañas.
Variables
Los programas manejan datos continuamente. Estos datos pueden ser de muchos tipos:
números, letras, textos, etc., y cambiar a lo largo de la ejecución del programa (en ese
caso reciben el nombre de variables) o permanecer con un valor fijo durante todo el
tiempo (entonces se denominan constantes). A los datos que usa un programa se les
denomina un nombre identificador.
Hay dos lugares donde se pueden declarar las variables, dependiendo del ámbito en el
que se vayan a usar. Si se declaran dentro de una subrutina o función, están disponibles
para ser usadas dentro del ámbito correspondiente. Si se declaran al principio del
archivo de código están disponibles para todo el código de ese archivo, en todas sus
subrutinas.
La sintaxis para declarar variables en Gambas es la siguiente:
Dim nombreVariable As tipoDeDato
La declaración de todas las variables en Gambas deben iniciar con la palabra
clave Dim y finalizadas con el tipo de dato que se desea declarar la variable. Observe
que antes del tipo de dato es necesario escribir la palabara clave as.
Las variables son un contenedor de información y existen diferentes tipos de
información que se pueden almacenar, a esto se le conoce como tipo de dato. Los tipos
de datos que existen en Gambas son los siguientes:
Boolean: es un tipo de dato que suele ser el resultado de una comparación. Solo
acepta dos valores: True y False.
Byte: representa un número entero positivo entre 0 y 255.
Short: representa un número entero con valores posibles entre -32,768 y +32,767
Integer: representa un número entero con valores posibles entre -2,147,483,648 y
+2,147,483,647
Long: representa un número entero con valores posibles entre:
-9,223,372,036,854,775,808 y +9,223,372,036,854,775,807
Single: representa un número real, con decimales, con valores posibles entre
-1.7014118E+38 y +1.7014118E+38.
Float: representa un número real, con decimales, con valores posibles entre
-8.98846567431105E+307 y +8.98846567431105E+307
Date: sirve para almacenar un valor de fecha y hora. Internamente, la fecha y hora se
almacena en formato UTC, al devolver el dato se representa en el formato local, según
la configuración del ordenador.
String: se usa para almacenar una cadena de texto. Se asignan mediante el uso de
comillas dobles.
Variant: significa cualquier tipo de dato, es decir, puede almacenar un Integer,
Single, String, etc. Se debe evitar su uso porque ocupa más memoria que los anteriores
y los cálculos con Variant son mucho más lentos.
Object: representa cualquier objeto creado con Gambas.
Constantes
En un programa es común tener parámetros que no cambian de valor durante la
ejecución. Para estos casos resulta muy práctico utilizar constantes. Las constantes se
definen sólo al principio de un archivo de módulo o clase, no se pueden definir dentro
de las subrutinas y funciones
La sintaxis es la siguiente:
{ Public | Private } Const nombreVariable As TipoDato = Valor
constante
Ejemplo. Se declara una constante que tiene el valor constante del número pi.
Public Const p As Float = 3.141596
Escritura
En muchos programas es frecuentemente necesaria la entrada y salida de datos, para ello
existen un par de funciones de entrada y salida. Para el caso de entrada, o bien lectura,
se utiliza la siguiente sintaxis.
Print [ # Flujo , ] Expresión [ { ; | ;; | , } Expresión ... ] [ { ; | ;; | , } ]
La instrucción Print permite imprimir expresiones y dirijirlos a un flujo de
salida, que por defecto es la salida estándar (la pantalla). Las expresiones que se
pueden imprimir son variables, cadenas de caracteres y combinaciones de ellas.
Esta función permite algunas opciones en cuanto se imprimen las expresiones. Dichas
opciones son las siguientes:
Si se añade un punto y coma al final de la instrucción, se dejará el cursor en esa
posición por lo que la siguiente impresión se hará justo en ese punto.
Si no hay un punto y coma después de la expresión, se añade un caracter de "nueva
línea" después de la última expresión.
Si se utiliza una coma en lugar de un punto y coma, se añade un caracter de tabulación
(código 9 ASCII) para separar las expresiones.
Si hay un punto y coma doble, se añade un caracter de "espacio" entre las expresiones.
Ejemplo 1: La siguiente instrucción imprime el contenido de la variable x en pantalla y
hace un salto de línea.
Print x
Ejemplo 2: La siguiente instrucción imprime el caracter x en pantalla y hace un salto de
línea.
Print "x"
Ejemplo 3: La siguiente instrucción imprime la cadena de caracteres "Hola mundo
cruel" en la pantalla, deja el cursor inmediatamente después del ultimo caracter
impreso.
Print "Hola mundo cruel.";
Ejemplo 4: La siguiente instrucción imprime la cadena de caracteres "Hola mundo
cruel" en la pantalla, al final hace un salto de linea.
Print "Hola";; "mundo";; "cruel."
Ejemplo 5: La siguiente instrucción imprime una cadena de caracteres y el contenido de
una variable en la pantalla. Si por ejemplo x=4, la impresión en pantalla seria: "El
contenido de la variable es 4."
Print "El contenido de la variable es";; x ; "."
Lectura
Para el caso de la lectura de información hacia el programa se utiliza la función Input
con la siguiente notación:
Input [ # Flujo , ] Variable [ , Variable ... ]
Lee desde Flujo, y convierte elementos separados por caracteres de espacio o retornos de
carro con la función Val antes de situar el valor en las variables. Si no se especifica el flujo, se
lee de la entrada estándar. Las variables deben ser declaradas antes de utilizarse con esta
función.
Es posible leer varios datos con un solo Input, separando las variables con comas. Los
valores se leerán uno a la vez y se guardarán en las variables en el orden en que fueron
escritas en la función. Las variables pueden ser de diferentes tipos, son independientes
entre ellas.
Ejemplo 1. La siguiente función solicita un número y lo guarda en la variable x.
Input x
Ejemplo 2. La siguiente instrucción lee una cadena de caracteres y la guarda en la
variable nombre.
Input nombre
Ejemplo 3. La siguiente instrucción guarda el nombre de una persona, su edad y
su RFC.
Input nombre, edad, rfc
Operadores aritméticos, relacionales y
lógicos
Operadores Aritméticos
Cuando se trata de trabajar con números, Gambas tiene las operaciones habituales en
casi todos los lenguajes de programación. Para poder realizar operaciones aritméticas
necesitamos de operadores aritméticos. El resultado de una operación será un número.
Operador Operación Ejemplo Resultado
^ Potencia 4^3 64
* Multiplicación 8.25*7 57.75
/ División 15/4 3.75
+ Suma 125.78 + 62.50 188.28
- Resta 65.30 - 32.33 32.97
Módulo
Mod (Residuo de la 15 Mod 2 1
división)
Div División Entera 17 Div 3 5
Operadores Relacionales
Operador Operación Ejemplo Resultado
= Igual que 'Hola' = 'Lola' False
<> Diferente de 'a'<>'b' True
< Menor que 7<15 True
> Mayor que 22>11 True
>= Menor o igual que 22<=15 False
>= Mayor o igual que 35>=20 True
Los operadores relacionales permiten comparar dos operandos. Los resultados pueden
ser números, alfanuméricos, constantes o variables. Las constantes o variables pueden
ser a su vez de tipo entero, real, caracter o cadena de caracteres. El resultado de una
expresión con operadores relacionales es verdadero o falso.
Operadores Lógicos
Los operadores lógicos permiten formular condiciones complejas a partir de
condiciones simples. Los operadores lógicos son de conjunción (o), disyunción (y) o
negación (no).
Operador Operación Ejemplo Resultado
Or Conjunción: O Lógica 4>5 Or 6>5 True
And Disyunción: Y Lógica 4>5 Or 6>5 False
Not Negación: No Lógico Not 4>5 True
Jerarquía de Operaciones
Al evaluar expresiones que contienen operadores aritméticos debemos representar la
jerarquía en el orden correcto. Es decir, si tenemos en una expresión más de un
operador, debemos aplicar primero el operador de mayor jerarquía, resolver esa
operación y así sucesivamente.
Operador
()
Operador
Funciones y Subrutinas
*, /, Div, Mod
+, -
=, <>, <, >, <=, >=
Not
And
Or
Es importante señalar que el operador () es un operador asociativo que tiene la
prioridad más alta en cualquier lenguaje de programación. La siguiente tabla muestra la
jerarquía de los operadores aritméticos. Mientras más arriba en la tabla se encuentre el
operador, mayor será su jerarquía; mientras más abajo en la tabla se encuentre el
operador, menor será su jerarquía.
Cuando se evalúa una expresión que tiene operadores aritméticos, lógicos y/o
relacionales, Gambas lo resuelve de acuerdo a la jerarquía de las operaciones
comenzando con la mayor jerarquía hacia la menor. Si en algún momento hubiera
empates, dos operaciones con la misma jerarquía, las realiza comenzando de izquierda
hacia la derecha.
Conversiones de datos
Gambas permite distintas conversiones de datos. La forma de hacer la conversión puede
ser explícita o implícita. Son conversiones implícitas cuando el propio intérprete de
Gambas se encarga de gestionarlas. Por ejemplo:
Dim resultado As Single
Dim operando1 As Single
Dim operando2 As Integer
operando1 = 3.5
operando2 = 2
resultado = operando1 * operando2
En este caso, para poder realizar la multiplicación, el compilador convierte la variable
operando2 a tipo Single.
Por otro lado, las conversiones explícitas las que deben hacer que el programador al
escribir el código para poder realizar operaciones. Estas conversiones se hacen mediante
funciones que están incluidas en Gambas. Las funciones de conversión son las
siguientes:
CBool(expresión): Convierte la expresión a un valor booleano, verdadero o
falso. El resultado será falso si la expresión es falsa, el número 0, o una cadena de
texto vacía o un valor nulo. Será verdadero en los demás casos. Por ejemplo:
o Devuelve False las siguientes
operaciones: Cbool(""), Cbool(0), Cbool(NULL)
o Devuelve True las operaciones: Cbool(1), Cbool("Gambas")
CByte(expresión): Convierte la expresión en un valor tipo Byte. Primero se
convierte la expresión a un número binario de 4 bytes. Si este número es mayor a 255,
se corta recogiendo los 8 bits menos significativos. Por
ejemplo, Cbyte("17") devuelve 17, pero Cbyte(100000) devuelve 160.
CShort(expresión), CInt(expresión) o CInteger(expresión),
y CLong(expresión): Convierten, respectivamente, la expresión en un número
tipo Short, Integer y Long. En el caso de CShort la conversión se realiza igual
que para CByte, produciendo resultados extraños si la expresión resulta en un
número mayor a 32,767.
CDate(expresión): Convierte la expresión en una fecha y sólo admite el formato
mes/día/año.
CSingle(expresión), CSng(expresión) y CFoat(expresión) o Cfl
t(expresión): Convierten, respectivamente, la expresión en un número del
tipo Single y Float. La expresión debe usar el punto (.) y no la coma (,) como
separador decimal.
CStr(expresión): Convierte la expresión en una cadena de texto sin tomar en
cuenta la configuración local. Por tanto, Str$(1.58) devuelve la cadena de texto
1,58, independientemente de si la configuración local indica que el separador decimal
es el punto o la coma, o CStr(CDate("09/06/1972 [Link]")) devuelve
"/06/1972 [Link]"
Str$(expresión): Convierte la expresión en una cadena de texto, teniendo en
cuenta la configuración local. Por tanto, Str$(1.58) devuelve la cadena de texto
1,58, si la configuración local está en español. Del mismo modo, Str$
(CDate("09/06/1972 [Link]")) devuelve "/06/1972 [Link]" si
la configuración local está en español.
Val(expresión): Convierte una cadena de texto en un tipo Boolean, Date o
alguno de los tipos numéricos, dependiendo del contenido de la expresión. Val es la
función opuesta de Str$ y, por tanto, también tiene en cuenta la configuración local
de la computadora en la que se ejecuta. Intenta convertir la expresión en un
tipo Date, si no puede en un número con decimales, si tampoco puede en un número
entero y si, finalmente, tampoco puede la convierte en un tipo Boolean.
Funciones Especiales
Aparte de los operadores existen funciones matemáticas para realizar cálculos
complejos o especiales:
Abs(número): devuelve el valor absoluto de un número.
Dec(número): decrementa en una unidad al número.
Frac(número): devuelve la parte no entera de un número.
Inc(número): incrementa en una unidad el número
Int(número): devuelve la parte entera del número.
Max(número1, número2, ...): devuelve el número mayor.
Min(número1, número2, ...): devuelve el número menor.
Round(número, decimales): redondea un número con los decimales
deseados.
Sgn(número): devuelve el signo de un número.
Rnd([mínimo], [máximo]): devuelve un número aleatorio comprendido
entre mínimo y máximo. Si la función es invocada sin argumentos, se devuelve un
número aleatorio entre 0 y 1. Si solo se expresa un valor, se devuelve un número entre
0 y ese número. Antes de utilizar esta función es necesario ejecutar la
instrucción Randomize para generar una semilla, de no ser así se obtendrá siempre
el mismo número en sucesivas ejecuciones de