2016-01-09 2 views

ответ

10

Макрос defonce (как и многие другие) позволяет указать некоторые метаданные в качестве первого аргумента. Эти метаданные часто используются, чтобы дать подсказки компилятору о том, как будет использоваться символ.

В этом случае предоставляется ключевое слово метаданных ^:dynamic, позволяющее компилятору знать, что этот символ должен быть оптимизирован для динамического отскока во время выполнения с помощью binding form.

Звездочки - это просто соглашение, позволяющее другим разработчикам знать, что символ не связан регулярным образом. Они должны обратить внимание на то, что он может работать не так, как вы ожидаете.

Например, форма binding является локальной, и символ возвращается только в пределах формы.

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

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

*my-var* ;; false 

Попытка доступа к значению *my-var* из-за пределов связывания не может возвращать значение, которое вы ожидаете.

Поскольку эта форма была обозначена соглашением *special-var*, мы не ожидаем нормального поведения и можем прочитать документацию или изучить код, прежде чем ссылаться на символ в другом месте.

+0

** Мы знаем, что не ожидаем нормального поведения и можем сначала изучить код перед использованием символа в другом месте. ** - это рекомендация? Что, если это библиотека с закрытым исходным кодом? –

+0

Если это закрытая исходная библиотека, вы можете прочитать документацию. Если это закрытая исходная библиотека, использующая '* special-vars *', и нет документации, вы, вероятно, должны подумать об использовании чего-то еще. –

+0

** Мы знаем, что не ожидаем нормального поведения и можем сначала изучить код, прежде чем использовать символ в другом месте. ** - это рекомендация? –

Смежные вопросы