سؤال

اعتقدت أنني سأقوم بنشر هذا لأنني حصلت على العمل من خلال التخمين دون فهم حقيقي لما يجري وأعتقد أنه قد يكون من المفيد إذا شرح شخص ما.

أفهم كيفية الحصول على عنصر من خريطة: params في معالج compojure:

(GET "/something" [some_arg] "this is the response body")

أو

(GET "/something" {{some_arg "some_arg"} :params} "this is the response body")

على الرغم من أنني لا أفهم تمامًا ما {some_arg "some_arg"} الجزء يفعل :(

أردت أيضًا الوصول إلى :remote-addr جزء من الطلب وكذلك some_arg. وانتهى بي المطاف مع

(GET "/something" {{some_arg "some_arg"} :params ip :remote-addr}
    (do-something-with some_arg ip))

لذا ، أحصل على تلك السلاسل غير المخصصة some_arg و ip هي أسماء المتغيرات التي أريد أن تكون القيم ملزمة ولكن الخريطة أعلاه ليست خريطة clojure صالحة. كيف يعمل؟

أحصل أيضًا على أن هذا يتم تقييمه مقابل خريطة طلب الحلقة (التي يتم توفيرها بطريقة أو بأخرى من قبل defroutes الماكرو) ولكن التعبير أعلاه ليس دالة أو تعريف ماكرو ، فكيف يمكن "وجوده" كتعبير صحيح في الكود الخاص بي؟ هل هناك نوع من التعليق للقواعد العادية للحجج الماكرو؟ لم أتمكن من العثور على تعريف لبناء بناء أشكال التدمير مفهومة لهذا غير lisp'er.

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

المحلول

الخريطة هي خريطة تدمير صالحة. في أي مكان تربط فيه الأسماء ، يمكنك استخدام التدمير. يمكنك أن تفعل الشيء نفسه في let, ، مثله:

user=> (let [{{some-arg "some_arg"} :params ip :remote-addr} {:remote-addr "127.0.0.1" :params {"some_arg" "some_value"}}] [ip some-arg])
["127.0.0.1" "some_value"]

كتبت منشورًا عن تدمير الخريطة في سياق الحجج المسماة ، لكنه ينطبق هنا. قد تجد هذا مفيدًا: Clojure - الحجج المسماة

هناك كثيراً من منشورات المدونة التي تظهر التدمير ، بما في ذلك هذه واحد. لست متأكدًا من أي شخص سيكون مكانًا قانونيًا للتعلم منه.

لا أتظاهر بمعرفة ما يفعله compojure بالضبط مع تلك الخريطة أسفل الغطاء ، لكنني أفترض أنه يلقيها في السماح أو شيء مشابه كما أوضحت أعلاه. Get هو ماكرو ، لذلك ليس من الضروري تقييم الخريطة التي تمررها ، وهذا هو السبب في أنك لن تحصل على خطأ ما لم يتم تقييمه.

user=> (defmacro blah [m])
#'user/blah
user=> (blah {a "b" c "d"})
nil
user=> (defn blah [m])
#'user/blah
user=> (blah {a "b" c "d"})
java.lang.Exception: Unable to resolve symbol: a in this context (NO_SOURCE_FILE:9)

تحت الغطاء ، يحدث السحر لتلك الخريطة ويتم نقله إلى وظيفة تسمى التدمير التي تقوم بتدمير السحر.

لا يوجد حقًا أي شيء مميز يحدث هنا بخلاف النموذج الكلي/الماكرو العادي FOO والتقييم المتأخر.

نصائح أخرى

يحدث التدمير داخل شكل ملزم ، وبالنسبة لتدمير الخريطة ، يكون VAR ملزمة على اليسار ، والمفتاح على اليمين:

user=> (let [{a :foo}  {:foo :bar}]
user=*   a)
:bar

تقوم compojure بعمل ملزمة خلف الكواليس ، بحيث يتم تحويل نموذج تدمير الخرائط الذي كنت تستخدمه أعلاه بشكل فعال إلى شيء مثل:

(let [{{some_arg "some_arg"} :params}  request]
  ...)

أين request هي خريطة ممنوعة ضمنيا.

نسخة المتجه (على سبيل المثال ، [some_arg]) ، هو بديل يرتبط فقط ضد :params الخريطة الواردة في الطلب.

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