【问题标题】:How is (identical? a b) implemented in Clojurescript?Clojurescript 中如何实现(相同?a b)?
【发布时间】:2012-10-22 02:15:41
【问题描述】:

我只是好奇,环顾四周,似乎Javascript没有像Java那样的equals()方法。此外,===== 都不能用于检查两个运算符是否相同。那么 Clojurescript 是如何拥有 ==identical? 运算符的呢?

另外,我是否应该期望 identical? 在 Clojurescript 中比 == 快得多?

【问题讨论】:

    标签: clojure clojurescript


    【解决方案1】:

    这是来自Himera ClojureScript REPL 的快速结果:

        cljs.user> =
        #<function (a, b) {
        return cljs.core._equiv.call(null, a, b)
        }>
    
        cljs.user> ==
        #<function (a, d, e) {
        switch(arguments.length) {
        case 1:
        return!0;
        case 2:
        return cljs.core._equiv.call(null, a, d);
        default:
        return b.apply(this, arguments)
        }
        throw"Invalid arity: " + arguments.length;
        }>
    
        cljs.user> identical?
        #<function (a, b) {
        return a === b
        }>
    

    根据Mozilla's JavaScript Reference on Comparison Operators===操作符比较看两个操作数是否是同一个对象实例,并且由于clojurescript中的identical?直接映射到JavaScript中的===因此会这样做。

    identical? 直接映射到a === b 的事实也表明它比=== 快得多,因为它们都转换为对cljs.core._equiv 的调用。但是,如果一个好的 JavaScript JIT 引擎将所有三个数字的机器代码都减少到非常相似的机器代码,我也不会感到惊讶,因为数字的 -equiv 实现只是映射到 identical?

    (extend-type number
      IEquiv
      (-equiv [x o] (identical? x o))
    

    【讨论】:

    • 呵呵,看了你的源码,我还是一头雾水。 “对于严格或抽象的比较,两个对象永远不相等”,然后是“仅当操作数引用相同的对象时,比较对象的表达式才为真”。也许我很慢,但我花了半分钟才弄清楚这两个陈述是如何正确的。 :)
    • 是的,他们的措辞本可以更好:“两个唯一对象实例在严格或抽象比较中永远不相等。”
    【解决方案2】:

    看起来它只是=== 的宏 https://github.com/clojure/clojurescript/blob/master/src/clj/cljs/core.clj#L208

    根据@dnolen 的评论更新

    它也是一个函数,它只是调用===https://github.com/clojure/clojurescript/blob/master/src/cljs/cljs/core.cljs#L43

    【讨论】:

    • 它也作为普通函数提供 - 宏用于处理可内联的情况。
    • @dnolen Cool,更新了我的答案以反映这一点。我对 repo 的目录结构有点困惑,但我最终找到了它......
    猜你喜欢
    • 1970-01-01
    • 2011-12-23
    • 1970-01-01
    • 1970-01-01
    • 2017-02-19
    • 1970-01-01
    • 2021-11-12
    • 2012-07-29
    • 2014-03-29
    相关资源
    最近更新 更多