Clojure изменяемые типы хранения

Вы можете использовать Label и установить AutoSize на true.

27
задан Kai 24 June 2009 в 16:16
поделиться

5 ответов

Похоже, вы действительно получаете Clojure! хорошая работа :)

У переменных есть «корневое связывание», видимое во всех потоках, и каждый отдельный поток может изменять значение, которое он видит, не затрагивая другие потоки. Если я правильно понимаю, var не может существовать только в одном потоке без корневой привязки, которая видна всем, и ее нельзя "отсканировать", пока она не будет определена с помощью (def ...) в первый раз.

Ссылки фиксируются в конце транзакции (dosync ...), которая включает изменения, но только тогда, когда транзакция может завершиться в согласованном состоянии.

5
ответ дан 28 November 2019 в 05:54
поделиться

Вары не всегда имеют корневую привязку. Допустимо создавать переменную без привязки, используя

(def x)

или

(declare x)

Попытка оценить x до того, как он получит значение, приведет к

Var user/x is unbound.
[Thrown class java.lang.IllegalStateException]
0
ответ дан Allen Rohner 15 October 2019 в 06:36
поделиться

Если вы хотите регистрировать неперехваченных исключений, просто используйте sys.excepthook .

Я не уверен, что вижу значение ведения журнала all вызвали исключения, так как многие библиотеки будут вызывать / перехватывать исключения для вещей, которые вам, вероятно, не нужны.

не возникло никаких исключений и ничто не вызвало повторную попытку транзакции. Я думаю, что deref не имеет к этому никакого отношения, но, возможно, я неправильно понимаю вашу точку зрения.

3
ответ дан 28 November 2019 в 05:54
поделиться

Я думаю ваш вывод об атомах неверен:

Атомы похожи на Vars, но с безопасностью совместного использования потоков, которая блокируется до тех пор, пока значение не изменится

Атомы изменяются с помощью swap! или низкоуровневого с сравните и установите! . Это никогда ничего не блокирует. swap! работает как транзакция только с одной ссылкой:

  1. старое значение берется из атома и сохраняется в локальном потоке
  2. функция применяется к старому значению для генерации нового значения
  3. , если это успешно, вызывается метод сравнения и установки со старым и новым значением; только если значение атома не было изменено никаким другим потоком (все еще равно старому значению), записывается новое значение, в противном случае операция возобновляется с (1) до тех пор, пока в конечном итоге не завершится успешно.
4
ответ дан 28 November 2019 в 05:54
поделиться

Мартин прав, когда говорит, что операция Atoms перезапускается с 1. до тех пор, пока в конечном итоге не завершится успешно. Это также называется ожиданием вращения. {{ 1}} Хотя на самом деле блокируется блокировка, поток, выполнивший операцию, блокируется до тех пор, пока операция не завершится успешно, поэтому это операция блокировки, а не асинхронная операция.

Также в отношении Futures, Clojure 1.1 добавил абстракции для обещаний и Futures. Промис - это конструкция синхронизации, которая может использоваться для передачи значения из одного потока в другой. Пока значение не будет доставлено, любая попытка разыменования обещания будет заблокирована.

(def a-promise (promise))
(deliver a-promise :fred)

Фьючерсы представляют собой асинхронные вычисления. Это способ заставить код работать в другом потоке и получить результат.

(def f (future (some-sexp)))
(deref f) ; blocks the thread that derefs f until value is available
1
ответ дан 28 November 2019 в 05:54
поделиться
Другие вопросы по тегам:

Похожие вопросы: