关于字符串来源的问题?

mur*_*a52 6 clojure

我正在查看字符串的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)))
Run Code Online (Sandbox Code Playgroud)
  1. 给fn静态元数据做了什么?
  2. 为什么给出静态元数据两次,不足以为fn或var指定它?
  3. 为什么匿名fn有名字?

Mic*_*zyk 4

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

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

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