Árvore de páginas

Versões comparadas

Chave

  • Esta linha foi adicionada.
  • Esta linha foi removida.
  • A formatação mudou.

...

Las barras verticales ( | | ), que delimitan la lista de argumentos de los bloques de código, son obligatorias, aunque no existan argumentos. A continuación, listamos algunos ejemplos de bloques de código:

 

Sem Formato
{ | | “Bloque sin argumentos” }

...


{ | x | x + 1 }

...


{ | a, b | Func1(a) + Func2(b) }

...


{ | i, j, k | Func(i), Func(j), Func(k) }

 

Como se dijo anteriormente, un bloque de código puede atribuirse a una variable o elemento de array por medio del operador en línea ( := ).

...

La función EVAL() ejecuta el bloque de código especificado ( <bloque de código> ), pasándole los argumentos contenidos en la lista de parámetros ( <lista de parámetros> ). Las expresiones contenidas en el bloque de código se ejecutan y evalúan una por una, de izquierda a derecha. El valor resultante del bloque de código será el resultado de la última expresión. Por ejemplo: 

Sem Formato
bCodBloc := { | nNum1, nNum2 | nNum1 * nNum2 }

...


 

...


MSGALERT( EVAL(bCodBloc, 2, 3) )

 

El resultado de la expresión anterior será 6.

...

El siguiente ejemplo muestra la función Mensaje sin la utilización de bloques de código. En este caso, la función depende del tipo de dato pasado.

 

Sem Formato
// Muestra un dato en la pantalla, por una determinada cantidad de veces.

...


FUNCTION Mensagem(xDado, nVezes)

...

 

...



	LOCAL nRepet :=

...

 

...

 0

	IF VALTYPE(xDado) ==

...

 ?C?
	// Dato del tipo carácter

...


		xDado :=

...

 

...

 xDado

	ELSEIF VALTYPE(xDado) ==

...

 ?N?
	// Dato del tipo numérico

...


		xDado := LTRIM(STR(xDado))

...

 

...



	ELSEIF VALTYPE(xDado) ==

...

 ?D?
	// Dato del tipo fecha

...


		xDado := DTOC(xDado)

...

 

...



	ELSEIF VALTYPE(xDado) ==

...

 ?L?
	// Dato del tipo lógico

...


		xDado := IIF(xDado,

...

 ?Verdadero?, ?Falso?)

	ELSE
	// Otro tipo de dato
		xDado := ?Indefinido?
	ENDIF

	FOR nRepet := 1 TO nVezes
		MSGALERT(xDado)
	NEXT nRepet

RETURN

 

 

 

ELSE

          // Otro tipo de dato

          xDado := “Indefinido”

ENDIF

 

FOR nRepet := 1 TO nVezes

          MSGALERT(xDado)

NEXT nRepet

 

RETURN

 

Para dejar la función Mensaje más genérica, independientemente del tipo de dato pasado, podrían utilizarse los siguientes bloques de código:

 bCarCod  

Sem Formato
bCarCod   := { | xDado | xDado }

...


bNumCod   := { | xDado | LTRIM(STR(xDado))

...

 }
bLogCod   := { | xDado | IF(xDado, “Verdadero”, “Falso”)

...

 }
bDatCod   := { | xDado | DTOC(xDado) }

 

 

 

Pasando los bloques de código definidos anteriormente, la función Mensaje podría tener la siguiente forma:

 

Sem Formato
// Muestra un dato en la pantalla, por una determinada cantidad de veces.

...


FUNCTION Mensagem(xTexto, bBloco, nVezes)

...

 

...




LOCAL nRepet :=

...

 

...

 0


FOR nRepet := 1 TO

...

 nVezes
          MSGALERT(EVAL(bBloco, xTexto))

...


NEXT

...

 

 nRepet


RETURN

 

Por lo tanto, una de las utilizaciones básicas de los bloques de código es al pasar parámetros a funciones que traten genéricamente los datos, dejándolos de esta manera, más flexibles e independientes, pues se ejecutan de acuerdo con el bloque de código pasado.

...

Los bloques de código no pueden almacenarse directamente en campos de archivos de datos, a menos que se transformen en variables del tipo carácter. Para utilizarlos posteriormente, se utiliza el operador macro ( & ), de acuerdo con el siguiente ejemplo:

 

Sem Formato
FUNCTION Mensagem()

...

 



LOCAL bBloco := “”

...

 



// Graba el bloque de código en el campo de la Tabla SE2 (Título por pagar) como una variable carácter

...


SE2->E2_TEXTO :=  { |xDado| Func1(xDado) } 

...

 



// Atribuye el bloque de código a la variable bBloco

...


bBloco := &(SE2->E2_TEXTO)

...

 



// Ejecuta el bloque de código almacenado en la variable bBloco

...


EVAL(bBloco, xDado)


RETURN NIL

 

RETURN NIL