2015-04-03 1 views
0

Почему последнее утверждение из следующего теста не удается выполнить при использовании lein test?Lein test failing on unbound var при использовании объявления

Я не понимаю, почему первые два утверждения правильно оценивают последнее значение, но значение fromvar рассматривается как несвязанное.

(declare x) 

(def fromvar x) 
(defn fromfun [] x) 

(deftest declaretest 

    ;; These pass fine 
    (is (= 1 x)) 
    (is (= 1 (fromfun))) 

    ;; This fails on lein test: 
    ;; expected: (= 1 fromvar) 
    ;; actual: (not (= 1 #<Unbound Unbound: #'my-test/value>)) 
    (is (= 1 fromvar))) 

(def x 1) 
+0

с использованием 'value', поскольку ваше значение затрудняет правильную терминологию при ответе на ваш вопрос. – noisesmith

+0

Конечно, вы правы, изменили его на x. – mangolas

ответ

1

def не гарантирует, что fromvar привязан к связыванию value. Он присваивает fromvar значение x в то время, когда было вызвано def. Так как x еще не определен, значение является несвязанным (буквально экземпляр внутреннего класса Var.Unbound). fromfun не скомпилирует значение x при компиляции, поэтому можно найти правильное значение во время выполнения, отражая последующее назначение.

+0

Хорошо, так что это совсем не эзотерика, я был в замешательстве, потому что использование IntelliJ и перезагрузка файлов привели к ситуации, когда тест, о котором идет речь, начинает проходить. Но это должно быть потому, что (объявить x) для уже связанного x ничего не делает, поэтому x в следующий раз имеет значение. Спасибо, что прояснил это. – mangolas