free-variable bound-variable

free variable - ¿Qué son las variables libres y unidas?



free-variable bound-variable (2)

Si una variable es libre o limitada es relativa; Depende del fragmento de código que estés viendo.

En este fragmento, x está enlazado:

function(x) {return x + x;};

Y aquí, x aparece gratis:

return x + x;

En otras palabras, freeness es una propiedad del contexto. No dice " x es una variable libre" o " x es una variable vinculada", sino que identifica el contexto del que habla: " x está libre en la expresión E ". Por este motivo, la misma variable x puede ser libre o limitada según el fragmento de código del que esté hablando. Si el fragmento contiene el sitio de enlace de la variable (por ejemplo, está listado en los argumentos de la función), entonces está vinculado, si no, está libre.

Donde la distinción libre / límite es importante desde la perspectiva de la implementación es cuando implementa cómo funciona la sustitución de variables (por ejemplo, qué sucede cuando aplica argumentos a una función). Considere los pasos de la evaluación:

(function(x) {return x + x;})(3); => 3 + 3 => 6

Esto funciona bien porque x está libre en el cuerpo de la función. Sin embargo, si x estaba encuadernado en el cuerpo de la función, nuestra evaluación debe ser cuidadosa:

(function(x) {return (function(x){return x * 2;})(x + x);})(3); => (function(x){return x * 2;})(3 + 3); // careful to leave this x alone for now! => (function(x){return x * 2;})(6); => 6 * 2 => 12

Si nuestra implementación no verificó las ocurrencias de enlace, podría haber reemplazado el límite de x por 3 y nos dio la respuesta incorrecta:

(function(x) {return (function(x){return x * 2;})(x + x);})(3); => (function(x){return 3 * 2;})(3 + 3); // Bad! We substituted for a bound x! => (function(x){return 3 * 2;})(6); => 3 * 2 => 6

Además, se debe aclarar que free vs. bound es una propiedad de la sintaxis (es decir, el propio código), no una propiedad de cómo se evalúa el código en tiempo de ejecución. vz0 se refiere a variables de alcance dinámico, que están relacionadas de alguna manera con variables libres, pero no son sinónimos. Como lo describe vz0 correctamente, el alcance de la variable dinámica es una característica del lenguaje que permite evaluar expresiones que contienen variables libres al mirar la pila de llamadas en tiempo de ejecución para encontrar el valor de una variable que comparte el mismo nombre. Sin embargo, todavía tiene sentido hablar de las ocurrencias libres de variables en idiomas que no permiten un alcance dinámico: simplemente obtendría un error (como " x no está definido") si intentara evaluar una expresión de este tipo en estos idiomas

Y no puedo ayudarme a mí mismo: ¡espero que algún día encuentres en tu corazón guardar tus revólveres cuando la gente mencione el cálculo lambda! El cálculo lambda es una buena herramienta para pensar sobre variables y enlaces porque es un lenguaje de programación extremadamente mínimo que admite variables y sustitución, y nada más . Los lenguajes de programación del mundo real contienen muchos otros elementos no deseados (como el ámbito dinámico, por ejemplo) que oscurecen la esencia.

He estado programando durante mucho tiempo (demasiado tiempo, en realidad), pero estoy realmente luchando para entender los términos "Variables libres" y "Variables enlazadas".

La mayoría de las "explicaciones" que he encontrado en línea comienzan al hablar de temas como el cálculo de Lambda y la lógica formal, o la semántica axiomática. Lo que me da ganas de alcanzar mi revólver .

Alguien puede explicar estos dos términos, idealmente desde una perspectiva de implementación. ¿Pueden existir en lenguajes compilados y a qué código de bajo nivel se traducen?


Una variable libre es una variable utilizada en alguna función, cuyo valor depende del contexto en el que se invoca , llama o usa la función. Por ejemplo, en términos matemáticos , z es una variable libre porque no está limitada a ningún parámetro. x es una variable acotada

f(x) = x * z

En términos de lenguajes de programación , una variable libre se determina dinámicamente en el tiempo de ejecución buscando el nombre de la variable hacia atrás en la pila de llamadas de función .

Una evaluación de variable limitada no depende del contexto de la llamada a la función. Este es el tipo de variable más común de los lenguajes de programación modernos. Las variables locales, las variables globales y los parámetros son todas variables limitadas.

Una variable libre es algo similar a la convención de " paso por nombre " de algunos lenguajes de programación antiguos.

Digamos que tienes una función f que simplemente imprime alguna variable:

def f(): print(X)

Esto es Python. Si bien X no es una variable local, su valor sigue la convención de Python: busca hacia arriba en la cadena de los bloques donde se define la función hasta que alcanza el módulo de nivel superior.

Como en Python el valor de X está determinado por el contexto de declaración de la función, decimos que X es una variable limitada.

Hipotéticamente, si X fuera una variable libre, esto debería imprimir 10:

X = 2 def f(): print(X) def g(): # X is a local variable to g, shadowing the global X X = 10 f()

En Python, este código imprime 2 porque ambas variables X están delimitadas. La variable X local en g está limitada como una variable local, y la de f está limitada a la X global.

Implementación

La implementación de un lenguaje de programación con variables libres debe cuidar el contexto en el que se llama a cada función y, para cada variable libre, use alguna reflection para encontrar qué variable usar.

El valor de una variable libre no puede determinarse generalmente en el momento de la compilación, ya que está determinado en gran medida por el flujo de tiempo de ejecución y la pila de llamadas.