这种情况是在我想测试一个结果也是函数的函数时发生的。我的代码如下
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 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}))
在REPL(即时交互式环境)中看到的结果是
{: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 就不行(没有这样的变量:f/init/fn--14976)
我猜想这可能是在vars上的一个技巧,但我不知道它真正的工作方式。如果您能提供任何阅读材料,我将不胜感激
---编辑--- f/index-forward 和 f/encoder-icase 的符号没问题。
---编辑 2--- 我已经定义了
(defn spliter [split] (fn [x] (string/split x (or split #"\W+"))))
and used it on:
(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,]" 的结果,这与我在测试中使用的是相同的,但测试也失败了——