Como se señaló en un reciente post, el alcance no funciona como se esperaba dentro del Módulo.¿Por qué Mathematica rompería las reglas normales de alcance en el Módulo?
Un ejemplo de ese hilo es:
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*2 z*)
Pero el siguiente funciona casi como se esperaba.
Module[{expr},
expr = 2 z;
[email protected]@{f[z_], expr};
f[7]]
(*14*)
¿Qué consideración de diseño de lenguaje se toma con wolfram esta funcionalidad?
Editar: Ver el comentario de Jefromi. Cambié z de ser una variable local a no y olvidé cambiar la salida. No afecta el problema
Edit2: El punto de Michael Pilat parece ser que el Bloque y el Módulo tienen diferentes funciones. Creo que entiendo su punto, pero creo que es ortogonal a mi pregunta. Así que aquí hay una actualización.
que puede utilizar el código siguiente en el nivel global en un cuaderno:
expr = 2 z;
f[z_] = expr;
f[7]
(*output: 14*)
Pero cuando pongo el mismo bloque de código en un módulo y hacer llamadas locales expr que produce una salida diferente.
Clear[f];
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*output: 2z*)
Si se desplaza por el módulo anterior llame encuentran que Set [f [z_], expr] se reescribe para establecer [f [z $ _, expr]. Ahora esta transformación z-> z $ ocurre tanto en lhs como en rhs del conjunto. Sin embargo, sucede antes de que se evalúe expr, lo que provoca un resultado diferente que luego se obtendría a nivel global.
La transformación z-> z $ parece ocurrir cuando el rhs tiene un símbolo local para la llamada al Módulo.
¿Por qué Mathematica elige tener este cambio de sintaxis en una llamada al Módulo? ¿Qué combinaciones de lenguaje/diseño de implementación existen aquí que tomaron esta decisión?
¿Qué versión de mathematica estás usando? ¿El primero realmente te da la z local del módulo ('z $ 1776') en lugar de solo' 2z' (que es lo que obtengo, usando la versión 6.0.0). – Cascabel
¿O es que la z local creada por el patrón coincide? – Cascabel
De Trace, parece que Mathematica decide que debido a que hay una variable local en el RHS del conjunto, usará una variable local para el patrón ('f [z $ _] = expr $ 64'). En todos los demás casos que puedo pensar, cuando el RHS no contiene una variable local, utiliza el 'f [z_] = ...' esperado. Tal vez haya algún caso razonable de evaluación en el que este comportamiento tenga sentido, pero ciertamente no puedo pensar en ello. +1, y espero que alguien logre responder. – Cascabel