2015-08-27 2 views
2

У меня есть этот файл Clojure:clojure.tools.namespace.repl/обновить не работает

(ns foo.core) 

(def bar 1) 

И это project.clj:

(defproject foo "version" 
    :dependencies [[org.clojure/clojure "1.6.0"]] 
    :main foo.core) 

я открыть терминал и запустить Lein Отв. Затем я изменяю значение bar OUTSIDE repl.

(def bar 1) 

в

(def bar 2) 

Я изменить это значение на редактора и не забудьте сохранить файл. Затем я запускаю команду в repl (load-string "(clojure.tools.namespace.repl/refresh)") Я набираю bar в repl и все равно получаю 1 вместо 2. Однако если вы просто запустите (clojure. tools.namespace.repl/refresh), а затем запросить значение bar, которое вы получите 2. Почему это так? Почему функция load-string нарушает его?

ответ

0

Это не то, как вы вызываете refresh, это когда вы его вызываете.

refresh использует временные метки для файлов, чтобы увидеть, когда их необходимо перезагрузить. Таким образом, он только перезагружает все, что ему нужно. Поскольку вы не изменили файл после переопределения var через repl, он пропустил загрузку этого файла.

, если я начну с файла, как это:

(ns bla.core) 
(def bar 3) 

, а затем вызвать обновление в первый раз:

bla.core> (load-string"(clojure.tools.namespace.repl/refresh)") 
:reloading (bla.core bla.core-test) 
:ok 

затем переопределять бар в РЕПЛ:

bla.core> (def bar :changed-from-repl)            
#'bla.core/bar 

и refresh again:

bla.core> (load-string "(clojure.tools.namespace.repl/refresh)") 
:reloading() 
:ok 

Мы видим, что он не перезагружал пространства имен.

+0

Я отредактировал мой вопрос, чтобы уточнить его. Фактически я изменяю значение bar за пределами repl. Я сделал это в редакторе и впоследствии сохранил файл. –

1

Видимо, указав :main в своем project.clj, заставляет проект использовать AOT, который разбивает это.

http://dev.clojure.org/jira/browse/TNS-27

+0

'rm -r target /' - По-видимому, некоторый артефакт остался позади, когда я скомпилирован с 'aot', поэтому даже когда я удалил его из своего' project.clj', он все еще выдавал ошибку, например OP. Так что так раздражает, спасибо, что помогли мне изолировать его @acron! –

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