4D v16.3Detalles de sintaxis |
||
|
4D v16.3
Detalles de sintaxis
Detalles de sintaxis
El compilador espera las reglas de sintaxis habituales de los comandos 4D, no necesita modificaciones especiales para bases que van a ser compiladas. Sin embargo esta sección ofrece algunos recordatorios y detalles específicos:
Para los comandos que operan sobre cadenas, sólo la función Character code requiere atención especial. En modo interpretado, puede pasar indiferentemente una cadena no vacía o vacía a esta función. SEND VARIABLE(variable) El parámetro que pasa debe ser siempre del mismo tipo. Suponga que quiere enviar una lista de variables a un archivo. Para eliminar el riesgo de cambiar los tipos de datos involuntariamente, recomendamos especificar al principio de la lista el tipo de las variables enviadas. De esta forma, cuando usted recibe estas variables, siempre comenzará por obtener un indicador. Luego, cuando llama a RECEIVE VARIABLE, la transferencia se maneja por intermedio de una instrucción Case of. Ejemplo: SET CHANNEL(12;"Archivo") Field (puntero campo) o (tabla número;campo número) Recuerde que las referencias del documento devuelto por las funciones Open document, Append document y Create document son de tipo Hora. Mod (valor;divisor) Variable:=Mod(25;3) o Variable:=25%3 El compilador ve una diferencia entre las dos: Mod aplica a todos los tipos numéricos, mientras que el operador % aplica únicamente a Enteros y Enteros largos. Si el operando del operador % excede el rango de los Enteros largos, el resultado devuelto probablemente será errado. IDLE El comando IDLE se ha añadido al lenguaje 4D para manejar excepciones. Este comando debe utilizarse cuando utilice el comando ON EVENT CALL. Este comando puede definirse como una directiva de gestión de eventos. Por otra parte, cuando 4D está esperando pasivamente por un evento, por ejemplo en un bucle de espera, es evidente que no habrá ninguna llamada. `Método de proyecto ClicRaton En este caso, se añade el comando IDLE de la forma siguiente: `Método Espera Utilice este comando sólo en métodos de proyecto de intercepción de errores. Este comando funciona exáctamente como en 4D, excepto en un método que ha sido llamado por uno de los siguientes comandos: EXECUTE FORMULA, APPLY TO SELECTION y APPLY TO SUBSELECTION. Trate de evitar esta situación. Siete comandos de 4D son utilizados por el compilador para determinar el tipo de un array: COPY ARRAY(fuente;destino) El comando COPY ARRAY acepta dos parámetros de tipo Array. Si uno de los parámetros de array no ha sido declarado, el compilador determina el tipo del array no declarado según el tipo del declarado.
Como el compilador es estricto con los tipos, COPY ARRAY sólo puede hacerse desde un array de un cierto tipo a un array del mismo tipo. $Tamaño:=Size of array(ArrInt)
De la misma forma para 4D en modo interpretado, estos cuatro comandos no necesitan la declaración de arrays. Los arrays no declarados reciben el mismo tipo que el campo especificado en el comando. SELECTION TO ARRAY([MiTabla]CampoEntero;MiArray) el tipo de datos de MiArray sería Entero de una dimensión. (asumiendo que CampoEntero es un campo entero). Si el array ha sido declarado, asegúrese de que el campo sea del mismo tipo. Aunque Entero, Entero largo y Real son tipos similares, no son equivalentes. Lo mismo ocurre en el caso de los campos de tipo Texto––sus directivas tienen prioridad. El comando SELECTION TO ARRAY también tiene una segunda sintaxis: Los comandos LIST TO ARRAY y ARRAY TO LIST conciernen sólo a dos tipos de arrays:
El compilador no puede detectar un conflicto de tipo si usted utiliza un puntero sin referencia como parámetro de un comando de declaración de un array. Si escribe: SELECTION TO ARRAY([Tabla]Campo;Puntero->) donde Puntero-> representa un array, el compilador no puede verificar que el tipo del campo y el del array son idénticos. Debe prevenir tales conflictos; debe declarar el array referenciado por el puntero. El compilador emite una advertencia cuando encuentra una rutina de declaración de array en la cual uno de los parámetros es un puntero. Estos mensajes pueden ser útiles en la detección de este tipo de conflicto. Si su base utiliza arrays locales (arrays reconocidos únicamente en el método en el que fueron creados), es necesario declararlos explícitamente en 4D antes de utilizarlos. Para declarar un array local, utilice uno de los comandos de array tales como ARRAY REAL, ARRAY INTEGER, etc. Por ejemplo, si un método crea un array local de enteros que contiene 10 elementos, debe declarar el array antes de utilizarlo. Utilice el comando: ARRAY INTEGER($MiArray;10) Get pointer(varNombre) Get pointer es una función que devuelve un puntero al parámetro que usted le pasó. Suponga que quiere inicializar un array de punteros. Cada elemento en ese array apunta a una variable dada. Suponga que hay doce variables llamadas V1, V2, …V12. Puede escribir: ARRAY POINTER(Arr;12) También puede escribir: ARRAY POINTER(Arr;12) Al final de esta operación, puede obtener un array de punteros donde cada elemento apunta a una variable Vi. Estas dos secuencias pueden compilarse. Sin embargo, si las variables V1 a V12 no se utilizan explícitamente en otra parte de la base, el compilador no puede darles un tipo. Por lo tanto, deben ser utilizadas o declaradas explícitamente en otra parte.
C_LONGINT(V1;V2;V3;V4;V5;V6;V7;V8;V9;V10;V11;V12)
V1:=0 Como cada variable en una base compilada tiene un solo tipo, esta función puede parecer no muy útil. Sin embargo, puede ser útil cuando trabaja con punteros. Por ejemplo, puede ser necesario conocer el tipo de la variable a la cual el puntero hace referencia; debido a la flexibilidad de los punteros, no siempre es posible saber a que objeto apuntan. Este comando ofrece ventajas en modo interpretado que no ofrece en modo compilado. Dada la siguiente secuencia: i:=FormFunc Puede reemplazarla por: i:=FormFunc Miremos este otro ejemplo: $Num:=SelPrinter Acá, EXECUTE FORMULA puede reemplazarse por Case of: Case of El comando EXECUTE FORMULA puede reemplazarse siempre. Como el método a ejecutar se elije de la lista de los métodos de proyecto de la base o de los comandos de 4D, hay un número finito de métodos. Por lo tanto, siempre es posible reemplazar el comando EXECUTE FORMULA por Case of o por otro comando. Además, su código se ejecutará más rápido. Estos dos comandos se utilizan en el proceso de depuración. No tienen ningún objetivo en una base compilada. Sin embargo, puede manterlos en sus métodos, simplemente serán ignorados por el compilador. Undefined(variable) Teniendo en cuenta el proceso de declaración efectuado por el compilador, una variable no puede en ningún momento indefinida en modo compilado. De hecho, todas las variables han sido definidas en el momento en que termina la compilación. La función Undefined por lo tanto siempre devuelve False, sin importar el parámetro que se pase. Nota: para saber si su aplicación está corriendo en modo compilado, llame el comando Compiled application. En modo interpretado, puede verificar que el documento existe probando si una de las variables está indefinida después de la ejecución de LOAD VARIABLES. Esto no es posible en bases compiladas, ya que la función Undefined siempre devuelve False. Esta prueba puede realizarse en modo interpretado o compilado: Var1:="xxxxxx" Esta rutina utiliza dos sintaxis diferentes en modo interpretado: Para un array MiArray cuyos elementos son de tipo Entero, CLEAR VARIABLE(MiArray) tiene el mismo efecto de una de las expresiones siguientes: ARRAY INTEGER(MiArray;0) La segunda sintaxis, CLEAR VARIABLE("a"), no es compatible con el compilador, ya que el compilador accede a las variables por dirección, no por nombre. Los siguientes comandos tienen una característica en común: aceptan un primer parámetro opcional [Tabla] y el segundo parámetro puede ser un puntero. En modo compilado, es fácil devolver el parámetro opcional [Tabla]. Sin embargo, cuando el primer parámetro pasado a uno de estos comandos es un puntero, el compilador no sabe a que puntero está haciendo referencia; el compilador lo trata como un puntero de tabla. Tomemos el caso del comando QUERY cuya sintaxis es la siguiente: El primer elemento del parámetro formula debe ser un campo. Si escribe: QUERY(PtrField->=True) el compilador buscará un símbolo que represente un campo en el segundo elemento. Cuando encuentra el signo "=", emitirá un mensaje de error, al no poder identificar el comando con una expresión que sepa tratar. Por otra parte, si escribe: QUERY(PtrTabla->;PtrCampo->=True) o QUERY([Tabla];PtrCampo->=True) evitará cualquier ambigüedad posible. Cuando se utilizan punteros, hay una particularidad relativa a los comandos en el que el primer parámetro [unaTabla] y el segundo parámetro son opcionales. En este contexto, por razones internas, el compilador no permite un comando que devuelva un puntero (por ejemplo Current form table) para ser pasado directamente como un parámetro (se genera un error). //dispara un error de compilación En este caso, sólo puede usar una variable intermedia para que este código sea validado por el compilador: //código equivalente compilable. Si crea sus propios recursos 4DK# (constantes), asegúrese de que los numéricos sean declarados como de tipo Entero largo (L) o Reales (R) y las cadenas de caracteres como Cadenas (S). Cualquier otro tipo generará una advertencia.
Ver también
Consejos de optimización
|
PROPIEDADES
Producto: 4D
HISTORIA
ARTICLE USAGE
Manual de lenguaje 4D ( 4D v16) |