Привязка Clojure не работает

Я работаю над примерами Clojure в «Programmming Clojure» Стюарта Хэллоуэя, и я столкнулся с проблемой при использовании привязки:

(def foo 10)
; => '#user/foo

foo
; => 10

(binding [foo 42] foo)
; => 10

(binding [user/foo 42] foo)
; => 10

(binding [user/foo 42] (var-get #'user/foo))
; => 10

Почему мне не дают 42?


person cdmckay    schedule 21.10.2009    source источник
comment
Во второй строке два символа как бы поменялись местами.   -  person Svante    schedule 21.10.2009
comment
Какую IDE/среду вы используете? Какая версия Clojure? Ваш код отлично работает для меня, последняя версия Clojure из git, работающая из командной строки.   -  person Brian Carper    schedule 21.10.2009
comment
Clojure-1.1.0-alpha-SNAPSHOT на Snow Leopard... Я только что попробовал его на своем ПК с Windows на 1.0.0, и он работал нормально, поэтому, должно быть, это ошибка этой версии. Забавно то, что автор книги рекомендовал вам использовать версию Clojure в комплекте, потому что он тестировал на ней все свои примеры... и тогда она не работает для этого примера.   -  person cdmckay    schedule 21.10.2009
comment
Такое же поведение в Linux/1.1.0-alpha, возможно, вам следует спросить об этом на groups.google.com/ группа/clojure   -  person DigitalRoss    schedule 22.10.2009


Ответы (2)


Вердикт: ошибка

Похоже, это ошибка в 1.1.0-alpha-SNAPSHOT, и она также воспроизводится в Linux.

Если вы сейчас вернетесь на страницу Clojure d/l, эта версия, по-видимому, была отозвана, а 1.0.0 является «Избранным» d/l.

А в 1.0.0 ваш пример связывает 42.

person DigitalRoss    schedule 22.10.2009

В связи с этим:
действительно легко быть укушенным привязками таким образом, когда вы когда-либо запускаете код в другом потоке. Я сталкивался с такими проблемами, когда функция, которую я вызываю, оценивает что-то через pmap вместо map , когда код фактически выполняется в потоке из пула потоков. агенты будут делать это также я верю.

person Arthur Ulfeldt    schedule 21.10.2009