请在2024年Clojure调查!中分享您的想法。

欢迎!请参阅关于页面以获取更多关于其工作方式的信息。

+1 投票
集合

我不明白为什么在列表中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代替tick(')。

(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 somehow 被识别为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` 是符号,它们在被请求时进行评估。但有时你想要操作符号而不是变量,在这种情况下你使用 `tick` 或 `backtick`。`'int` 转换为符号,但 `int` 是变量(函数)。数字、关键字(以及其它字面量)没有符号表示,因此它们相同。请参阅此文档: https://clojure.org/reference/reader
...