bu varoldukları için ?: Bunu yapmak için iyi bir yolu var sanmıyorumClojure özel formlarını programlı olarak toplamanın bir yolu var mı?
(deftest fantasy
(is (= ["let" "def" "ns" "etc."] clojure.core/special-chars)))
bu varoldukları için ?: Bunu yapmak için iyi bir yolu var sanmıyorumClojure özel formlarını programlı olarak toplamanın bir yolu var mı?
(deftest fantasy
(is (= ["let" "def" "ns" "etc."] clojure.core/special-chars)))
benzer bir şey yapmaz.
user> (map (comp name first) (seq clojure.lang.Compiler/specials))
("deftype*" "new" "quote" "&" "var" "set!"
"monitor-enter" "recur" "." "case*" "import*"
"reify*" "do" "fn*" "throw" "monitor-exit" "letfn*"
"finally" "let*" "loop*" "try" "catch" "if" "def")
Bu derleyici uygulama ayrıntılarını güvenmektedir:
Ama burada (kanayan kenarı 1.2 anlık çalıştırmak) bir beygir. Lütfen bunu üretim kodunda kullanmayın.
Gerçekten normal bir makro olmasına ve let*
gerçek özel form olmasına rağmen, let
özel bir form olarak kabul edilir. fn
ve diğerleri ile aynı. Bunlar gelecekte uygulama ayrıntılarına göre değişebilir.
Gerçekten özel formların bir listesini istiyorsanız, listeyi kendiniz yazmanızı öneririm. Liste yeterince kısa (http://clojure.org/special_forms'da listelenen her şey). clojure.core/special-form-anchor
için kaynağa bakın, orada kopyalamak/yapıştırmak için kodlanmış bir liste var.
#{'. 'def 'do 'fn 'if 'let 'loop 'monitor-enter 'monitor-exit 'new 'quote 'recur 'set! 'throw 'try 'var}
(. Yine muhtemelen bir uygulama ayrıntı olsa güvenerek olmamak) Ve ayrıca bu var:
user> (clojure.core/special-symbol? 'if)
true