Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/clojure/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么(或<;falsey value>;<;falsey value>;)在Clojure中返回最终值?_Clojure_Boolean - Fatal编程技术网

为什么(或<;falsey value>;<;falsey value>;)在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 这些不是类似的吗?我理解这是每个人的预期行为,并按照建议进行调查,但仍不清楚为什么会这样。我认为文档字符串说明了这一点。它决不会承诺返回错误——只会

我开始学习Clojure,注意到尽管Clojure的
行为据说返回第一个真实值,但将两个错误值传递给
只返回第二个值:

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