6

我正在查看字符串的src?fn 并有几个问题。以下是string?fn 的来源 -

(def
 ^{:arglists '([x])
   :doc "Return true if x is a String"
   :added "1.0"
   :static true}
 string? (fn ^:static string? [x] (instance? String x)))
  1. 提供 fn 静态元数据有什么作用?
  2. 为什么两次给出静态元数据,为 fn 或 var 指定它不应该足够吗?
  3. 为什么匿名 fn 有名字?
4

1 回答 1

4

有关 1. 和 2. 的答案,请参阅 djsheldrick 对该问题的评论。回答 3.:

首先,虽然这与这里无关,但命名函数可以通过它们的名称来引用它们自己。这允许他们将自己作为值返回或通过通常的调用机制而不是recur顶部来调用自己。重要的是,这是生成惰性序列的函数的正确自调用策略;我已经在较早的 SO 答案中探讨了原因(请参阅“您如何将递归调用包装在惰性序列中......”块引用之后的部分)。

其次,函数被编译为 JVM 类。如果函数未命名,则类由 Clojure 编译器根据定义函数的命名空间命名;否则,该名称将用于为类生成更有意义的名称。这对于调试很有用,因为它使堆栈跟踪更容易理解。

于 2013-04-11T20:32:36.843 回答