clojure中的读取字符串和装入字符串有什么区别?

时间:2018-12-04 05:57:16

标签: clojure

我的格式如下:

((read-string "+") 2 3)

它返回3

对此我有两个问题:

1)为什么上面的表格返回3而不是nil或抛出异常或其他任何东西?这个表格的解析度如何? 2)在这种情况下,从read-string返回什么?与我曾经使用过load-string有什么不同?

2 个答案:

答案 0 :(得分:4)

(read-string "+")返回一个符号+,可以对其进行解析或求值以获取实际值,即+函数。

load-string返回表达式的结果。

换句话说,load-string等于(eval (read-string "+"))

您不会得到零或例外,因为该语言会为您评估。

  1. 编译器解析符号+以便计算表达式。
  2. +符号会根据当前的名称空间别名解析为#'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