The Clojure (or Lisp) Equivalent of a Compound Boolean Test

后端 未结 4 1559
暗喜
暗喜 2021-02-05 06:25

In C++ I\'d write something like this:

if (a == something && b == anotherthing)
{
   foo();
}

Am I correct in thinking the Clojure equi

相关标签:
4条回答
  • 2021-02-05 07:08

    In Common Lisp, the following is also a common idiom:

    (when (and (= a something) (= b another))
      (foo))
    

    Compare this to Doug Currie's answer using (and ... (foo)). The semantics are the same, but depending on the return type of (foo), most Common Lisp programmers would prefer one over the other:

    • Use (and ... (foo)) in cases where (foo) returns a boolean.

    • Use (when (and ...) (foo)) in cases where (foo) returns an arbitrary result.

    An exception that proves the rule is code where the programmer knows both idioms, but intentionally writes (and ... (foo)) anyway. :-)

    0 讨论(0)
  • 2021-02-05 07:09

    In Clojure I would normally use something like:

    (if 
      (and (= a something) (= b anotherthing))
      (foo))
    

    It is clearly possible to be more concise (e.g. Doug's answer) but I think this approach is more natural for people to read - especially if future readers of the code have a C++ or Java background!

    0 讨论(0)
  • 2021-02-05 07:11

    In Common Lisp and Scheme

    (and (= a something) (= b another) (foo))
    
    0 讨论(0)
  • 2021-02-05 07:19

    It's really cool! (and x y) is a macro -- you can check the source code at clojure.org -- that expands to (if x y false) equivalent to:

    if (x) {
      if (y) {
        ...
      }
    } else {
      false
    }
    

    (or x y) is similar but reversed.

    0 讨论(0)
提交回复
热议问题