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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ssl/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
If statement 何时使用;如果;及;什么时候;在Clojure?_If Statement_Clojure - Fatal编程技术网

If statement 何时使用;如果;及;什么时候;在Clojure?

If statement 何时使用;如果;及;什么时候;在Clojure?,if-statement,clojure,If Statement,Clojure,什么时候一个比另一个好? 一个比另一个快还是唯一的区别是返回false或nil?当您正好有一个truthy和一个falsy案例并且不需要隐式的do块时,使用if。相反,当您只需处理真实情况和隐式do时,应使用when。在速度上没有区别,这是使用最惯用的风格的问题 (if (my-predicate? my-data) (do-something my-data) (do-something-else my-data)) (when (my-predicate? my-d

什么时候一个比另一个好?
一个比另一个快还是唯一的区别是返回false或nil?

当您正好有一个truthy和一个falsy案例并且不需要隐式的
do
块时,使用
if
。相反,当您只需处理真实情况和隐式
do
时,应使用
when
。在速度上没有区别,这是使用最惯用的风格的问题

 (if (my-predicate? my-data)
     (do-something my-data)
     (do-something-else my-data))

 (when (my-predicate? my-data)
     (do-something my-data)
     (do-something-additionally my-data))

if
情况下,如果
my predicate?
返回真实结果,则只运行
do something
,而在
when
情况下,执行
做某事
另外做某事

当有两个不同的表达式时,使用
if
:for
true
子句和for
false
子句

when
when not
在两种情况下有用:

  • 当您想要有条件地执行一个或多个(隐式
    do
    help)非纯操作时
  • 当某个谓词的计算结果为
    true
    (如果为
    则为
    false
    ,如果为
    则为not
    ),并且在相反的情况下返回
    nil

唯一的区别是返回false或nil


false
nil
之间没有重大区别,因为两者在逻辑上下文中的计算结果都是
false

我注意到在Clojure和Common Lisp中使用
时,在风格上存在差异。在CL中,有些人认为在时使用<代码>是不好的,如果您在测试失败时关心返回值;在这种情况下,您应该在
if
的最后一个子句中显式返回
nil
。在同样的情况下,在Clojure中使用
是很有意义的,因为大多数代码在Clojure中都是纯功能性的:返回值很少被忽略。如果Clojure程序员遵循CL约定,
when
很少用于纯函数式代码。(偶尔
nil
vs.
false
很重要。)@Mars,有趣的是,Clojure中
false
nil
共存的真正原因是什么?我想不出什么情况下,
false
可以做
nil
做不到的事情。我想大概的意思是:
nil
表示“序列中没有剩余内容”,而
false
只是表示false。
nil
也意味着false,这一事实允许简单地测试序列的结尾。此外,您还可以执行类似于
(get{:a1:bnil}:c false)
的操作。更多的讨论,还有:因为
nil
意味着“空序列”和false,所以
next
rest
在应用于
nil
时有意义,但在应用于
false
时抛出异常。
nil
的其他有趣用法包括,它可以像谓词一样工作,因为它在失败时返回nil,但实际上不是谓词(因此它的名称中没有“?”),和(请参见文档页)。然而,我不完全理解为什么Clojure在CL中同时具有
nil
false
@Mars,建议与Clojure基本相同,参见和。从后者来看:除非要强调返回值,否则不要将2参数IF或3参数
IF
与第二个参数
NIL
一起使用;当
时使用
,除非
。当IF子句嵌入到
SETQ
中时,您需要强调返回值,例如
(SETQ X(IF(EQ Y Z)2 NIL))
。如果我只需要处理真实情况,而不需要隐式
do
,在这种情况下使用它会更为常规吗?使用
when
do
部分是选择
when
而不是
if
的另一个很好的理由,而不是必要的先决条件。