2015-06-19 62 views
7

作为改进Cider调试器的一部分,我需要对所有可能的特殊形式实施特殊处理。换句话说,我需要知道所有满足special-symbol?的符号。 Special Forms上的文档页虽然有帮助,但并不能提供所有这些内容。clojure的特殊形式是什么?

例如,经过一番试验,我已经了解到,

  1. 大多数的形式列在那里有一个*对应(let*loop*,例如)。
  2. 有一个clojure.core/import*特殊符号(如果不是纯粹的运气,我不会找到它)。

是否有所有特殊符号的完整列表?
另外,有没有办法列出所有实习符号?如果是这样,那么我可以过滤special-symbol?

回答

14

综观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) 
+0

妈的,现在我尴尬。忘记使用来源。 – Malabarba