从字符串生成符号并将其作为函数应用

时间:2013-11-05 18:16:39

标签: clojure

我正在学习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)

我在这里缺少什么?

2 个答案:

答案 0 :(得分:3)

默认情况下,符号附加了一个函数。默认情况下附加到它们的功能是在地图中查看此键。这就是为什么你的加上表现奇怪。它试图在地图中查找元素。

(plus 1 1) 这实际上是在地图1中看起来符号+向上,如果没有找到,则返回默认值1。

(plus 1 2) 与上述相同,但默认值为2。

clojure docs for symbols

答案 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_

符号本身不能作为“在此符号下”的函数调用。如果你想“将符号转换为可调用函数”,你必须评估它。