2024 Clojure 状况调查!分享您的想法。

欢迎!请查阅关于页面以获取更多关于此类功能的信息。

+1
Collections

我不明白为什么对列表使用apply vector不会返回与vector或[]相同的集合,尤其是当列表中至少有一个元素是函数时。

(= [1 2 3] (apply vector '(1 2 3)))
=> true   
(= [int 2 3] (apply vector '(int 2 3)))
=> false
(= [int 2 3] (vector int 2 3))
=> true
(apply vector '(int 2 3))
=> [int 2 3]

Clojure 1.8.0 Java HotSpot(TM) 64-Bit Server VM 1.8.0_91-b14

1 答案

0

选中
 
最佳答案

在第二个例子中,int是一个符号,而不是一个函数。使用list代替冒号(')。

(map type (apply vector '(int 2 3)))
;; => (clojure.lang.Symbol java.lang.Long java.lang.Long)

(apply vector (list int 2 3))
;; => [#function[clojure.core/int] 2 3]
谢谢,我现在明白了,参数不是使用冒号(tick)来评估的,但不知何故,2和3被识别为Longs。
参照 https://docs.clojure.org/clojure.core/list#example-54d17097e4b0e2ac61831cfe

当我在某个表达式中键入int时,我是否需要知道调用它的是什么(比如这个例子中的tick或list)来推断正确的int类型?
(map type (vector int 2 3))
=> (clojure.core$int java.lang.Long java.lang.Long)

如果我在某个函数f中事先存储了int,也会有相同的行为
(def f int)
=> #'user/f
f
=> #object[clojure.core$int 0x44ffdf93 "clojure.core$int@44ffdf93"]
(map type [f 2 3])
=> (clojure.core$int java.lang.Long java.lang.Long)  
(map type '(f 2 3))
=> (clojure.lang.Symbol java.lang.Long java.lang.Long)
`int` 或 `f` 是当请求时被求值的符号。但有时你可能想操作符号,而不是变量,在这种情况下你使用单引号或反引号。`'int` 解析为符号,而 `int` 是变量(函数)。数字、关键字(以及其他字面量)没有符号表示,因此它们是相同的。请参考此文档:https://clojure.org/reference/reader
...