このコードを検討してください -
(defn make-getter
[pred]
(defn getter
[db-name htree-name]
(filter pred (HTreeMap. db-name htree-name))))
(def meta-data-key? #(= (.getKey %) "META_DATA"))
(def not-meta-data-key? #(not (= (.getKey %) "META_DATA")))
(def get-type (make-getter meta-data-key?))
(def get-records (make-getter not-meta-data-key?))
HTreeMap は、JDBM HTree の上に Map インターフェースを実装する Java クラスです。マップには、キーが「META_DATA」であるレコードとそれ以外のレコードの 2 種類があります。get-type 関数が返すのは「META_DATA」キーを持つエントリのみであり、get-records は「META_DATA」キーを持つエントリ以外のすべてを返す必要があります。しかし、get-type が呼び出されると、getKey() != "META_DATA" のレコードも返されます。get-type と get-records の順序を変更すると
(def get-records (make-getter not-meta-data-key?))
(def get-type (make-getter meta-data-key?))
その場合、両方の関数は getKey() == "META_DATA" であるレコードのみを返します。既に定義されている関数の定義が、後で定義された関数によって上書きされるのはなぜですか?