المسارات
/
Clojure
Clojure
/
التمارين
/
تحويل الإحداثيات
تحويل الإحداثيات

تحويل الإحداثيات

تمرين تعلّمي

مقدمة

الإغلاقات هي نمط برمجي في Clojure يسمح باستخدام متغيرات من النطاق المعجمي الخارجي داخل دالة. تدعم Clojure الإغلاقات بشفافية، وكثيرًا ما تُستخدم دون معرفة ماهيتها.

;; Top-level definitions are global-scope
(def dozen 12)

;; Functions create a new scope.
;; Referencing the outer variable here is a closure.
(fn [n] (* dozen n))

الإغلاقات لحفظ الحالة وتمرير القيم

استخدام atom يسمح بالحفاظ على بعض الحالة:

;; This function closure increments the counter's state
;; in the outer lexical context.
;; This way the counter can be shared between many calling contexts.

(def increment
  (let [counter (atom 0)]
    (fn [] (swap! counter inc))))

كل استدعاء متتالٍ للدالة increment يزيد قيمة العدّاد:

(increment)
;;=> 1
(increment)
;;=> 2

التعليمات

كانت شركة التصميم التي تعمل بها تعتمد أساسًا على تحويلات CSS لبناء صفحات الويب. وبعد بعض النقاش، اتُّخذ قرار بالبدء في استخدام Clojure لإجراء بعض الحسابات ديناميكيًا. بعض زملائك في الفريق أقل خبرة بـ Clojure، لذا تقرر استخدام إغلاق دالة لإنشاء تحويلات قابلة لإعادة الاستخدام لأزواج الإحداثيات {x, y}.

1. إزاحة الإحداثيات

نفّذ الدالة translate2d التي تُرجع دالة تستفيد من إغلاق لإجراء إزاحة ثنائية الأبعاد قابلة للتكرار لزوج إحداثيات.

(def move-coordinates-right-2px (translate2d 2 0))
(def result (move-coordinates-right-2px 4 8))
;; result => [6 8]

2. تحجيم الإحداثيات

نفّذ الدالة scale2d التي تُرجع دالة تستفيد من إغلاق لإجراء تحجيم ثنائي الأبعاد قابل للتكرار لزوج إحداثيات.

في هذا التمرين، افترض أن قيم التحجيم موجبة فقط.

(def double-scale (scale2d 2 2))
(def result (double-scale 6 -3))
;; result => [12 -6]

3. تركيب دوال التحويل

اجمع بين دالتي تحويل لإجراء تحويل قابل للتكرار. يُسمى هذا غالبًا تركيب الدوال، حيث تُستخدم نتيجة الدالة الأولى 'f(x)' كمدخل للدالة الثانية 'g(x)'.

(def move-coordinates-right-2px (translate2d 2 0))
(def double-coordinates (scale2d 2 2))
(def composed-transformations 
  (compose-transform move-coordinates-right-2px 
                     double-coordinates))
(def result (composed-transformations 0 1))
;; result => [4 2]

4. احفظ نتائج الدوال

نفّذ الدالة memoize-transform. تأخذ دالة يُراد حفظ نتائجها، ثم تُرجع دالة جديدة تتذكر المدخلات الممرَّرة إلى الدالة المعطاة، بحيث يمكن "تذكّر" قيمة الإرجاع الأخيرة وحسابها مرة واحدة فقط إذا استُدعيت مجددًا بالوسائط نفسها.

يُسمى حفظ النتائج أحيانًا البرمجة الديناميكية، وهو يسمح بتنفيذ العمليات المكلفة مرة واحدة فقط نظرًا لتذكّر نتيجتها.

(def triple-scale (scale2d 3 3))
(def memoized-scale (memoize-transform triple-scale))

(memoized-scale 4 3)
;; => [12, 9], this is computed since it hasn't been computed before for the arguments

(memoized-scale 4 3)
;; => [12, 9], this is remembered, since it was computed already
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Clojure Exercism

مستعد لبدء تحويل الإحداثيات؟

سجّل في Exercism لتتعلّم وتتقن Clojure عبر 12 مفهومًا105 تمارين، وإرشاد بشري حقيقي، وكل ذلك مجانًا.