我在搜索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)我尝试了一些变体,比如(use 'java.lang.Math)等等。直到我尝试了一个例子,我才发现它毕竟在那里:
user=> (Math/log 10)
2.302585092994046这一定是故意的,但原因是什么呢?
发布于 2015-08-06 08:54:33
从Java导入的静态方法不是Clojure函数或任何其他类型的Clojure对象。即使上下文正在查找函数,编译器也会将任何不合适的字段报告为缺少的字段。所有这些..。
Math/log
(Math/log)
(map Math/log (range 1 5))..。产生这样的错误。
对于相应的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))..。得到预期的结果:
(map log (range 1 5))
;(0.0 0.6931471805599453 1.0986122886681098 1.3862943611198906)Clojure Java互操作页面建议
(map #(Math/log %) (range 1 5))
..。在这种情况下。
发布于 2015-08-06 04:59:25
Clojure提供了一些用于与Java类、方法和字段进行互操作的表单。当您访问类中的静态字段时,可以这样做:
user=> Integer/MAX_VALUE
;=> 2147483647
user=> Math/PI
;=> 3.141592653589793当您想要调用静态方法时,可以使用以下形式
user=> (Math/log 10)
;=> 2.302585092994046
user=> (Math/sin 1)
;=> 0.8414709848078965当您试图只计算Math/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)您可以从错误消息(Unable to find static field:...)中看到,clojure试图从Math类中查找静态字段log,然后失败。
发布于 2015-08-05 23:05:22
在Java中,可以使用圆括号来调用函数:
println("hi");Clojure还使用圆括号来调用函数,但位置不同:
(println "hi")在Java或Clojure中,只需键入:
println是一个错误,因为您没有指示函数调用的括号。
在第一个示例中,您使用函数Math/log的名称,但是没有括号告诉REPL您想要调用一个函数。
此外,在Java中,括号可以指示函数调用或分组操作符:
println(2 + (3 + 4))在中,括号中只有表示函数调用,从不表示简单分组。
https://stackoverflow.com/questions/31843896
复制相似问题