هل هناك طريقة للحصول على مجموعة من أشكال Clojure الخاصة بشكل برمجي؟

StackOverflow https://stackoverflow.com/questions/3159836

  •  01-10-2019
  •  | 
  •  

سؤال

هل هناك شيء مشابه لهذا؟:

(deftest fantasy
   (is (= ["let" "def" "ns" "etc."] clojure.core/special-chars)))
هل كانت مفيدة؟

المحلول

لا أعتقد أن هناك طريقة جيدة للقيام بذلك.

ولكن إليك اختراق (قم بالتشغيل على لقطة 1.2 حافة النزيف):

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")

هذا يعتمد على تفاصيل التنفيذ للمترجم. من فضلك لا تستخدم هذا في رمز الإنتاج.

لاحظ أن let يعتبر شكلًا خاصًا ، على الرغم من أنه ماكرو عادي و let* هو الشكل الخاص الفعلي. نفس الشيء مع fn و اخرين. ربما تكون هذه تفاصيل التنفيذ ، تخضع للتغيير في المستقبل.

لذلك إذا كنت تريد حقًا قائمة بالأشكال الخاصة ، أقترح كتابة القائمة بنفسك. القائمة قصيرة بما يكفي (كل شيء مدرج على http://clojure.org/special_forms). انظر إلى المصدر ل clojure.core/special-form-anchor, ، هناك قائمة متشددة هناك لنسخ/لصق. (مرة أخرى ربما تفاصيل التنفيذ لا يجب الاعتماد عليها.)

#{'. 'def 'do 'fn 'if 'let 'loop 'monitor-enter 'monitor-exit 'new 'quote 'recur 'set! 'throw 'try 'var}

وهناك هذا أيضًا:

user> (clojure.core/special-symbol? 'if)
true
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top