2016-06-04 9 views
1

Рассмотрим следующий кодmidje не заглушки функции, предусмотренные с HashMaps

(use 'midje.sweet)                                                                
(defn x2 [x] (* x x))                                                               
(def fs {:x2 x2})                                                                
(fact                                                                   
    (x2 1) => "one"                                                                
    ((:x2 fs) 1) => "one"                                                               
    (against-background                                                               
    (#'tweetfetcher.core-test/x2 1) => "one"))  

, который выводит

FAIL at (core_test.clj:177) 
    Expected: "one" 
     Actual: 1 
FAILURE: 1 check failed. (But 32 succeeded.) 

Первая проверка загасил в то время как второе использование x2, как это предусмотрено в HashMap fs.

Учитывая, что я исключаю ссылки, почему (:x2 fs) не был обрезан?

Спасибо за понимание.

ответ

1

Я не удивлен, что он работает таким образом. В (x2 1) известно время компиляции, которое x2 является функцией, определяемой как (defn x2 [x] (* x x)).

В ((:x2 fs) 1), мы знаем, время компиляции, что fs является {:x2 x2}, но мы еще не знаем, результат (:x2 fs). Под этим я подразумеваю, что выражение (:x2 fs) не оценивается при расширении fact. Вероятно, он видит, что (:x2 fs) не является var, который разрешает функцию и поэтому не делает ничего связанного с нашим заглушкой (внутри against-background).