Definiciones

Los elementos de datos que se van a utilizar en un programa de idioma de usuario deben definirse antes de poder utilizarlos. Existen tres tipos de definiciones:

El ámbito de una definición constante o variable va desde la línea en la que se ha definido hasta el final del bloque actual, o hasta el final del Programa de idioma del usuario, si la definición se encontraba fuera de cualquier bloque.

El ámbito de una definición de función va desde la llave de cierre (}) del cuerpo de la función hasta el final del programa de idioma del usuario.

Definiciones constantes

Las constantes se definen mediante la enumeración de palabras clave, como en

enum { a, b, c };

que definiría las tres constantes a, b y c, dándoles los valores 0, 1 y 2, respectivamente.

Las constantes también se pueden iniciar con valores específicos, como

enum { a, b = 5, c };

donde a sería 0, b sería 5 y c sería 6.

Definiciones de variables

La sintaxis general de una definición de variable es

[numeric] type identifier [= initializer][, ...];

donde type es uno de los tipos de datos u objetos, identifier es el nombre de la variable e initializer es un valor inicial opcional.

Las definiciones de variables múltiples del mismo tipo se separan mediante comas (,).

Si identifier va seguido de un par de corchetes ([ ]), esto define una matriz de variables del tipo especificado. El tamaño de una matriz se ajusta automáticamente en tiempo de ejecución.

La palabra clave opcional numérica se puede utilizar con matrices de cadenas para ordenarlas alfanuméricamente mediante la función sort().

Por defecto (si no hay ningún iniciador presente), las variables de datos se establecen en 0 (o "", en el caso de una cadena) y las variables de objeto son “invalid”.

Ejemplos

int i; define una variable int denominada i
string s = "Hello"; define una variable string denominada s e inicia el elemento en "Hello"
real a, b = 1.0, c; define tres variables real denominadas a, b y c, iniciando b en el valor 1.0
int n[] = { 1, 2, 3 }; define una matriz de int, iniciando los tres primeros elementos en 1, 2 y 3
nombres de cadena numéricos[]; define una matriz de cadenas que se puede ordenar alfanuméricamente
UL_WIRE w; define un objeto UL_WIRE denominado w
No se puede acceder directamente a los elementos de matriz de tipos de objeto:
UL_SIGNAL signals[];
...
UL_SIGNAL s = signals[0];
printf("%s", s.name);

Definiciones de función

Puede escribir sus propias funciones de idioma de usuario y llamarlas como las funciones integradas. La sintaxis general de una definición de función es

type identifier(parameters)
{
  statements
}

donde type es uno de los tipos de datos u objetos, identifier es el nombre de la función, parameters es una lista de definiciones de parámetros separados por comas y statement es una secuencia de instrucciones. Las funciones que no devuelven un valor son de tipo void.

Una función debe definirse antes de poder llamarla y las llamadas de función no pueden ser recursivas (una función no puede llamarse a sí misma).

Las instrucciones del cuerpo de la función pueden modificar los valores de los parámetros, pero esto no afectará a los argumentos de la llamada a la función.

La sentencia return puede terminar la ejecución de una función. Sin ninguna instrucción return, el cuerpo de la función se ejecuta hasta que se cierra la llave (}).

Una llamada a la función exit() finalizará el programa de idioma de usuario por completo.

La función especial main()

Si el Programa de idioma del usuario contiene una función denominada main(), dicha función se llamará explícitamente como la función principal y su valor devuelto será el valor devuelto por el programa.

Los argumentos de la línea de comando están disponibles para el programa a través de las variables integradas globales argc y argv.

Ejemplo
int CountDots(string s)
{
  int dots = 0;
  for (int i = 0; s[i]; ++i)
      if (s[i] == '.')
         ++dots;
  return dots;
}
string dotted = "This.has.dots...";
output("test") {
  printf("Number of dots: %d\n",
                 CountDots(dotted));
  }