为什么(或<;falsey value>;<;falsey value>;)在Clojure中返回最终值?
我开始学习Clojure,注意到尽管Clojure的为什么(或<;falsey value>;<;falsey value>;)在Clojure中返回最终值?,clojure,boolean,Clojure,Boolean,我开始学习Clojure,注意到尽管Clojure的或行为据说返回第一个真实值,但将两个错误值传递给或只返回第二个值: user=> (or false false) false user=> (or false nil) nil 我的经验主要是Python,其中 >>> False or False False 这些不是类似的吗?我理解这是每个人的预期行为,并按照建议进行调查,但仍不清楚为什么会这样。我认为文档字符串说明了这一点。它决不会承诺返回错误——只会
或行为据说返回第一个真实值,但将两个错误值传递给或只返回第二个值:
user=> (or false false)
false
user=> (or false nil)
nil
我的经验主要是Python,其中
>>> False or False
False
这些不是类似的吗?我理解这是每个人的预期行为,并按照建议进行调查,但仍不清楚为什么会这样。我认为文档字符串说明了这一点。它决不会承诺返回错误——只会在没有其他论点存在的情况下返回最后一个论点
user=> (doc or)
-------------------------
clojure.core/or
([] [x] [x & next])
Macro
Evaluates exprs one at a time, from left to right. If a form
returns a logical true value, or returns that value and doesn't
evaluate any of the other expressions, otherwise it returns the
value of the last expression. (or) returns nil.
nil
另外,我不知道你是从哪里知道或需要两个参数的
user=> (or nil false false false 1 (println "this is not printed"))
1
user=> (or nil false)
false
user=> (or true)
true
user=> (or)
nil
我认为doc字符串说明了这一点。它决不会承诺返回错误——只会在没有其他论点存在的情况下返回最后一个论点
user=> (doc or)
-------------------------
clojure.core/or
([] [x] [x & next])
Macro
Evaluates exprs one at a time, from left to right. If a form
returns a logical true value, or returns that value and doesn't
evaluate any of the other expressions, otherwise it returns the
value of the last expression. (or) returns nil.
nil
另外,我不知道你是从哪里知道或需要两个参数的
user=> (or nil false false false 1 (println "this is not printed"))
1
user=> (or nil false)
false
user=> (or true)
true
user=> (or)
nil
我怀疑它这样做是因为它更快
请记住,或
是一个宏,它在编译时构造一系列的if
表单,当它只返回一个参数时,就终止于(构造表单)中的一个参数
比如说,
(or 1 2 3)
。。。扩展成相当于
(if 1 1 (if 2 2 3))
如果我们包含jiggery扑克,确保表达式只计算一次,则扩展看起来更像这样:
(let [__auto__ 1]
(if __auto__
__auto__
(let [__auto__ 2]
(if __auto__
__auto__
3))))
。。。其中,\uuuuu auto\uuuuu
是一些不会与或
的参数中使用的任何符号冲突的符号
你可以在报纸上找到完整的故事 我怀疑它这样做是因为它更快
请记住,或
是一个宏,它在编译时构造一系列的if
表单,当它只返回一个参数时,就终止于(构造表单)中的一个参数
比如说,
(or 1 2 3)
。。。扩展成相当于
(if 1 1 (if 2 2 3))
如果我们包含jiggery扑克,确保表达式只计算一次,则扩展看起来更像这样:
(let [__auto__ 1]
(if __auto__
__auto__
(let [__auto__ 2]
(if __auto__
__auto__
3))))
。。。其中,\uuuuu auto\uuuuu
是一些不会与或
的参数中使用的任何符号冲突的符号
你可以在报纸上找到完整的故事 实际上,许多语言的行为与javascript、php和python一样。javascript中甚至有一种惯例,即为函数参数提供默认值myval=myval或defaultValue代码>。在php中,人们编写类似于dou_something()或die()的代码代码>或
不仅仅适用于动态语言中的布尔语言。我也花了很长时间才意识到这一点。实际上,许多语言的行为与javascript、php和python一样。javascript中甚至有一种惯例,即为函数参数提供默认值myval=myval或defaultValue代码>。在php中,人们编写类似于dou_something()或die()的代码代码>或
不仅仅适用于动态语言中的布尔语言。我也花了很长时间才意识到这一点。谢谢——我只是错过了这一点,因为我在寻找一个不同的描述(比如为什么会这样)。我不认为或
需要两个参数,但为了简单起见,使用了这个例子。带有短路和任意参数计数的广义或
可以追溯到lisp的古代历史,它仍然存在,因为它很有用。我的困惑部分是因为我不知道如何区分返回最后一个参数(因为它是真的)和返回最后一个参数(因为它是最后一个)的场景。最后一个参数从未返回,因为它是真的。如果你看源代码,如果还有一个参数,那么这个参数总是被计算和返回的。谢谢你——我错过了这个,因为我在寻找一个不同的描述(比如为什么会这样)。我不认为或
需要两个参数,但为了简单起见,使用了这个例子。带有短路和任意参数计数的广义或
可以追溯到lisp的古代历史,它仍然存在,因为它很有用。我的困惑部分是因为我不知道如何区分返回最后一个参数(因为它是真的)和返回最后一个参数(因为它是最后一个)的场景。最后一个参数从未返回,因为它是真的。如果您查看源代码,如果只剩下一个参数,则始终会计算并返回该参数。呃,在Python中,您使用的是或,而不是
<代码>|
是按位的或
与Clojure中的
或
行为相似(很不幸)。没错,这太草率了。非常感谢。我刚刚注意到这里的“boolean”标记-或
在clojure中绝不是boolean,我想不出任何错误的情况,但对于真实值,有类似的习惯用法。。。(让x[或x default-value-for-x]body-using-x).
依赖于或返回表达式的值,而不是true
。呃,在Python中使用或,而不是
<代码>|
是按位的或
与Clojure中的
或
行为相似(很不幸)。没错,这太草率了。非常感谢。我刚刚注意到这里的“boolean”标记-或
在clojure中绝不是boolean,我想不出任何错误的情况,但对于真实值,有类似的习惯用法。。。(让x[或x default-value-for-x]body-using-x).
取决于或返回表达式的值而不是true
。