Istnieją dwa powody, aby wymienić funkcji anonimowych (lub co najmniej dwa powody, że mam zrobić tak). Po pierwsze, nadanie jej nazwy mówi późniejszemu czytelnikowi (być może samemu 6 miesięcy w dół), co ma do zrobienia ta anonimowa funkcja.
Drugi to (jak wspomniałeś), aby mieć lepsze informacje w śledzeniu stosu, aby wskazać w odpowiednim miejscu w kodzie, gdy wystąpi awaria. Funkcje są kompilowane w klasy, a nazwa klasy zawiera (zmumifikowaną) wersję nazwy funkcji. Kiedy masz ślad stosu, będzie on zawierał tę nazwę klasy, a tym samym wskazywał semantycznie w kierunku właściwej lokalizacji.
user=> (filter (fn [x] (/ 100 x)) [100 50 0])
ArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:158)
user=> (pst *e)
ArithmeticException Divide by zero
clojure.lang.Numbers.divide (Numbers.java:158)
clojure.lang.Numbers.divide (Numbers.java:3784)
user/eval8/fn--9 (NO_SOURCE_FILE:3)
clojure.core/filter/fn--6908 (core.clj:2790)
...
nil
user=> (filter (fn hundred-div [x] (/ 100 x)) [100 50 0])
ArithmeticException Divide by zero clojure.lang.Numbers.divide (Numbers.java:158)
user=> (pst *e)
ArithmeticException Divide by zero
clojure.lang.Numbers.divide (Numbers.java:158)
clojure.lang.Numbers.divide (Numbers.java:3784)
user/eval14/hundred-div--15 (NO_SOURCE_FILE:5) ;; <---
clojure.core/filter/fn--6908 (core.clj:2790)
...