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.

 

 



[1] Una constante string es la que se encuentra encerrada entre comillas dobles.

Hosted by www.Geocities.ws

1