2024 年 Clojure 状态调查!中分享您的想法。

欢迎!请查看关于页面以获取更多有关如何使用本站的信息。

+1
ClojureScript

为什么原子没有实现“ISwap”协议?

swap!实现

(defn swap!
  ([a f]
   (if (instance? Atom a)
     (reset! a (f (.-state a)))
     (-swap! a f))))

这不关于优化,因为 GCC 并不内联 swap! 调用。

;; clj -m cljs.main --optimizations advanced -co '{:pseudo-names true}' -c example.core

(let [a (atom 0)]
  (swap! a inc)
  (js/console.log @a))

var $a_528$$ = new $cljs$core$Atom$$;
$cljs$core$swap_BANG_$$.$cljs$core$IFn$_invoke$arity$2$($a_528$$, function($x$jscomp$125$$) {
    return $x$jscomp$125$$ + 1
});
console.log($cljs$core$_deref$$($a_528$$));

1 答案

0

被选中
 
最佳答案

这很可能是出于历史原因。但事实上这并不重要,一般你不会直接调用这些核心协议方法,因为有太多情况需要处理。查阅其他协议方法包装器可以使这一点更加明确。

...