【问题标题】:Higher-order functions and short forms高阶函数和简写形式
【发布时间】:2012-07-26 11:14:36
【问题描述】:

为什么我们可以写作

 (defn factory-foo [] (fn [] (println "foo")))
 (apply (factory-foo) [])

但不是:

 (defn factory-bar [] #((println "bar")))
 (apply (factory-bar ) []) ;throws NPE

这是一个错误吗?

【问题讨论】:

    标签: function macros clojure


    【解决方案1】:

    #((println "bar)) 被读者翻译成(fn [] ((println "bar"))) - 注意额外的括号。 (println "bar") 这里打印bar 并返回nil,然后nil 本身由于外括号而被作为函数调用。 nil 实际上是 null,尝试取消引用它会导致 NPE。

    为避免这种情况,只需在 #(..): #(println "bar") 内添加额外的括号。

    【讨论】:

    • 不客气。仅供参考 here 您可以找到有关 Clojure 阅读器宏的大量文档,特别是 #(..) 表单。
    猜你喜欢
    • 1970-01-01
    • 2011-01-26
    • 2019-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多