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]
谢谢,我现在明白了,参数不是通过tic(但不知何故2和3被识别为Longs)进行评估的。
参考:https://docs.clojure.org/clojure.core/list#example-54d17097e4b0e2ac61831cfe

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

如果在之前将int存储在某个函数f中,行为相同。
(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`是符号,在请求时进行评估。但有时你想要处理符号而不是变量,为此你使用tic或反tic。`'int`评估为符号,而`int`是变量(函数)。数字、关键词(以及其他文字)没有符号表示,因此它们相同。请参阅此文档:https://clojure.org/reference/reader
...