2009-10-24 22 views
27

Sono sconcertato da tutti il ​​built-in funzioni di Mathematica che pretendono di evitare che la valutazione in qualche modo: Unevaluated, Defer, Hold, e più di una mezza dozzina di il modulo Hold*. La documentazione di Mathematica spiega semplicemente ciascuna funzione in modo isolato senza spiegare perché scegliere l'una o l'altra. Qualcuno può offrire una spiegazione coerente di tutte queste funzioni? Il tutto sembra un pasticcio complicato per me. Relazionare tutto con le macro Lisp potrebbe essere un buon punto di partenza.Mathematica: non valutata vs Defer vs attesa vs HoldForm vs HoldAllComplete vs etc etc

La maggior parte del linguaggio Mathematica è incredibilmente ben progettato, ma sembra che Wolfram si sia davvero dipinto in un angolo su questo aspetto. O potrei mancare qualcosa.

risposta

11

Questi sono costrutti piuttosto complicati, ed è difficile dare spiegazioni chiare; non sono così semplici come le macro Lisp (o, per altro, la relazione tra Lisp's QUOTE e EVAL). Tuttavia, c'è una discussione lunga e valida disponibile sotto forma di notes from Robby Villegas's 1999 talk "Unevaluated Expressions" sul sito web di Wolfram.

Defer viene omesso da quel discorso, perché è nuovo a partire da Mathematica 6.0. È molto simile a HoldForm, tranne per il fatto che quando viene emesso in un front-end (ma non in un kernel) viene rimosso, lasciando un'espressione che può essere utilizzata come input. Questo è molto utile se vuoi costruire in modo programmato espressioni che un utente può modificare e valutare, ad esempio in una tavolozza.

Problemi correlati