【问题标题】:Clojure - how exactly symbols are evaluated? [duplicate]Clojure - 如何准确评估符号? [复制]
【发布时间】:2017-06-10 03:08:22
【问题描述】:

我们知道,从读取 unicode 字符到实际评估阅读器输出,clojure 会分几个阶段评估 (+ 1 1)...

在代码中,类似于
(eval (read-string "(+ 1 1)"))

但是,当 ('+ '1 '2)(或 ('+ 1 2))给我 2 时,这会伤害我的大脑。...

core> (def something ('+ '1 '2))
#'alcamii4hr.core/something
核心>(输入一些东西)
java.lang.Long

【问题讨论】:

    标签: clojure functional-programming macros symbols


    【解决方案1】:

    符号和关键字一样,可以像函数一样被调用。当被调用时,他们都做同样的事情,在他们假定的地图中查找自己。他们有两个arities [a-map][a-map not-found]

    ;; not-found defaults to nil
    ('foo {'bar 42}) ;=> nil
    
    ('foo {'foo 42}) ;=> 42
    
    ;; not-found can also be supplied in the arity-2 case
    ('foo {'bar 42} :not-found) ;=> :not-found
    

    在您的具体情况下,它只是假设第一个参数是关联的,并且不检查。它在它假定的地图中找不到符号+,因此它返回未找到的值:2

    ('+ '1) ;=> nil     ; not-found
    
    ('+ '1 '2) ;=> 2    ; because 2 is the not-found values
    
    ('+ '1 '2 '3) ;=> clojure.lang.ArityException
    

    要了解这一切如何组合在一起,您可以查看invoke method on the symbol class, 它调用clojure.RT.get,这是在关联事物中查找的内容。这与clojure.core/get 调用的方法相同。

    在 clourescript 中,它的工作方式相同,但实现方式不同。 (在 clojurescript 本身中,而不是在宿主语言中。)您可以阅读here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-05-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-19
      • 1970-01-01
      • 2011-11-29
      相关资源
      最近更新 更多