惯用的`和`&`或Clojure中的`函数(非宏)

惯用的`和`&`或Clojure中的`函数(非宏),clojure,boolean,Clojure,Boolean,听起来可能很奇怪,我正在Clojure中寻找和宏的函数版本 为什么??首先,我很好奇 其次,我想在支票中使用或。这不起作用: (defn victor [x] {:post (or (nil? %) (vector %))} ;; ... ) 我希望后置条件检查victor是否返回向量或nil,但失败: #<CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojur

听起来可能很奇怪,我正在Clojure中寻找和宏的函数版本

为什么??首先,我很好奇

其次,我想在支票中使用
。这不起作用:

(defn victor
  [x]
  {:post (or (nil? %) (vector %))}
  ;; ...
  )
我希望后置条件检查
victor
是否返回向量或
nil
,但失败:

#<CompilerException java.lang.RuntimeException: Can't take value of a macro: #'clojure.core/or, compiling:(test/test.clj:10:1)>

不过,我仍然好奇函数是否存在。

一般来说,
以及
函数是不可取的,因为它们不能使用短路。考虑下面的代码:

(and false some-expensive-fn)
(or true some-expensive-fn)

使用
作为宏,上述代码不会执行
一些昂贵的fn
,因为不需要确定表达式的整体真值。在函数表达式中,参数在传递给函数之前进行求值,但在宏中则不进行求值。

通常,
以及
函数是不可取的,因为它们不能使用短路。考虑下面的代码:

(and false some-expensive-fn)
(or true some-expensive-fn)

使用
作为宏,上述代码不会执行
一些昂贵的fn
,因为不需要确定表达式的整体真值。在函数表达式中,参数在传递给函数之前进行计算,但在宏中则不进行计算。

我认为标准方法只是在函数中包装
,例如
(fn[x y](或x y))
。在某些情况下,另一个函数将起作用。例如,中的注释建议使用
(every?identity[true-false])
<代码>一些
不是每一个
不是任何一个
都可以以类似的方式使用。

我认为标准方法就是简单地将
包装在函数中,例如
(fn[x y](或x y))
。在某些情况下,另一个函数将起作用。例如,中的注释建议使用
(every?identity[true-false])
有些
不是每个?
不是任何?
都可以以类似的方式使用。

@Triangle Man是对的。短路不起作用,但您可以定义自己的功能版本:

user=> (defn && [x y] (and x y))
#'user/&&
user=> (&& true false)
false
user=> (&& true true)
true
user=> (defn || [x y] (or x y))
#'user/||
user=> (|| true false)
true
user=> (|| true true)
true
user=> (|| false false)
false
user=> 

@三角人是对的。短路不起作用,但您可以定义自己的功能版本:

user=> (defn && [x y] (and x y))
#'user/&&
user=> (&& true false)
false
user=> (&& true true)
true
user=> (defn || [x y] (or x y))
#'user/||
user=> (|| true false)
true
user=> (|| true true)
true
user=> (|| false false)
false
user=> 

不受欢迎的大概短路不一定是好的或坏的。这取决于意图。无论如何,这不能回答原来的问题。这不是问题的答案,所以我投了反对票。这只是说“你所要求的是不受欢迎的”,而没有回答原来的问题。关于短路和副作用的评论当然是受欢迎的。一个可能的答案是clojure.core中“这样的函数不存在”,但这样的答案是不正确的;请参阅Mars的回答:“注意,
是一个宏,因此您无法应用它。”这是查找函数版本的一个有效原因。不需要吗?大概短路不一定是好的或坏的。这取决于意图。无论如何,这不能回答原来的问题。这不是问题的答案,所以我投了反对票。这只是说“你所要求的是不受欢迎的”,而没有回答原来的问题。关于短路和副作用的评论当然是受欢迎的。一个可能的答案是clojure.core中“这样的函数不存在”,但这样的答案是不正确的;请参阅Mars的回答:“注意,
是一个宏,因此您无法应用它。”这是查找函数版本的一个有效原因。