什么是clojure的特殊形式?

时间:2015-06-19 21:43:18

标签: clojure symbols

作为改进Cider调试器的一部分,我需要为所有可能的特殊形式实现特殊处理。换句话说,我需要知道满足$resouce的所有符号。 Special Forms上的文档页面尽管很有帮助但并未提供所有文档页面。

例如,经过一些实验,我已经了解了

  1. 其中列出的大多数表单都有special-symbol?个对应项(例如*let*)。
  2. 有一个loop*特殊符号(如果不是为了运气,我就不会找到它。)
  3. 是否有所有特殊符号的完整列表?
    或者,有没有办法列出所有实习符号?如果是这样,那么我可以过滤clojure.core/import*

1 个答案:

答案 0 :(得分:15)

查看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)