21

C ++では、次のように記述します。

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

Clojureに相当するものは次のようなものだと思いますか?

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

または、私が見逃した論理的な「and」を実行する別の方法はありますか?私が言ったように、後者の形式は正しく機能しているようです-論理積を実行するためのより簡単な方法があるかどうか疑問に思っていました。そして、Clojure Google Groupで「boolean」、「logical」、「and」を検索すると、結果が多すぎてあまり使用できませんでした。

4

4 に答える 4

35

CommonLispとSchemeで

(and (= a something) (= b another) (foo))
于 2009-02-11T03:13:32.377 に答える
17

Common Lisp では、以下も一般的なイディオムです。

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

を使用して、これを Doug Currie の回答と比較してください(and ... (foo))。セマンティクスは同じですが、 の戻り値の型に応じて(foo)、ほとんどの Common Lisp プログラマーはどちらかを優先します。

  • ブール値を返す(and ... (foo))場合に使用します。(foo)

  • 任意の結果を返す(when (and ...) (foo))場合に使用します。(foo)

ルールを証明する例外は、プログラマーが両方のイディオムを知っているが、意図的に(and ... (foo))とにかく書くコードです。:-)

于 2009-02-11T08:32:29.913 に答える
8

Clojure では、通常、次のようなものを使用します。

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

より簡潔にすることは明らかに可能ですが (Doug の回答など)、このアプローチは人々が読むのにより自然だと思います。特に、コードの将来の読者が C++ または Java のバックグラウンドを持っている場合は!

于 2010-10-29T15:16:00.873 に答える
2

それは本当にクールです!(and x y)はマクロです -- clojure.org でソース コード(if x y false)を確認できます -- 展開すると、次のようになります。

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

(or x y)似ていますが逆です。

于 2010-10-29T16:20:40.327 に答える