Clojure:命名匿名函数

在Clojure中,什么时候和为什么要使用一个命名的匿名函数?例如.,

((fn add-five [x] (+ x 5)) 3))

在ClojureDocs中,one example’s comment表示它在堆栈跟踪中很有用.可以举一个例子吗?

命名匿名功能有两个原因(或至少有两个原因我已经这样做).第一个是给它一个名字告诉后来的读者(也许你自己6个月下来)匿名功能应该做什么.

第二个是(正如你所提到的)在堆栈跟踪中有更好的信息,当您发生故障时,将其指向代码中正确的位置.函数被编译成类,类名包括函数名的(munged)版本.当您有堆栈跟踪时,它将包括该类名称,因此将语义指向正确的位置.

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)
    ...
相关文章
相关标签/搜索