2013-04-11 43 views
6

我正在浏览字符串的src?并且有几个问题。下面是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有一个名字?
+3

1. was was here:http://stackoverflow.com/questions/7552632/what-does-static-do-in-clojure – 2013-04-11 09:01:00

回答

4

有关1.和2.的答案,请参见d.j.sheldrick对该问题的评论。回答3:

首先,虽然这里没有关系,但命名函数可以用自己的名字来引用自己。这使得他们可以将自己作为价值返回,或者通过通常的调用机制而不是recur进行调用。重要的是,这是产生懒惰seqs函数的正确自我策略;我已经进入了in an earlier SO answer的原因(请参阅“如何在懒惰序列中包装递归调用...”块引用之后的部分)。其次,函数被编译为JVM类。 Clojure编译器根据名称空间来命名类,如果该函数未命名,则该函数将在该名称空间中定义;否则该名称将用于为该类生成更有意义的名称。这对于调试很有用,因为它使堆栈跟踪更易理解。