Prima di tutto, penso che tu abbia esposto un bug qui.
In secondo luogo, penso di poter offrire alcune informazioni sul perché questo sta accadendo, tenendo presente che la mia conoscenza degli aspetti interni della matematica è limitata.
un'istruzione come: f [z_]: = 2 z in forma completa è:
SetDelayed[f[Pattern[z, Blank[]]], 2 z]
Questo imposta il DownValue [f] per:
{HoldPattern[f[z_]] :> 2 z}
Poi più tardi quando un'espressione, come f [2], viene poi viene valutata qualcosa come segue viene preformato:
f[2] /. HoldPattern[f[z_]] :> 2 z
il che valutare a 4. Ora, questo è tutto Po possibile perché la corrispondenza del modello sta avvenendo con Pattern [z, Blank []] dal primo blocco di codice. Funziona anche se hai impostato per sempre z su un numero. In altre parole.
z = 5;
f[z_] := 2*z
produce ancora le stesse downvalues per f:
{HoldPattern[f[z_]] :> 2 z}
Questo è possibile perché modello ha l'attributo HoldFirst.
L'attributo HoldFirst non è una protezione sufficiente se lo si valuta all'interno di un modulo. Esempio:
SetAttributes[tmp, HoldFirst];
Module[{expr},
expr = 2 z;
tmp[expr]
]
uscite:
tmp[expr$8129]
propongo perché HoldFirst Abilità non fornisce l'immunità a regola di riscrittura variabile del modulo che qualsiasi Modello in una regola che contiene una variabile locale hanno loro variabili modello riscritto . sym-> Simbolo [SymbolName [sym] ~~ "$"]
Module[{expr},
Hold[z_ -> (z; expr)]
]
(*Hold[z$_ -> (z$; expr$1391)]*)
z ha essere riscritto su entrambi i lati della regola in una semplice conversione alfa.
Se la regola non contiene una variabile locale non riscrittura accade:
Module[{expr},
Hold[z_ -> (z)]
]
(*Hold[z_ -> z]*)
Piuttosto che cercare di vedere se una variabile locale corrisponde una variabile regola viene applicata la regola di coperta sopra.
Quindi il problema è che l'espressione locale non viene valutata prima della conversione alpha. O forse sarebbe anche meglio avere expr racchiuso in una conversione alfa ponderata che sarebbe necessaria per un RuleDelayed.
Ciò non accade in Blocco perché il blocco non riscrive nessuna delle variabili locali.
Altre idee? Qualcuno vede buchi nella mia logica?
Wow, non è quello che definirei un lavoro piuttosto impegnativo ma impressionante. – dreeves
Ecco perché torno a SO ogni giorno. Impara me s ** t :-). – Timo
Preferisco prendere il colpo di performance inaspettato di avere expr avvolto in una conversione alfa pigra piuttosto che affrontare la sintassi incoerente. Quali sono le considerazioni sulla progettazione della lingua che stanno per giocare qui? – Davorak