if-else在clojure中分支

Kri*_*ket 28 functional-programming clojure

我在教自己Clojure.

在非FP语言中,我可以很容易地编写嵌套if,如果我没有专门放置else,那么控制将只流出if块.例如:

Thing myfunc()
{
  if(cond1)
  {
    if(cond2)
      return something;
  }
  return somethingelse;
}
Run Code Online (Sandbox Code Playgroud)

但是,在Clojure中,没有返回语句(我知道),所以如果我写:

(defn myfunc []
  (if (cond1)
      (if (cond2) something))
  somethingelse)
Run Code Online (Sandbox Code Playgroud)

那么"某事"就没有"回归"了.它似乎只是说,好吧,这里我们有一个值,现在让我们继续执行.显而易见的解决方案是结合条件,即:

(if (and (cond1) (cond2))
    something
    somethingelse)
Run Code Online (Sandbox Code Playgroud)

但是对于大的条件,这会变得笨拙/丑陋.此外,还需要额外的finagling来向cond1的"else"部分添加一个语句.这有什么优雅的解决方案吗?

Kon*_*rus 34

这是命令式和功能性方法之间的细微差别.通过命令,您可以放置return在功能的任何位置,而功能最好的方法是拥有清晰明确的执行路径.有些人(包括我)在命令式编程中也更喜欢后一种方法,认为它更明显,易于管理,更不容易出错.

要使此功能显式:

Thing myfunc() {
  if(cond1) {
    if(cond2)
      return something;
  }

  return somethingelse;
}
Run Code Online (Sandbox Code Playgroud)

你可以将它重构为:

Thing myfunc() {
  if(cond1 && cond2) {
      return something;
  } else {
    return somethingelse;
  }
}
Run Code Online (Sandbox Code Playgroud)

在Clojure中,它的等价物是:

(defn myfunc []
  (if (and cond1 cond2) 
      something
      somethingelse))
Run Code Online (Sandbox Code Playgroud)

如果您需要"else",您的Java版本可能会变为:

Thing myfunc() {
  if(cond1) {
    if(cond2) {
      return something;
    } else {
      return newelse;
    }
  } else {
    return somethingelse;
  }
}
Run Code Online (Sandbox Code Playgroud)

......及其Clojure等价物:

(defn myfunc []
  (if cond1
      (if cond2 something newelse)
      somethingelse))
Run Code Online (Sandbox Code Playgroud)

  • 你必须在最后一个例子中使用时不是 (2认同)

nic*_*kik 15

(if (and (cond1) (cond2))
     something
     somethingelse)

(cond 
    (and (cond1) (cond2)) something
    :else somethingelse)
Run Code Online (Sandbox Code Playgroud)

cond如果你想比较同样的事情,它会这样做; 在开关盒中你可以使用condp.

我不经常看到那种代码,但这是做到这一点的方法.


Art*_*ldt 15

命令式语言有if语句, if this then do that else do that而且函数式语言有if表达式if this return that else return this.这是一种不同的看待同一个想法的方式,它反映了表达问题的一种非常不同的方法.在功能语言中,即使你没有对这个值做任何事情,一切都有价值,真的是一切.

当我进行转换时,它帮助了我自己"这个函数应该返回什么结果",而不是我习惯要问的"这个函数应该做什么"这个问题.


Nev*_*ena 8

在Clojure中没有明确的return语句,但是你的代码将"返回"on"something"因为你之后没有任何表达式,if而在Clojure 中,最后一个表达式结果被用作函数的返回值.