Come è stato sottolineato in un recente post l'ambito non funziona come previsto all'interno del modulo.Perché Mathematica interromperà le normali regole di scoping nel modulo?
Un esempio da quel filo è:
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*2 z*)
Ma il seguente funziona quasi come previsto.
Quale considerazione del design linguistico ha fatto scegliere a wolfram questa funzionalità?
Modifica: vedere il primo commento di Jefromi Ho cambiato z da variabile locale a non e ho dimenticato di modificare l'output. Non ha alcun effetto sul problema.
Edit2: Il punto di Michael Pilat sembra essere che Block e Module hanno funzioni diverse. Penso di capire il suo punto, ma penso che sia ortogonale alla mia domanda. Quindi ecco un aggiornamento.
posso utilizzare il seguente codice a livello globale in un notebook:
expr = 2 z;
f[z_] = expr;
f[7]
(*output: 14*)
Ma quando metto lo stesso blocco di codice in un modulo e rendere locale expr produce un output diverso.
Clear[f];
Module[{expr},
expr = 2 z;
f[z_] = expr;
f[7]]
(*output: 2z*)
Se si traccia il modulo di cui sopra chiamare si scopre che Set [f [z_], espr] viene riscritto per impostare [f [z $ _, espr]. Ora questa trasformazione z-> z $ si verifica sia su lhs che su rhs del Set. Succede comunque prima che venga valutato expr, il che provoca un risultato diverso da ottenere a livello globale.
La trasformazione z-> z $ sembra avvenire solo quando il rh ha un simbolo locale alla chiamata del modulo.
Perché Mathematica ha scelto di modificare questa sintassi in una chiamata di Modulo? Quali sono i compromessi sul design della lingua/implementazione qui che hanno preso questa decisione.
Quale versione di mathematica stai usando? Il primo ti dà davvero z del modulo locale ('z $ 1776') invece di solo' 2z' (che è quello che ottengo, usando la versione 6.0.0). – Cascabel
Oppure la z locale creata dalla corrispondenza del modello? – Cascabel
Da Trace, sembra che Mathematica decida che poiché c'è una variabile locale sul RHS del set, userà una variabile locale per il pattern ('f [z $ _] = expr $ 64'). In tutti gli altri casi a cui posso pensare, quando l'RHS non contiene una variabile locale, usa l'atteso 'f [z_] = ...'. Forse c'è qualche ragionevole caso di valutazione in cui questo comportamento ha un senso, ma io certamente non riesco a pensarci. +1, e spero che qualcuno riesca a rispondere. – Cascabel