Java Clojure函数评价

Java Clojure函数评价,java,clojure,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) 我尝试了类似(使用'java.lang.Math)等变体。直到我尝试了

我在搜索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)
我尝试了类似
(使用'java.lang.Math)
等变体。直到我尝试了一个例子,我才发现它确实存在:

user=> (Math/log 10)
2.302585092994046

这一定是出于设计,但原因是什么?

在Java中,使用括号来调用函数:

println("hi");
Clojure也使用括号调用函数,但位置不同:

(println "hi")
在Java或Clojure中,只需键入:

println
是一个错误,因为您没有表示函数调用的括号

在第一个示例中,您使用了函数Math/log的名称,但是没有括号告诉REPL您想要调用函数

此外,在Java中,括号可以表示函数调用或分组运算符:

println(2 + (3 + 4))

在Clojure中,括号仅表示函数调用,从不表示简单分组。

Clojure提供了一些与Java类、方法和字段进行互操作的形式。当您访问类中的静态字段时,可以这样做:

user=> Integer/MAX_VALUE
;=> 2147483647
user=> Math/PI
;=> 3.141592653589793
当您想要调用静态方法时,您可以使用以下表单

user=> (Math/log 10)
;=> 2.302585092994046
user=> (Math/sin 1)
;=> 0.8414709848078965
当您尝试只计算
数学/log
时,clojure认为它是静态字段,这是不正确的

user=> Math/log

;=> CompilerException java.lang.RuntimeException: Unable to find static field: log in class java.lang.Math, compiling:(/private/var/folders/jh/q738l9dn0hxg0vvwbty7m5hw0000gp/T/form-init145007798854806400.clj:1:5845)

您可以从错误消息(
找不到静态字段:…
)中看到clojure REPL尝试从
Math
类中查找静态字段
log
,但失败。

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

Math/log
(Math/log)
(map Math/log (range 1 5))
。。。产生这样的错误

对于相应的Clojure函数:

println("hi");
  • inc
    返回函数
  • (inc)
    报告
    。。。参数数量错误(0).
  • (地图公司(范围15))
    返回
    (23 4 5)
您可以将Java方法包装为Clojure方法:

(defn log [x] (Math/log x))
。。。获得预期结果:

(map log (range 1 5))
;(0.0 0.6931471805599453 1.0986122886681098 1.3862943611198906)
Clojure页面建议

(map#(Math/log%)(范围15))


。。。在这种情况下

Math/log
是一种静态方法。您试图将其作为静态变量进行访问。在Clojure中,键入
println
不是错误。在clojure中,函数也是IFn类型的数据(符号),这就是为什么您不会得到错误。但是Java方法不共享此属性。