Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/reporting-services/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Clojure 关于债务来源的问题_Clojure - Fatal编程技术网

Clojure 关于债务来源的问题

Clojure 关于债务来源的问题,clojure,Clojure,我忍不住注意到,作者更喜欢多次调用(第一选项),而不是缓存结果: [docstring (if (string? (first options)) (first options) nil) options (if (string? (first options)) (next options) options) m (if (map? (fi

我忍不住注意到,作者更喜欢多次调用
(第一选项)
,而不是缓存结果:

[docstring   (if (string? (first options))
               (first options)
               nil)
 options     (if (string? (first options))
               (next options)
               options)
 m           (if (map? (first options))
               (first options)
               {})
 options     (if (map? (first options))
               (next options)
               options)
 ...]
我认为这是可以的(就性能而言),因为它定义了一个宏,它将在编译期间执行

  • 我仍然不确定我是否理解调用宏的评估过程。以
    (defmulti…
    为例,如果我错了,请纠正我:在编译过程中,宏被展开,其结果是调用特殊的
    let
    表单,然后将其转换为字节码。然后呢

  • 假设我们定义的是fn而不是宏,是否值得引入额外的符号来缓存
    (第一个选项)

  • var
    有根的确切含义是什么?什么是未绑定的

  • 是的,先调用
    很快。varargs表示为一个序列,特别是
    clojure.lang.ArraySeq
    (至少在一定数量的参数之前)

    ArraySeq
    上的
    first()
    的实现是数组查找

    public Object first(){
        if(array != null)
            return array[i];
        return null;
    }
    

  • 然后字节码被加载到JVM中并执行

  • 我怀疑这会有所不同

  • 变量可以具有线程区域设置绑定,这意味着每个线程都可以看到不同的值。根绑定是初始化var时使用的值。线程区域设置绑定不会挤压根绑定,它只是将其隐藏。未绑定的
    是针对在没有根绑定的情况下创建的变量的实现优化

    看看如何设置线程区域设置值

  • user=> ((fn [& args] (type args)) 1 2 3)
    clojure.lang.ArraySeq
    
    public Object first(){
        if(array != null)
            return array[i];
        return null;
    }