请在 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

被选中
 
最佳答案

我相信这是因为历史原因。但这也无关紧要,因为通常不能直接调用这些核心协议方法,因为需要处理很多情况。查看其他协议方法的包装器会更清楚。

...