2015-11-22 29 views
15

Clojure, ma declare makro, które umożliwia przekazywanie zadeklarować funkcji lub zmiennych. Wydaje się działać dokładnie jak def: Zarówno (declare x) i (def x) tworzyć #<Unbound Unbound: #'user/x>`def` vs` declare` dla deklaracji przodu

Kiedy należy (declare x) być stosowany zamiast (def x)?

Odpowiedz

17

Zarówno declare i def zrobić utworzyć niezwiązany var, ale są 3 zalety stosowania declare:

  1. Można utworzyć wiele vars w jednym zestawieniu, na przykład (declare x y z)
  2. W Vars są oznaczone tagiem dodatkowego metadanych {:declared true}
  3. używając słowa declare jest zapewne bardziej jasne i idiomatyczne

(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))) 
3

Dokumentacja daje odpowiedź:

=> (doc declare) 
------------------------- 
clojure.core/declare 
([& names]) 
Macro 
    defs the supplied var names with no bindings, useful for making forward declarations. 

Looking at the implementation, jasne jest, że declare jest zdefiniowany pod względem def i dostarcza trochę cukru składniowego. Funkcjonalnie, są prawie takie same.

Zaletą declare jest wykazanie, przeznaczona do późniejszego czytelnika. (declare x y z) oznacza zamierzałem złożyć do przodu deklarację tych symboli, bo makro jest useful for making forward declarations.

(def x) (def y) (def z) znaczy ja interning te symbole, ale nie wiem, czy chciałem dać im definicje i zapomniał czy I Składam deklaracje, a może subtelne.

A więc, (declare x) należy preferować w stosunku do (def x), gdy składasz deklarację, aby okazać miłosierdzie przyszłym czytelnikom Twojego kodu.

1

def zawsze stosuje się do powiązania z rootem, nawet jeśli var jest powiązany z wątkiem w miejscu, w którym wywoływane jest def.

def daje samo var (nie jego wartości). Zgłasza wyjątek, jeśli symbol jest już w obszarze nazw i nie jest zmapowany do internowanego var.

Declare def s dostarczone nazwy var bez wiązań, przydatne do podejmowania przodu deklaracji.