首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >来自clojure.java.api.Clojure的意外行为

来自clojure.java.api.Clojure的意外行为
EN

Stack Overflow用户
提问于 2014-12-15 10:39:17
回答 2查看 112关注 0票数 3

我一直在尝试使用Clojure 1.6.0中引入的clojure.java.api,因为我想将一些Clojure功能导入到我的java项目中。不幸的是,当我从Java调用条件函数以及时,它的行为并不像我预期的那样。

代码语言:javascript
复制
IFn and = Clojure.var("clojure.core", "and");
IFn or = Clojure.var("clojure.core", "or");

-- equivalent to (and true false) in clojure
and.invoke(true,false); --> returns true rather than false???   

-- equivalent to (or true false) in clojure
or.invoke(true,false); --> returns null rather than true???

-- equivalent to (and true true) in clojure
and.invoke(true,true); --> returns true as expected

-- equivalent to (or true true) in clojure    
or.invoke(true,true); --> returns null rather than true???

我不敢相信这是一个bug,所以我怀疑我遗漏了一些与API相关的基本内容。不管是什么原因,都让我很困惑。如果有人能给我解释的话,我将非常感激。

谢谢,

马特。

EN

回答 2

Stack Overflow用户

发布于 2014-12-15 10:48:12

andor是宏,它们的评估规则有些不同。例如,在Clojure REPL上,试图计算and时会抛出CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/and, compiling:(NO_SOURCE_PATH:0:0)

不过,应该有一种通过clojure.java.api.Clojure使用它们的方法,但我目前还没有弄清楚,因为宏需要编译才能工作。

我能想到的下一个最佳选择是使用eval,但我不确定这是否是您想要做的事情。另一方面,既然老的and/||操作符存在,为什么要使用&&/||呢?

票数 3
EN

Stack Overflow用户

发布于 2014-12-15 11:03:00

andor是宏,而不是函数。他们期望两个或更多的形式(我认为是符号的clojure.lang.IPersistentList或嵌套的IPersistentLists )扩展成let*if的组合。

代码语言:javascript
复制
(clojure.walk/macroexpand-all '(and true false))
;returns:
(let* [and__3941__auto__ true] 
      (if and__3941__auto__ 
        false
        and__3941__auto__))

最好是为您制作一个使用andor的clojure。例如,接收它们来接管一个集合:

代码语言:javascript
复制
(defn reduce-and [values]
  (reduce #(and %1 %2) values))
(defn reduce-or [values]
  (reduce #(or %1 %2) values))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27482172

复制
相关文章

相似问题

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