什么';clojure中读取字符串和加载字符串的区别是什么?
我有以下表格:什么';clojure中读取字符串和加载字符串的区别是什么?,clojure,Clojure,我有以下表格: ((读字符串“+”)23) 它返回3 关于这一点,我有两个问题: 1) 为什么上面的表单返回3,而不是nil,或者抛出异常或其他任何东西?这张表到底是如何解析的? 2) 在这种情况下,读取字符串返回什么?它与我使用的加载字符串有何不同?(读取字符串“+”)返回一个符号+,可以解析或计算得到实际值,即+函数 load string返回表达式的结果 换句话说,加载字符串等于(eval(读取字符串“+”) 您不会得到nil或异常,因为该语言为您进行评估 编译器解析符号+以计算表达式 +
((读字符串“+”)23)
它返回3
关于这一点,我有两个问题:
1) 为什么上面的表单返回3
,而不是nil
,或者抛出异常或其他任何东西?这张表到底是如何解析的?
2) 在这种情况下,读取字符串
返回什么?它与我使用的加载字符串有何不同?(读取字符串“+”)
返回一个符号+
,可以解析或计算得到实际值,即+
函数
load string
返回表达式的结果
换句话说,加载字符串
等于(eval(读取字符串“+”)
您不会得到nil或异常,因为该语言为您进行评估
+
以计算表达式+
符号根据当前名称空间别名解析为#'clojure.core/+,因为核心别名始终可用
(class (read-string "+"))
; => clojure.lang.Symbol
(class (resolve (read-string "+")))
; => clojure.lang.Var
(class (deref (resolve (read-string "+"))))
; => clojure.core$_PLUS_`
(读取字符串“+”)
返回一个符号+
,可以解析或计算该符号以获得实际值,即+
函数
load string
返回表达式的结果
换句话说,加载字符串
等于(eval(读取字符串“+”)
您不会得到nil或异常,因为该语言为您进行评估
+
以计算表达式+
符号根据当前名称空间别名解析为#'clojure.core/+,因为核心别名始终可用
(class (read-string "+"))
; => clojure.lang.Symbol
(class (resolve (read-string "+")))
; => clojure.lang.Var
(class (deref (resolve (read-string "+"))))
; => clojure.core$_PLUS_`
实际上,您所做的是将符号用作函数并向其传递参数。你可以阅读一篇更详细的文章。答案如下: 现在符号可以用作函数(它们实现 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源代码。您实际做的是使用符号作为函数并向其传递参数。你可以阅读一篇更详细的文章。答案如下: 现在符号可以用作函数(它们实现 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的源代码。它实际上与
读取字符串
没有什么关系。试试('foo23)
,你会得到同样的结果。或者,更具说明性的是:('+{'+10}11)
,('+{'-10}11}
这里有一个直接相关的问题:。基本上,将参数传递给符号会导致它们在第一个参数中查找自己,第二个参数将是默认值,因此得到3。这实际上与读取字符串
没有什么关系。请尝试('foo 2 3)
您将得到相同的结果。或者,更具体的是:('+{'+10}11)
,('+{'-10}11}
这里有一个直接相关的问题:。基本上,向符号传递参数会使它们在第一个参数中查找自己,第二个参数将是默认值,因此得到3。