Предоставление настраиваемых глобальных переменных - PullRequest
4 голосов
/ 17 июля 2011

Мне нужно предоставить настраиваемые переменные для моих пользователей, например, предупреждение на отражение , предоставляемое clojure AFAIK, они не определены на стороне clojure, поэтому мы можем их установить.

Проблема в том, что мои переменные (все элементы конфигурации) используются во многих узких циклах, поэтому я не хочу делать их ссылки, потому что они МОГУТ быть установлены при запуске приложения, и это не изменится во время выполнения, они будут быть прочитанным, может быть, миллионы раз, поэтому создание их ссылок кажется напрасной тратой ресурсов.

Итак, вопрос в том, могу ли я определить настраиваемые переменные в моем случае?

Ответы [ 3 ]

2 голосов
/ 22 июля 2011

Если вы хотите установить настраиваемое глобальное состояние с низкими издержками, которое видно всем потокам и не требует каких-либо транзакций STM для управления мутацией, я бы рекомендовал просто использовать атомы:

(def some-global-value (atom 1))

Чтение и запись в атомы чрезвычайно низкие накладные расходы.

1 голос
/ 18 июля 2011

предупреждение об отражении - это просто переменная, хотя и определенная в Java-коде Clojure, а не в core.clj.Однако, кроме того, где оно определено, нет ничего особенного в warn-on-отражении ;он ведет себя точно так же, как и любая другая переменная.

Если вы не хотите использовать переменные, вам, возможно, придется подойти к вашей проблеме с иной точки зрения, чем «необходимо использовать глобальные переменные».В функциональном программировании принято передавать все необходимые значения в функцию, а не полагаться на глобальные переменные.Возможно, вам пора рассмотреть такой подход.

1 голос
/ 18 июля 2011

Вы можете создать локальную привязку, используя let, таким образом, параметры могут быть динамическими, и у вас все равно будет быстрый доступ.Единственное, что, если кто-то изменит параметр во время работы цикла, цикл его не зафиксирует (IMO в любом случае это должно быть желаемым поведением).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...