Функция translate
имеет дополнительный уровень скобок, а (flush)
заставляет ее работать случайно.Без (flush)
код будет
((def translations (get-translations (fetch-url (get-url src-lg term))))
(if (contains? translations tgt-lg) (get translations tgt-lg) "<NOT FOUND>"))
Clojure оценивает эту форму в соответствии с ее правилами оценки , оценивая две подформы и вызывая первую как функцию.С оцененными подформами форма становится
(#'translations
"Requin")
, потому что первая форма возвращает определяемый Var и определяет его вовремя, чтобы вторая форма преуспела в поиске.Когда вы вызываете Var как функцию, вызов делегируется значению Var , которое является картой, и, поскольку map реализует вызов функции как поиск , эффектэто посмотреть «Реквина» на карте.На карте нет элемента с этим ключом, поэтому значение равно nil.
При добавлении (flush)
между ними происходит тот же процесс:
((def translations (get-translations (fetch-url (get-url src-lg term))))
(flush)
(if (contains? translations tgt-lg) (get translations tgt-lg) "<NOT FOUND>"))
сначала оценивается в
(#'translations
nil
"Requin")
и снова вызывается карта со значением #'translations
.На этот раз эффект будет искать nil
, с "Requin" в качестве значения по умолчанию, возвращаемого в случае, если nil
не найден на карте.