为什么 `(a) 被读作列表而 `(a b) 不是?
Why is `(a) read as a list while `(a b) isn't?
在学习clojure的过程中,我很惊讶地发现这两个对象是不同的类型:
(list? `(inc)) ;; true
(list? `(inc 1)) ;; false
理论上我理解为什么第二种形式returns false,那个对象
实际上是一个clojure.lang.Cons
。但在实践中,我不
了解为什么会发生 。
为什么 reader 读作 `(inc)
与 `(inc 1)
不同?引擎盖下发生了什么?
list?
实际上是一个用处非常有限的函数。事实上,我还没有看到使用 list?
的 Clojure 代码充其量只是一个糟糕的选择,更常见的是错误的原因。
如果您想知道某个东西是否 "listy",seq?
是个不错的选择。
在行动:
user=> (pprint/print-table (for [item [[] () `(a) `(a b) (seq [1])]]
{'item (pr-str item)
'seq? (seq? item)
'list? (list? item)
'type (type item)}))
| item | seq? | list? | type |
|-----------------+-------+-------+------------------------------------------------|
| [] | false | false | class clojure.lang.PersistentVector |
| () | true | true | class clojure.lang.PersistentList$EmptyList |
| (user/a) | true | true | class clojure.lang.PersistentList |
| (user/a user/b) | true | false | class clojure.lang.Cons |
| (1) | true | false | class clojure.lang.PersistentVector$ChunkedSeq |
当 reader 遇到语法引用形式时,结果是一个集合,它会 iterate over each element and call syntax-quote recursively。结果是 cons
ed,以 nil
.
开头
因此归结为以下原因的问题:
> (list? (cons 'inc nil))
true
> (list? (cons 'inc (cons 1 nil)))
false
这似乎是一个定义问题。
在学习clojure的过程中,我很惊讶地发现这两个对象是不同的类型:
(list? `(inc)) ;; true
(list? `(inc 1)) ;; false
理论上我理解为什么第二种形式returns false,那个对象
实际上是一个clojure.lang.Cons
。但在实践中,我不
了解为什么会发生 。
为什么 reader 读作 `(inc)
与 `(inc 1)
不同?引擎盖下发生了什么?
list?
实际上是一个用处非常有限的函数。事实上,我还没有看到使用 list?
的 Clojure 代码充其量只是一个糟糕的选择,更常见的是错误的原因。
如果您想知道某个东西是否 "listy",seq?
是个不错的选择。
在行动:
user=> (pprint/print-table (for [item [[] () `(a) `(a b) (seq [1])]]
{'item (pr-str item)
'seq? (seq? item)
'list? (list? item)
'type (type item)}))
| item | seq? | list? | type |
|-----------------+-------+-------+------------------------------------------------|
| [] | false | false | class clojure.lang.PersistentVector |
| () | true | true | class clojure.lang.PersistentList$EmptyList |
| (user/a) | true | true | class clojure.lang.PersistentList |
| (user/a user/b) | true | false | class clojure.lang.Cons |
| (1) | true | false | class clojure.lang.PersistentVector$ChunkedSeq |
当 reader 遇到语法引用形式时,结果是一个集合,它会 iterate over each element and call syntax-quote recursively。结果是 cons
ed,以 nil
.
因此归结为以下原因的问题:
> (list? (cons 'inc nil))
true
> (list? (cons 'inc (cons 1 nil)))
false
这似乎是一个定义问题。