Я играю с Clojure with-redefs-fn
, и я вижу некоторые загадочные несоответствия. Например:
(with-redefs-fn {#'println (constantly nil)} #(println "foo"))
=> nil
Как и ожидалось, println
больше не имеет никакого эффекта, просто увеличивается до nil
. Однако в:
(with-redefs-fn {#'= (constantly false)} #(= 1 1))
=> true
(with-redefs-fn {#'+ (constantly 0)} #(+ 1 1))
=> 2
(with-redefs-fn {#'max (constantly 1)} #(max 1 2))
=> 2
Мы больше не видим ожидаемое поведение, функции переопределения, кажется, работают как обычно. Я подозреваю, что эти конкретные простые функции оптимизированы для операций с байт-кодом и, таким образом, не зависят от переопределения. Может кто-нибудь подтвердить это, потому что это меня некоторое время озадачивает.
Интересно, что если вы обращаетесь к var, но не в позиции вызова функции, вы получите переопределенное значение:
user=> (with-redefs-fn {#'= (constantly false)} #(constantly =))
#object[clojure.core$constantly$fn__5672 0x72458efc "clojure.core$constantly$fn__5672@72458efc"]
user=> =
#object[clojure.core$_EQ_ 0x2caf6912 "clojure.core$_EQ_@2caf6912"]