Si me equivoco, corríjame, pero parece que JMP tiene un alcance dinámico sin persistencia de alcance (excepto los pseudo-espacios de nombres Aquí , Local , Ventana , Caja ).Esto contrasta con muchos lenguajes de programación populares que tienen alcance léxico con persistencia de alcance completo utilizando contadores de referencia.
Esto me causó muchos problemas hasta que obtuve la intuición necesaria para trabajar con el extraño sistema de alcance que tiene JMP, y creo que es un gran punto de confusión para muchas personas.No muchos lenguajes de programación usan el alcance dinámico (LISP es una excepción importante, y JSL tiene algunas similitudes con LISP).
Animo al equipo de documentación de JSL a señalar esta distinción y proporcionar algunos recursos/enlaces sobre cómo comprender mejor el alcance dinámico, ya que ciertamente no es la forma estándar de hacer la resolución de nombres.
Aquí hay un ejemplo: el alcance local de la función externa se borra inmediatamente después de la declaración de devolución, y la resolución de nombres de las funciones internas es dinámica (basada en la pila de llamadas actual):
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Name Expr( inner function ) );
);
func = outer function;
func()
//:*/
Names Default to Here( 1 );
x = 7;
outer function = Function( {},
{x},
x = 4;
inner function = Function( {},
Print( x )
);
Return( Expr( inner function ) );
);
func = outer function;
func()
/*:
7Si hace algo funcionalmente equivalente en un lenguaje de alcance léxico con persistencia de alcance (como Python), entonces el alcance de cierre de la función interna es persistente (es el alcance local para la función externa) y la resolución de nombre para el interno La variable x de la función es el valor 4 de la lectura léxica del sistema.Dado que JMP no usa el alcance léxico, pero usa el alcance dinámico, cuando la función interna finalmente se ejecuta al final del script, usa la resolución dinámica de nombres de Local -> Aquí -> Global (y posible columna- nombres para la tabla actual) y encuentra el valor 7.
Comprender este tipo de comportamiento es fundamental para crear programas robustos en JSL, y solo quiero señalarlo a cualquiera que esté aprendiendo/luchando con JSL.
¡Avíseme si tiene alguna idea o ejemplo poco intuitivo!