2016-01-09 12 views

Odpowiedz

10

Makro defonce (podobnie jak wiele innych) pozwala określić niektóre metadane jako pierwszy argument. Te metadane są często używane w celu udzielenia wskazówek kompilatorowi na temat sposobu użycia symbolu.

W tym przypadku dostarczone jest słowo kluczowe metadane ^:dynamic, co pozwala kompilatorowi wiedzieć, że ten symbol powinien być zoptymalizowany pod kątem dynamicznego odbicia w środowisku wykonawczym z binding form.

Gwiazdki to tylko konwencja, aby inni deweloperzy wiedzieli, że symbol nie jest związany w zwykły sposób. Są po to, aby zwrócić uwagę na to, że może nie działać tak, jak tego oczekujesz.

Na przykład formularz binding jest wątkiem lokalnym, a symbol odbija się tylko w zakresie formularza.

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

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

*my-var* ;; false 

Próba dostępu wartość *my-var* spoza wiązanie może nie zwrócić wartość, że spodziewasz.

Ponieważ ten formularz został oznaczony konwencją *special-var*, nie oczekujemy normalnego zachowania i możemy przeczytać dokumentację lub przestudiować kod przed odniesieniem symbolu w innym miejscu.

+0

** wiemy, że nie oczekujemy normalnego zachowania i możemy najpierw przestudiować kod przed użyciem symbolu w innym miejscu. ** - czy jest to zalecenie? Co by było, gdyby była to biblioteka z zamkniętym źródłem? –

+0

Jeśli jest to zamknięta biblioteka źródłowa, możesz przeczytać dokumentację. Jeśli jest to zamknięta biblioteka źródłowa używająca '* special-vars *' i nie ma dokumentacji, prawdopodobnie powinieneś pomyśleć o użyciu czegoś innego. –

+0

** wiemy, że nie oczekujemy normalnego zachowania i możemy najpierw przestudiować kod przed użyciem symbolu w innym miejscu. ** - czy jest to zalecenie? –