我的格式如下:
((read-string "+") 2 3)
它返回3
对此我有两个问题:
1)为什么上面的表格返回3
而不是nil
或抛出异常或其他任何东西?这个表格的解析度如何?
2)在这种情况下,从read-string
返回什么?与我曾经使用过load-string
有什么不同?
答案 0 :(得分:4)
(read-string "+")
返回一个符号+
,可以对其进行解析或求值以获取实际值,即+
函数。
load-string
返回表达式的结果。
换句话说,load-string
等于(eval (read-string "+"))
您不会得到零或例外,因为该语言会为您评估。
+
以便计算表达式。 +
符号会根据当前的名称空间别名解析为#'clojure.core / +,因为核心别名始终可用。
(class (read-string "+"))
; => clojure.lang.Symbol
(class (resolve (read-string "+")))
; => clojure.lang.Var
(class (deref (resolve (read-string "+"))))
; => clojure.core$_PLUS_`
答案 1 :(得分:3)
您实际上正在做的是将符号用作函数并将参数传递给它。您可以阅读更详细的related Q&A内容。来自答案:
现在可以将符号用作函数(它们实现了 clojure.lang.IFn接口),但它们在此中的作用方式 方式是他们在辩论中抬头看自己,即请客 他们的参数作为地图并在其中进行查找
如@akond的回答所述,read-string
返回一个符号,load-string
也对其进行评估。您可以通过传递任何其他符号来触发相同的行为:
((symbol 'hi) 2 3)
;; 3
('foo 2 3)
;; 3
('foo '{foo 2} 3)
;; 2
('foo 2)
;; nil since there is no default value provided
如果您感到好奇,可以看看Clojure源代码中的Symbol implementation。