Java Clojure函数评价
我在搜索Clojure对数函数,得出结论,v1.3+确实没有对数函数。我花了这么长时间调用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)等变体。直到我尝试了
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)
(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方法不共享此属性。