سؤال

في LISP المشتركة يمكنك القيام بذلك:

(defun foo (bar &key baz quux)
  (list bar baz quux))

(foo 1 :quux 3 :baz 2) ; => (1 2 3)

Clojure لا تحتوي على وسيطات الكلمات الرئيسية. بديل واحد هو هذا:

(defn foo [bar {:keys [baz quux]}] 
  (list bar baz quux))

(foo 1 {:quux 3 :baz 2}) ; => (1 2 3)

هذا كثير من الأقواس المتداخلة يجب أن تكتب والقراءة طوال الوقت. كما يتطلب أن يتم تمرير خريطة تجزئة واضحة كوسيطة بدلا من قائمة مسطحة.

ما هو المكافئ الأكثر إشراقا لوازم الكلمات الرئيسية التي لا تبدو شخصا ما ينطلق قنبلة علامات الترقيم؟

هل كانت مفيدة؟

المحلول

طريقة بسيطة لمحاكاة Args الكلمة الرئيسية في Clojure تستخدم خريطة التجزئة على معلمات الراحة مثل هذا:

> (defn kwtest [x & e] (:foo (apply hash-map e)))
#'user/kwtest
> (kwtest 12 :bar "ignored" :foo "returned")
"returned"

قدم الغنية هيكي ماكرو في هذه الرسالة من مجموعة Google Clojure هذا يمنحك معلمات الكلمات الرئيسية. ال موضوع المقابلة. يحتوي على معلومات حول سبب عدم دعم معلمات الكلمات الرئيسية بواسطة Clojure. أساسا لتجنب النفقات العامة وقت التشغيل. يشرح الأغنياء الطريقة التي أظهرتها أعلاه هذه الرسالة

نصائح أخرى

لتحديث هذه الإجابة عن Clojure 1.2 هناك الآن دعم الكلمات الرئيسية الكاملة مع الإعدادات الافتراضية التي توفرها أشكال الخريطة تدمير التجليد:

user> (defn foo [bar &{ :keys [baz quux] 
                        :or {baz "baz_default" quux "quux_default"}}]
         (list bar baz quux))
#'user/foo

user> (foo 1 :quux 3)
(1 "baz_default" 3)

إضافة حديثة إلى clojure.contrib.def هل defnk ماكرو، الذي يتيح تعريف الوظائف مع وسيطات الكلمات الرئيسية (انظر هنا).

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top