Ответ 1
Существует две причины назвать анонимные функции (или по крайней мере две причины, по которым я это сделал). Во-первых, если дать ему имя, то он скажет более позднему читателю (возможно, самому себе через 6 месяцев), что, как предполагается, должно выполнять анонимная функция.
Вторая (как вы упоминаете), чтобы иметь лучшую информацию в трассировке стека, чтобы указать вам в нужном месте в вашем коде при возникновении сбоя. Функции скомпилируются в классы, а имя класса включает (измененную) версию имени функции. Когда у вас есть трассировка стека, она будет включать это имя класса и, таким образом, указывает вам семантически в нужное место.
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)
...