6

Clojure では、doこのように実装された関数ではなく、なぜ特殊なフォームなのですか?

(defn do [& exprs]
  (last exprs))
4

1 に答える 1

6

基本的な順次実行セマンティクス

fn(まあ、 ) は、ボディを持つ他のフォームと同様に、fn*実際には の背後にあるロジックを再利用します – , , . これらはいくつかあるため、基本的な「式を順番に評価する」ロジックを再利用することは理にかなっています。これ自体は、より複雑な特別なフォームのコンテキスト外のユーザー コードに役立つため、 として公開することは理にかなっています。dolet*letfn*trydo

代わりfn*に基本的な特殊形式である場合、式を順次評価するには関数呼び出しを行う必要があります。そのオーバーヘッドは、この種の低レベル機能では受け入れられません。

(一方、他の特別な形式を暗黙的なdos で本体をラップするマクロに置き換えても、オーバーヘッドは発生しません。ただし、現状の Clojure コンパイラのコンテキストでは、それも大きなメリットにはなりません。この時点で、少なくともかなり DRY になっています。)

トップレベルdo

さらに、トップレベルdoの s は、コンパイラによって特別に扱われます。

(do
  (foo)
  (bar))

トップレベルで(そしてトップレベルでのみ)同等です

(foo)
(bar)

– つまり、個別に書き出された個々の表現に。これにより、マクロは複数の最上位の式を出力 (同等のコード) できます。

このように特別な関数へのトップレベルの呼び出しを解釈することは不可能ではありませんが、この目的のために特別なフォームを使用することは非常にクリーンです。

于 2015-10-27T18:35:33.930 に答える