2011-06-12 10 views
23

はあなたが書くことができる:スキームでなぜですか:他にはいない(else)clojure? Clojureので

(cond (= 1 2) 1 
     :else 5) 

を同等には、次のようになります。

(cond ((= 1 2) 1) 
     (else 5)) 

:else 5構文は(else 5)ほど一貫していません。 Clojureでこの一見矛盾した方法でelse構文が実装された理由は何ですか?

+0

すてきな答えをありがとう。彼らはすべて価値を追加しました。 – steenhulthin

答えて

26

私は(else 5)があまり一貫していないと思います。 (cond ...)引数は条件 - 値の組として記述されます。 :elseはちょうど慣習に過ぎないので、:elseは常に真であるため、は一貫しています。 :elseの特別なルールは全くありません。

3

多くの理由があります。主に私はcondifの周りのマクロとして実装されているからだと思います。一方、スキームelseは、この文脈ではtの単なる同義語です。関数呼び出しではないので、なぜそれを1つのように見せますか?

+2

'cond 'がマクロとして実装されているということはどうですか? –

+0

マクロは関数とは構文が異なります。 –

34

:elseは、ここでは巧妙なトリックの実際のビットです:

  • condは条件/値のペアを期待 - と:他のClojureで「truthy」であるだけで値は、それがあることを保証されます条件を満たす。 (nullまたはfalse以外のものは "真"とカウントされます)。あなたが好きであれば、保証された真の条件値として ":ロバ"を同じように使うことができます。
  • しかし、:他にも(すなわち、この条件は他の条件が一致し

のどれもがそう実際にそれがcond式で働くだけで、条約のない場合に実行する1つである人間の読者に意味を伝えます人間の読者には意味があります。

3

Clojureの括弧は、関数やマクロ呼び出しを意味しています。これはグループ化に括弧を使用する他のLispsと対照的です。Clojureでは、グループ化が必要な場合fnまたはletバインディングでは、[] instea d。

リッチは最近のインタビューでこの変更を行う理由の一部について説明しますhere要するに、コードをよりすぐに読みやすくするために役立ちます。なぜなら、括弧が何を表しているかを理解する時間を費やす必要がないからです。

+0

しかし、それは有効なクロージャです。それはただ例外をスローするつもりです – naiad

関連する問題