Clojure 功能评估

dan*_*dan 4 java clojure

我正在寻找 Clojure 对数函数并得出结论,v1.3+ 确实没有。我花了这么长时间才调用的Math/log是:

user=> Math/log

CompilerException java.lang.RuntimeException: Unable to find static field: log in class java.lang.Math, compiling:(NO_SOURCE_PATH:0:0)
Run Code Online (Sandbox Code Playgroud)

我尝试了诸如此类的变体(use 'java.lang.Math)。直到我尝试了一个例子,我才发现它毕竟存在:

user=> (Math/log 10)
2.302585092994046
Run Code Online (Sandbox Code Playgroud)

这一定是设计使然,但原因是什么?

Thu*_*ail 6

从 Java 导入的静态方法不是 Clojure 函数或任何其他类型的 Clojure 对象。编译器将任何不匹配报告为缺失字段,即使上下文正在寻找函数。所有这些...

Math/log
(Math/log)
(map Math/log (range 1 5))
Run Code Online (Sandbox Code Playgroud)

...产生这样的错误。

对于相应的 Clojure 函数:

  • inc 返回函数;
  • (inc)报告... wrong number of args(0) ...
  • (map inc (range 1 5))返回(2 3 4 5)

您可以将 Java 方法包装为 Clojure 方法:

(defn log [x] (Math/log x))
Run Code Online (Sandbox Code Playgroud)

...得到预期的结果:

(map log (range 1 5))
;(0.0 0.6931471805599453 1.0986122886681098 1.3862943611198906)
Run Code Online (Sandbox Code Playgroud)

Clojure Java Interop页面推荐

(map #(Math/log %) (range 1 5))

...在这种情况下。