2015-06-19 39 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