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而不是单引号(')。

(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]
by
谢谢,我现在明白了,参数不是使用tick(但 somehow 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)
by
`int` 或 `f` 是符号,它在请求时被评估。但有时您想操作符号而不是变量,为此您使用 tick 或 backtick。`'int` 评估为符号,但 `int` 是变量(函数)。数字、关键字(及其他字面量)没有符号表示,因此它们相同。请参阅此文档: https://clojure.org/reference/reader
...