MACRO SUSTITUCION
Concepto y Generalidades
En Queen se entiende como macro
sustitución la técnica de remplazar el nombre de una variable por su contenido. La
variable puede ser string o numeric. Esta técnica hace muy sencillo el manejo de la impresión
de texto formateado con numero. En programación es de gran utilidad, en cierta clase de programas es indispensable
su uso.
En este apartado vamos a ver en detalle como funciona y
cuales son sus beneficios.
Comando macro:
Las opciones del comando macro que es que maneja la macro sustitución son:
·
on: Activa ambas sustituciones (valor
por defecto)
·
off: Desactiva ambas sustituciones.
·
stron:Activa la sustitución string
·
stroff: Desactiva la sustitución string
·
numon:Activa la sustitución numérica
·
numoff:Desactiva la sustitución numérica
·
strnum: Hace que se realice la sustitución string primero
·
numstr: Hace que se realiza la
sustitución numérica primero
Sustitución Numérica.
Una variable numérica tiene una precisión de 16 dígitos decimales. Los cálculos internos
siempre se realizan usando toda la precisión. En cambio para visualizarse, la precisión esta determinada por el numero
de decimales establecido por el comando deci. Una variable numérica se puede visualizar (el contenido)
simplemente ejecutando su nombre como un comando. De hecho Queen
siempre evalúa como una expresión
numérica cualquier entrada que no conoce (antes de evaluarse se le aplica ambas
sustituciones). El resultado es
mostrado en la barra de estado.
Otra forma de visualizar el contenido de una variable es
usando el comando list, que muestra
en una ventana todas las variables que actualmente Queen tiene en memoria. Y la mejor forma es usando macro
sustitución. La macro sustitución numérica
puede ser activa y desactivada usando el comando macro. Cuando esta
desactivada, ningún patrón de sustitución numérica es convertido.
Cuando la sustitución numérica esta activada, todo patrón
que use el carácter tilde (~) se interpreta como un patrón
de sustitución numérica, y siempre funciona en parejas de limitando la
expresión que debe se sustituida por su valor numérico. Cualquier cosa que se
encuentre entre el símbolo de sustitución numérica es evaluada como una
expresión numérica, y su resultado es remplazado por el patrón completo de
sustitución. Por esta razón si la expresión falla en la evolución, un error es
reportado.
La sustitución numérica siempre se realiza después de la
sustitución string, esto
significa que si un string es sustituido,
también serán sustituidos sus formatos de sustitución numérica internos, claro;
asumiendo que la sustitución numérica esta activada.
No es posible usar dos sustituciones numéricas inmediatas, deben de estar
separadas por lo menos por un carácter, incluso el espacio.
Este caso es mostrado en el siguiente ejemplo, en donde los
símbolos de sustitución adyacentes son convertidos a uno solo (~~=~) en la
primera impresión, y en la segunda el
resultado es como lo esperamos.
a=10
b=20
strln ~a~~b~
strln ~a~ ~b~
La salida de este ejemplo es la
siguiente:
10b
10 20
Si la sustitución es una sola, es
posible usar nada mas el primer símbolo. En tal caso todo el resto hacia la
derecha del símbolo es considerado la expresión a evaluar.
El otro caso cuando solo el símbolo
del final se usa, este es ignorado.
Estos dos casos se muestran en el
siguiente ejemplo.
a=10
strln ~a
strln a~
La sustitución numérica nunca (ni
la string) es
ejecutada en una constante string[1]. El siguiente ejemplo demuestra
esto. El comando strln aplica sustitución automáticamente.
macro on
svar="Hola"
nvar=1000
strln " No hay sus titucion 'svar' ~nvar~ "
strln Si
sustitucion 'svar' ~nvar~
Como se puede verse en la salida
aquí abajo, las variables:
No hay sus titucion 'svar' ~nvar~
Si sustitucion Hola 1000
Por defecto, todas ambas sustituciones
están activadas y la sustitución string se realiza antes que la numérica.
La sustitución numérica es muy útil
en programación para crear variables en un numero indefinido y que los nombres
no se repitan.
A continuación se desarrollan una
serie de ejemplos para demostrar la aplicación
Estúdiense los siguientes ejemplos:
La forma mas sencilla de convertir
un string a numero
num="10"
val='num'
strln
~val~
Otro ejemplo:
x=10
y="x^2+3"
valy='y'
strln
valy=~valy~
Lo que sucede en estas asignaciones
es que la expresión de la derecha se le
aplica la macro sustitución string, quedando expuesta la expresión numérica resultante y que es evaluada como una expresión. Esto
funciona ya que la variable x se encuentra definida, de
encontrarse alguna variable no definida o un error en la definición de la
expresión resultante, se presentaría un
error.
Otro ejemplo:
x=10
y1=~x~
strln
y1=~y1~
Analizando el ejemplo anterior, a
la expresión de la derecha en la asignación de y1, se le
aplica la sustitución numérica, así que ~x~=10.
Desarrollo de secuencias usando sustitución
Esta técnica es de especial
importancia en la programación. Permite la creación de un numero indeterminado
de instancias de un objeto, a partir de una base común.
El siguiente ejemplo genera una
secuencia con base nombre.
for i 1
i<=10 1; strln nombre~i~
La salida es:
nombre1
nombre2
nombre3
nombre4
nombre5
nombre6
nombre7
nombre8
nombre9
nombre10
El siguiente ejemplo concatene una
secuencia de números en una variable string
s=""
for i 1
i<=10 1; setstr s 's' ~i~
s
La salida en la barra de estado
string: s=" 1 2 3 4 5 6
7 8 9 10"
El siguiente ejemplo genera una
secuencia x y una secuencia y para evaluar una función de dos variables.
macro on
clsvar *
ecua="x*y-3*x-2*y"
for x 1
x<=4 1 do
for y 1 y<=2 1 do
z='ecua'
strln z(~x~,~y~)=~z~
endfor
endfor
La salida es:
z(1,1)=-4
z(1,2)=-5
z(2,1)=-6
z(2,2)=-6
z(3,1)=-8
z(3,2)=-7
z(4,1)=-10
z(4,2)=-8
Desactivando la sustitución numérica
Cuando se desactiva la sustitución
numérica, es posible almacenar una cadena de texto con los delimitadores de
esta sustitución, sin usando el comando setstr y no una constante string. La ventaja es que las sustituciones string si se podrían realizar.
Pero si se pretende imprimir la salida con el comando strln o str.
El siguiente ejemplo desactiva la
sustitución numérica y mantiene activada la sustitución string.
macro numoff
a=1
setstr var No se sustitullo-->~a~
strln
var-->'var'
La salida es la siguiente:
var-->No se sustitullo-->~a~
El comando strln solo pudo sustituir el string var.
Sustitución string
La sustitución string es realizada antes de la sustitución numérica, por lo tanto
si ambas están activadas, el formato numérico interno de una variable string será convertido también.
Como ya se mencionó, ninguna sustitución es realizada en una
constante string.
Por defecto, todas ambas
sustituciones están activadas.
La sustitución string puede ser activa y desactivada de dos formas:
1.
Para
activar usando el comando: macro on
Este comando activa ambas
sustituciones (numérica y string)
2.
Para
activar usando el comando: macro
stron
Este comando activa exclusivamente
a la sustitución string
3.
Para
desactivar usando el comando: macro off
Este comando desactiva ambas
sustituciones (numérica y string)
4.
Para
desactivar usando el comando: macro
stroff
Este comando desactiva
exclusivamente a la sustitución string
Cuando se crean variables string o se transfiere información string desde
cualquier fuente a una variable string, si las sustituciones antes
mencionadas están activas, siempre el
contenido que se almacenara en la variable string, es
pasado por la macro sustitución para su conversión. En muchas ocasiones es
deseable mantener activada la macrosustitucion ya que los nombres de la variables
que se están usando tienen que convertirse, pero queremos que el contenido
transferido no sea chaqueado, por lo tanto no es posible desactivar ninguna de
las macrosustituciones en forma general. Para esto casos existen una opción que
afecta específicamente al contenido que se esta transfiriendo a una variable string, por defecto esta activa, y es la opción svaron y svaroff, cada uno activa y desactiva
cualquier conversión de macrosustitucion en la transferencia de los contenidos
de las variables string respectivamente.
El ejemplo típico de uso es usando
los componentes.
Ejemplo: svar1 es creada a partir
de una constante string, por lo tanto no se realizaron las sustituciones.
n=1000
setstr var Un string
svar1="Ninguna sustitucion --->~n~
----->'var'"
strln 'svar1'
Saida:
Ninguna sustitucion --->~n~
----->'var'
El siguiente ejemplo muestra
una sustitución string.
s="uno"
setstr svar 's' 's' 's' 's'
strln svar='svar'
La salida:
svar=uno uno uno uno
El siguiente ejemplo realiza la
sustitución de los patrones de sustitución numérica dentro de la variable string.
macro on
x=10
y=20
svar="Los valores x=~x~ y=~y~"
strln svar='svar'
La salida:
svar=Los valores x=10 y=20
Es posible encadenar variables string usando la sustitución.
Ejemplo:
macro on
sv1="Queen"
sv2="Magic"
sv3=" Version "
sv4="1.0"
setstr sv5 'sv1'
'sv2' 'sv3' 'sv4'
strln 'sv5'
Salida:
Queen
Magic Version 1.0
No es posible realizar una
sustitución usando el símbolo tilde uno inmediatamente del otro, deben de están
separados por lo menos por un carácter (puede ser un espacio en blanco).
El comando str
y strln realiza sustitución si estas están activadas. Pero el
comando outsvar toma como parámetro el nombre de
una variable string e imprime su contenido sin aplicar sustitución de ningún
tipo aun cuando estas estén activadas.
Para demostrar el poder de la macro
sustitución, el siguiente programa creara tantas ventanas como tu quieras y con
los nombres que quieras (no deben contener espacio los nombres de cualquier
variable).
macro on
true=1
x=0
y=0
while true do
msg var
ok-no Desea continuar con la creacion?
if var==2;
return
input str
nom Nombre de la ventana:
type nom
tipo
if
tipo==0;return
comp create
window Win'nom' Yo soy la Ventana 'nom'
comp create
textarea Tex'nom' Yo soy el text Area
'nom'
Win'nom'
add Tex'nom'
Win'nom' nomodal
Win'nom'
locate x y
x=x+50
y=y+50
Win'nom' show
enddo
Donde Queen espera formato de macro sustitución:
Las partes donde se puede
especificar formatos de macro sustitución son:
·
Los
nombres de variables
·
Las
expresiones numéricas
·
Especificación
de formatos de color
·
Argumentos
de los comandos de impresión (presentan información)
·
En los
paramentos de algunos comandos como msg, status, etc. En general aquellos comando donde la información que se les pasa
es para consumo final o sea, que no va a ser mas procesada, en la mayoría de
casos es para presentación.
Donde Queen NO espera formato de macro sustitución:
Queen no intenta realizar
conversiones en el establecimiento de bloques de comando, tales como los
bloques de comandos de los eventos de los componentes, los eventos del timer, las rutinas, en general, todos aquellos donde el
contenido son comando que serán ejecutados en determinado momento.
Hay ocasiones que los comandos se
capturan o se tienen en una variable,
el problema es como usar el contenido de una variable para establecer un bloque
de comando, ya que Queen no intentara convertir el formato de macro. Para estos
casos, los objetos que soportan cargar dinámica de bloques de comandos,
soportan una opción especifica de recibir el bloque de comandos desde una
variable, obteniendo el bloque accesando directamente a la variable en memoria
sin pasar el contenido por el conversor de macros.