我正在寻找 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)
这一定是设计使然,但原因是什么?
从 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))
...在这种情况下。
| 归档时间: |
|
| 查看次数: |
1579 次 |
| 最近记录: |