首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >闭包函数评价

闭包函数评价
EN

Stack Overflow用户
提问于 2015-08-05 22:30:09
回答 3查看 1.8K关注 0票数 4

我在搜索Clojure对数函数,并得出结论: v1.3+实际上没有一个。我花了这么长时间才调用Math/log,原因是:

代码语言:javascript
复制
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)等等。直到我尝试了一个例子,我才发现它毕竟在那里:

代码语言:javascript
复制
user=> (Math/log 10)
2.302585092994046

这一定是故意的,但原因是什么呢?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-06 08:54:33

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

代码语言:javascript
复制
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方法:

代码语言:javascript
复制
(defn log [x] (Math/log x))

..。得到预期的结果:

代码语言:javascript
复制
(map log (range 1 5))
;(0.0 0.6931471805599453 1.0986122886681098 1.3862943611198906)

Clojure Java互操作页面建议

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

..。在这种情况下。

票数 6
EN

Stack Overflow用户

发布于 2015-08-06 04:59:25

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

代码语言:javascript
复制
user=> Integer/MAX_VALUE
;=> 2147483647
user=> Math/PI
;=> 3.141592653589793

当您想要调用静态方法时,可以使用以下形式

代码语言:javascript
复制
user=> (Math/log 10)
;=> 2.302585092994046
user=> (Math/sin 1)
;=> 0.8414709848078965

当您试图只计算Math/log时,clojure认为它是静态字段,而这不是真的。

代码语言:javascript
复制
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,然后失败。

票数 4
EN

Stack Overflow用户

发布于 2015-08-05 23:05:22

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

代码语言:javascript
复制
println("hi");

Clojure还使用圆括号来调用函数,但位置不同:

代码语言:javascript
复制
(println "hi")

在Java或Clojure中,只需键入:

代码语言:javascript
复制
println

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

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

此外,在Java中,括号可以指示函数调用或分组操作符:

代码语言:javascript
复制
println(2 + (3 + 4))

中,括号中只有表示函数调用,从不表示简单分组。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/31843896

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档