gpt4 book ai didi

clojure - (not= (type `(1)) (type ` (1 2))) ;;为什么? (单元素列表、语法引用、缺点、PersistentList)

转载 作者:行者123 更新时间:2023-12-04 04:07:07 24 4
gpt4 key购买 nike

我在 Clojure 1.2.1 中看到了这种行为:

user=> (type '(1 2))
clojure.lang.PersistentList
user=> (type `(1 2)) ;; notice syntax-quote
clojure.lang.Cons
user=> (type '(1))
clojure.lang.PersistentList
user=> (type `(1))
clojure.lang.PersistentList

我希望 `(1) 像 `(1 2) 一样是一个缺点。

我也试过:
user=> (type (cons 1 nil)) 
clojure.lang.PersistentList
user=> (type (cons 1 `()))
clojure.lang.Cons
user=> (type (cons 1 '()))
clojure.lang.Cons
user=> (type (cons 1 []))
clojure.lang.Cons

那么 `(1) 和 (cons 1 nil) 成为 PersistentLists 的原因是什么?

最佳答案

就像 amalloy 所说,您不应该针对这些确切类型进行编程,而是针对 seq 进行编程。抽象。

不过,我想我可以猜到原因。产生 PersistentList 的 Clojure 形式最终调用RT.java ,特别是 cons(Object x, Object coll)方法。它以一个非常奇怪的检查开始:if(coll == null) return new PersistentList(x) , 之后它会创建一个 Cons如果该检查未通过,则反对。如果你看earlier versions of the code ,你可以找到这个:

static public IPersistentCollection cons(Object x, IPersistentCollection y) {
if(y == null)
return new PersistentList(x);
return y.cons(x);
}

因此,在该函数的早期版本中,调用被分派(dispatch)到 cons第二个参数的方法,所以第二个参数是 null的情况(即 nil 在 Clojure 中)需要特殊处理。后来的版本不进行这种分派(dispatch)(或者实际上以不同的方式进行,可能是为了支持更多种类的集合类型),但是由于它不会破坏任何正确编写的代码,因此保留了该检查。

关于clojure - (not= (type `(1)) (type ` (1 2))) ;;为什么? (单元素列表、语法引用、缺点、PersistentList),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9636945/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com