2010-08-26 12 views
6

¿Puede darme algunos ejemplos de tareas inadecuadas para el ceceo de ámbito dinámico? No estoy viendo cómo el alcance léxico es mucho mejor y no solo una cuestión de cambiar el estilo de codificación, así que me encantaría codificar algo y verlo con mis propios ojos.Tareas inadecuadas para el alcance dinámico

Gracias!

Respuesta

7
(define (add n) (lambda (m) (+ n m))) 
(define add4 (add 4)) 
(map (add 7) (list 1 2 3)) 

Pero eso es solo un pequeño ejemplo al azar. Si cavas lo suficiente, encontrarás varias toneladas de razones adicionales. Para una discusión más completa, realmente deberías revisar algunos libros de texto. Mi recomendación para esto sería PLAI.

Aquí es una demostración más:

(define tax 0.17) 
(define (add-tax amt) (+ amt (* amt tax))) 

Parece que add-tax es una función que devuelve la cantidad dada con la tasa de impuestos correcta añadió - pero nunca se puede confiar en este es el caso. Por ejemplo, podría llamarse así:

(let ((tax -0.17)) (add-tax 100)) 

y obtendría respuestas completamente incorrectas. Pero las cosas son aún peores si su idioma tiene un alcance realmente dinámico: no puede confiar en vinculante, incluidas las funciones. Considere esto:

(let ((+ -)) (add-tax 100)) 

Y por cierto Elisp y CL no sufren de este problema tan directamente, usando cosas como un doble espacio de nombres, y las reglas sobre el remedo "construido en" consolidaciones.

+1

La mayoría de las funciones dinámicas de reencuadernación no se realizan en CL, ya que CL utiliza por defecto el enlace léxico para funciones también. Diferente a Elisp, que no tiene ningún enlace léxico. –

0

Vale la pena leer el artículo de Wikipedia en scope.

Funcionalmente, solo importa cuando tiene variables que no están vinculadas en el alcance actual. Entonces, si no tiene ninguna variable libre, no importa.

Eliz Barzilay's answer es un buen ejemplo de una lambda con una función que tiene un símbolo (n) que tendrá una unión diferente en el ámbito dinámico/estático.

Según lo que sé, los lenguajes con alcance léxico se pueden compilar un poco más, porque en tiempo de compilación el compilador puede determinar todas las referencias de variables, en lugar del alcance dinámico que debe buscar la referencia de variable en tiempo de ejecución .

+0

La expresión 'lambda' que escribí * no * tiene ningún identificador desatado - * si * tiene alcance léxico. Si no lo hace, entonces cualquier identificador está vinculado o no, de acuerdo con la forma en que lo llame. –

+0

@EliBarzilay Correcto, aclararé lo que quise decir. –

Cuestiones relacionadas