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