Questa potrebbe essere una domanda stupida, ma:Il compilatore clojure valuterà automaticamente le espressioni di letterali al momento della compilazione?
Supponiamo che un'espressione dipenda solo da valori letterali o da altre espressioni che dipendono solo da valori letterali; il compilatore lo valuterà al momento della compilazione?
Supponiamo che io sono,
(def a (some-time-consuming-function some-literal))
(def b (some-other-time-consuming-function a))
saranno entrambi b ed un essere valutati completamente al momento della compilazione, in modo che l'utente non è interessato?
EDIT: Grazie mille, tutte le risposte sono state molto utili.
EDIT 6.6.2011: Si scopre che se si tenta di utilizzare questa tecnica per precalutare una struttura di dati molto ampia, è facile creare file di classe troppo grandi per essere caricati. In questi casi, si desidera creare un file che verrà letto anziché un file di classe che verrà caricato. I trucchi macro descritti in queste risposte dovrebbero essere applicati solo come è in situazioni in cui il valore di ritorno non è una struttura proibitivamente grande.
L'errore generato è: "java.lang.ClassFormatError: non valido questo indice di classe" Vedere this thread per la discussione di una situazione correlata.
Ho pensato che le macro potrebbero essere un modo per aggirare questo. Tre domande: 1. Come hai fatto a testare questo? (Ho pensato di usare la funzione Ackerman, e vedendo a che punto del processo ho notato un rallentamento, ma non so quale sia il modo più rigoroso per farlo.) 2. Quando viene valutato b - al momento del caricamento ? 3. Non si sopprimono le virgolette e le virgolette cancellate l'una dall'altra? Comunque, grazie mille per la risposta! –
1) L'ho provato usando una metrica diversa, vale a dire una funzione chiamata println. Il messaggio appare durante la compilazione ma non appare quando si carica lo spazio dei nomi compilato, quindi si può concludere che la funzione non è stata eseguita in fase di runtime. 2) Il valore assegnato alla variabile b viene valutato durante la macroespansione. 3) Sì. E 'stato erroneamente lasciato da una precedente iterazione. –
Per essere chiari, la risposta alla tua domanda è "no". È solo che ci sono modi per ottenere questo comportamento quando vuoi. –