什么';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。