Czasami, patrząc na kod Clojure innych ludzi, widzę to funkcja zdefiniowana przez defn
a następnie wywołać za pomocą składni var-środki, na przykład:Wywoływanie funkcji Clojure użyciu var-quote składnia
user> (defn a [] 1)
#'user/a
user> (a) ; This is how you normally call a function
1
user> (#'a) ; This uses the var-quote syntax and produces the same result
1
Dla życia nie potrafię zrozumieć różnicy między tymi dwoma sposobami wywoływania funkcji. Nie mogę znaleźć niczego w dokumentacji evaluation, aby powiedzieć, co się dzieje, gdy operator połączenia jest var, co może sugerować, dlaczego druga forma byłaby preferowana. Obaj wydają się reagować w ten sam sposób na przypisania binding
i cytowanie składni.
Czy ktoś może podać próbkę kodu, która ilustruje różnicę między powyższymi (a)
i (#'a)
?
Edit: wiem, że var-cytat może być używany, aby dostać się do var, która jest zasłonięta przez let
leksykalny wiązania, ale to nie wydaje się być w przypadku kodu, który patrzę.
Dobra uwaga - teraz, kiedy o tym wspomniałeś, pamiętam, że zrobiłem to sam w przeszłości. Ale kod, na który patrzę, nazywa się nieprywatnym fn, więc myślę, że unikanie buforowania aktualnie związanej wartości jest bardziej prawdopodobnym wyjaśnieniem. – Alex
Ponieważ kod znajduje się w prywatnym repozytorium. Zadałem ogólne pytanie, dostałem dwie dobre odpowiedzi i mogę je zaakceptować, więc przyjąłem odpowiedź, która była dla mnie lepsza. – Alex