Clojure的所有特殊形式是什么?

9
作为改进Cider调试器的一部分,我需要实现所有可能的特殊形式的特殊处理。换句话说,我需要知道符合 "special-symbol?" 的所有符号。 虽然Special Forms上的文档页面很有帮助,但并不提供所有这些内容。 例如,经过一些实验后,我发现: 1. 列出的大多数表单都有一个 "*" 对应项(例如,let*和loop*)。 2. 有一个clojure.core/import*特殊符号(如果不是因为纯粹的运气,我就找不到它了)。 是否有所有特殊符号的完整列表? 或者,是否有一种列出所有已编入符号的方法?如果是这样,那么我可以在"special-symbol?"上进行筛选。
1个回答

19

查看special-symbol?的定义可以提供一个重要线索:

(defn special-symbol?
  "Returns true if s names a special form"
  {:added "1.0"
   :static true}
  [s]
    (contains? (. clojure.lang.Compiler specials) s))

因此:
user=> (pprint (keys (. clojure.lang.Compiler specials)))
(&
 monitor-exit
 case*
 try
 reify*
 finally
 loop*
 do
 letfn*
 if
 clojure.core/import*
 new
 deftype*
 let*
 fn*
 recur
 set!
 .
 var
 quote
 catch
 throw
 monitor-enter
 def)

糟了,现在我很尴尬。忘记使用源代码了。 - Malabarba

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接