Clojureは、関数または変数を前方宣言できるようにするdeclare
マクロを持っています。 def
として正確に機能しているようだ:(declare x)
代わり(def x)
の使用する必要がある場合は(declare x)
と(def x)
の両方が#<Unbound Unbound: #'user/x>
`def`は前方宣言のための` declare`です。
を作成しますか?
Clojureは、関数または変数を前方宣言できるようにするdeclare
マクロを持っています。 def
として正確に機能しているようだ:(declare x)
代わり(def x)
の使用する必要がある場合は(declare x)
と(def x)
の両方が#<Unbound Unbound: #'user/x>
`def`は前方宣言のための` declare`です。
を作成しますか?
両方declare
とdef
が結合していないVARを作成して行うが、declare
を使用しての3つの利点があります。
(declare x y z)
declare
を使用して{:declared true}
(source declare)
間違いなくより明確かつ慣用である:
(defmacro declare
"defs the supplied var names with no bindings, useful for making forward declarations."
{:added "1.0"}
[& names] `(do [email protected](map #(list 'def (vary-meta % assoc :declared true)) names)))
ドキュメントは答えを与えます:
Looking at the implementationdeclare
はdef
で定義されており、構文の砂糖を少し提供しています。機能的には、ほとんど同じです。
declare
の利点は、後の読者の意図を示すことです。マクロはuseful for making forward declarations.
(def x) (def y) (def z)
私はこれらのシンボルをインターンてる意味が、私は彼らに定義を与えるためのものとするか、私かどうかを忘れてしまったかどうかわからないですので(declare x y z)
は、私はそれらのシンボルの前方宣言を行うことを目的意味します前方宣言をするか、それとも他の微妙なものを作るでしょう。
したがって、コードの将来の読者に慈悲を表示するために、前方宣言を行っているときによりも(declare x)
を優先する必要があります。
def
は、def
が呼び出された時点でvarがスレッドバインドされていても、常にルートバインディングに適用されます。
def
は、var自体(その値ではありません)を生成します。 symbolが既に名前空間にあり、かつ内部変数にマップされていない場合は例外をスローします。
宣言def
提供されたvar名はバインディングなしで、前方宣言に役立ちます。