我正在学习clojure,而且我正在撞墙。
我正在尝试将算术表达式作为中缀字符串读取并在Clojure中处理它。
e.g。 “1 + 2” - > (+ 1 2)
我读了“+”并把它变成这样的符号:
(def plus (symbol "clojure.core" "+"))
这似乎工作正常,但当我打电话给我时,我得不到我所期待的:
user=> plus
+
user=> (plus 1 1)
1
user=> (plus 1 2)
2
user=> (plus 1 2 3)
ArityException Wrong number of args (3) passed to: Symbol clojure.lang.AFn.throwArity (AFn.java:437)
我在这里缺少什么?
答案 0 :(得分:3)
默认情况下,符号附加了一个函数。默认情况下附加到它们的功能是在地图中查看此键。这就是为什么你的加上表现奇怪。它试图在地图中查找元素。
(plus 1 1)
这实际上是在地图1中看起来符号+向上,如果没有找到,则返回默认值1。
(plus 1 2)
与上述相同,但默认值为2。
答案 1 :(得分:0)
你写这样的代码是什么原因?如果你想要一个名为plus
的函数,它将是+
同义词,只需写(def plus +)
即可。
Clojure +
是正常功能。您可以像(+ 1 2 3 4 5)
一样使用它。没有理由把它变成符号。
Clojure根本没有操作员。只有函数和宏。
但是,如果你坚持使用symbol
,你需要像这样评估它
(def plus (eval (symbol "clojure.core/+")))
。
查看(symbol "clojure.core/+")
和+
本身的课程。
(class (symbol "clojure.core/+")) ;;clojure.lang.Symbol
(class +) ;;clojure.core$_PLUS_
符号本身不能作为“在此符号下”的函数调用。如果你想“将符号转换为可调用函数”,你必须评估它。