Невозможно получить для проверки значение true, если результатом является функция (синтаксическая ошибка компиляции в .... Нет такой переменной:...)

Бывает, когда я хочу протестировать функцию, результатом которой является другая функция. У меня примерно так:

ns flexsearch.core

(defn init [{:keys [tokenizer split indexer filter] :as options}]
  (let [encoder (get-encoder (:encoder options))]
    (assoc (merge {:ids {} :data {}} options)
           :indexer (get-indexer indexer)
           :encoder encoder
           :tokenizer (if (fn? tokenizer) tokenizer #(string/split % (or split #"\W+")))
           :filter (set (mapv encoder filter)))))

И в тесте ns:

ns flexsearch.core-test
[flexsearch.core :as f]

(def split #"\W+")

(is (= (f/init {:tokenizer false :split split :indexer :forward :filter #{"and" "or"}})
         {:ids {},
          :data {},
          :tokenizer f/init/fn--14976,
          :split #"\W+",
          :indexer f/index-forward,
          :filter #{"or" "and"},
          :encoder f/encoder-icase}))

результат в ответе:

{:ids {},
 :data {},
 :tokenizer #function[flexsearch.core/init/fn--14976],
 :split #"\W+",
 :indexer #function[flexsearch.core/index-forward],
 :filter #{"or" "and"},
 :encoder #function[flexsearch.core/encoder-icase]}

Я знаю, что мне нужно поставить f/index-forward вместо результата repl [flexsearch.core/index-forward], но он не работает с f / init / fn -14976 (нет такой var: f/init/fn-14976)

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

--- РЕДАКТИРОВАТЬ --- Нотации f/index-forward и f / encoder-icase работают нормально.

--- РЕДАКТИРОВАТЬ 2--- я определил:

(defn spliter [split]   (fn [x] (string/split x (or split #"\W+"))))

и использовал его на:

(defn init [{:keys [tokenizer split indexer filter] :as options}]
  (let [encoder (get-encoder (:encoder options))]
    (assoc (merge {:ids {} :data {}} options)
           :indexer (get-indexer indexer)
           :encoder encoder
           :tokenizer (if (fn? tokenizer) tokenizer (spliter split))
           :filter (set (mapv encoder filter)))))

я получаю аналогичный ":tokenizer #function[flexsearch.core/spliter/fn -34857]", который я использовал в тесте, и он также не удался -

1 ответ

Решение

Я думаю, что ошибка "Нет такой переменной" возникает из-за того, что токенизатор является анонимной функцией.

Если у вас был токенизатор по умолчанию, определенный как неанонимная функция в flexsearch.core а затем использовал это имя в тесте, это сработает.

Однако в целом вы не можете сравнивать две функции на равенство - как говорит @cfrick. Когда вы сравниваете карты, где некоторые значения являются функциями, вы все равно сравниваете функции.

Другие вопросы по тегам