Clojure - 如何评估符号?

时间:2017-06-10 03:08:22

标签: clojure functional-programming macros symbols

我们知道clojure在阅读unicode字符到阅读器输出的实际评估的几个阶段评估(+ 1 1)......

在代码中,看起来像是(eval (read-string "(+ 1 1)"))

然而当('+ '1 '2)(或('+ 1 2))给我2时,它会伤害我的大脑 ......

核心> (def something(' +' 1' 2))
#' alcamii4hr.core / something
核心> (输入内容)
java.lang.Long

1 个答案:

答案 0 :(得分:0)

符号与关键字一样,可以像函数一样调用。调用时,它们都做同样的事情,看看自己认为是地图。他们有两个ar [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