0

我只是在学习clojure,而且我正在碰壁。

我正在尝试将算术表达式读取为中缀字符串并在 Clojure 中处理它。

例如“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)

我在这里想念什么?

4

2 回答 2

3

默认情况下,符号具有附加到它们的功能。默认情况下附加到它们的功能是在地图中查找此键。这就是为什么您的 plus 行为异常的原因。它试图在地图中查找元素。

(plus 1 1) 这实际上是在地图 1 中查找符号 + ,如果未找到则返回默认值 1。

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

用于符号的 clojure 文档

于 2013-11-05T18:36:49.893 回答
0

你写这样的代码的原因是什么?如果你想调用函数plus,这将是+同义词,只需编写(def plus +).

Clojure+是正常功能。你可以像使用它一样(+ 1 2 3 4 5)。没有理由把它变成象征。

Clojure 根本没有运算符。只有函数和宏。

不过,如果你坚持使用symbol,你需要像这样评估它

(def plus (eval (symbol "clojure.core/+"))).

看看 class of(symbol "clojure.core/+")及其+本身。

(class (symbol "clojure.core/+")) ;;clojure.lang.Symbol

(class +) ;;clojure.core$_PLUS_

符号本身不能作为“在此符号下”的函数调用。如果您想“将符号转换为可调用函数”,则必须对其进行评估。

于 2013-11-05T18:30:38.910 回答