2016-01-09 14 views

risposta

10

La macro defonce (come molti altri) consente di specificare alcuni metadati come primo argomento. Questi metadati sono spesso usati per dare suggerimenti al compilatore sul modo in cui il simbolo verrà usato.

In questo caso, viene fornita la parola chiave ^:dynamic metadata, che consente al compilatore di sapere che questo simbolo deve essere ottimizzato per essere dinamicamente rimbalzato in fase di esecuzione con lo binding form.

Gli asterischi sono solo una convenzione per consentire agli altri sviluppatori di sapere che il simbolo non è legato in modo regolare. Sono lì per attirare l'attenzione sul fatto che potrebbe non funzionare nel modo in cui ci si aspetta.

Ad esempio, un modulo binding è thread locale e il simbolo è solo rimbalzo nell'ambito del modulo.

(defonce ^:dynamic *my-var* false) 

(binding [*my-var* true] *my-var*) ;; true 

*my-var* ;; false 

Un tentativo di accedere al valore di *my-var* da fuori vincolante potrebbe non restituire il valore che vi aspettate.

Poiché questo modulo è stato indicato con la convenzione *special-var*, sappiamo di non aspettarsi il comportamento normale e possiamo leggere la documentazione o studiare il codice prima di fare riferimento al simbolo altrove.

+0

** sappiamo di non aspettarci il comportamento normale e possiamo studiare il codice prima di usare il simbolo altrove. ** - è una raccomandazione? E se fosse una libreria a codice chiuso? –

+0

Se si tratta di una libreria a codice chiuso, è possibile leggere la documentazione. Se si tratta di una libreria closed source che usa '* special-vars *' e non c'è documentazione, probabilmente dovresti pensare a usare qualcos'altro. –

+0

** sappiamo di non aspettarci il comportamento normale e possiamo studiare il codice prima di usare il simbolo altrove. ** - è una raccomandazione? –

Problemi correlati