Contexto local
El contexto local es el espacio de memoria reservado que existe solo durante la ejecución de una función o método. El contexto local se crea cuando se llama a la función o método y se destruye cuando finaliza. Cada función tiene su propio contexto local y solo puede acceder al contexto propio, ya que es totalmente privado. El contexto local guarda el nombre de la función llamada, los parámetros y las variables locales.
#funcname: nombre de la función llamada#args: array con los parámetros recibidos (solo sus valores)#local: mapa con todo el contexto local: variables locales y parámetros (nombre de la variable y valor)
Nombre de la función o método actual #funcname
#funcname es una variable especial de solo lectura que solamente existe dentro de las funciones/métodos y contiene el nombre utilizado para llamar a la función (que debe coincidir con uno de los nombres de la misma). Es útil cuando se llama a una función que tiene varios nombres.
En este ejemplo, hay una función con dos nombres saluda y saludame. Dado que el código de la función es el mismo, debemos comprobar como ha sido llamado y cambiar el mensaje en consecuencia:
def main
println saluda()
println saludame()
end
def saluda, saludame()
if #funcname == "saluda"
println "Hola mundo!"
else
println "Hola Alberto"
endif
end
El resultado es:
Hola mundo Hola Alberto!
Parámetros dinámicos: #args
#args es una variable especial de solo lectura que solamente existe dentro de las funciones y contiene en un Array todos los parámetros recibidos. Es un Array (ver arrays) y, como tal, solo se puede acceder a cada uno de sus elementos a través de índices numéricos, como #args[n], siendo n un número comprendido entre 0 y el tamaño máximo del array -1. Se puede acceder a su tamaño con las propiedades #args.length o con #args.size
def main
cosas()
cosas(1, "hola", 5, true)
end
def cosas()
local num
println "Se han recibido "+#args.size+" parámetros."
foreach num : #args
println num
endfor
end
El resultado es:
Se han recibido 0 parámetros. Se han recibido 4 parámetros. 1 hola 5 true hola
Contexto local: #local
#local es una variable especial de solo lectura que solamente existe dentro de las funciones y contiene en un Map todas las variables del contexto local: los parámetros recibidos (#args) y las variables locales (las que se defien en local). A diferencia de #args (que es un Array) #local es un mapa (ver mapas hash) y, como tal, se puede acceder a todos sus elementos a partir de su nombre, como #local.variable o #local.nombreParametro. También se puede acceder a su tamaño con los métodos #local.size() o #local.length()
Ejemplo de acceso directo a las variables locales y parámetros del contexto. Da igual usar #local o no, ya que las variables locales tienen siempre preferencia (ver orden de prioridad de acceso a variables en metodos y funciones)
def main
mas("Alberto", 12)
end
def cosas(nombre, edad)
local otra
otra = "hola"
println otra
println nombre
println edad
println #local.otra
println #local.nombre
println #local.edad
end
Otro ejemplo. Acceso dinámico a las variables del contexto local. Dado que #local es un mapa, podemos acceder a sus elementos a través de la clave de manera dinámica, indicando la clave entre corchetes.
Ejemplo que averigua el nombre de todas las variables locales y pinta su contenido.
def main
mas("Alberto", 12)
end
def mas(nombre, edad)
local otra, variable
otra = "hola"
println "Tamaño del contexto local completo "+#local.size()+" elementos."
println "Contenido:"
foreach variable : #local.keys()
println "Nombre = "+variable+", valor = " + #local[ variable ]
endfor
end
El resultado es:
Tamaño del contexto local completo 4 elementos. Contenido: Nombre = otra, valor = hola Nombre = variable, valor = variable Nombre = nombre, valor = Alberto Nombre = edad, valor = 12