المسارات
/
Common Lisp
Common Lisp
/
التمارين
/
ذكرى الجيجا ثانية
ذكرى الجيجا ثانية

ذكرى الجيجا ثانية

تمرين تعلّمي

مقدمة

التاريخ والوقت

في Common Lisp يُمثَّل الوقت بأربعة أساليب، وسنتطرق هنا إلى اثنين منها.

  • الوقت العالمي هو وقت مطلق، عدد صحيح يمثل عدد الثواني منذ 1900-01-01T00:00:00Z (أي منتصف ليل الأول من يناير عام 1900 بالتوقيت العالمي المنسق).
  • الوقت المُفكَّك هو مجموعة مرتبة من 9 قيم تمثل معًا وقتًا تقويميًا محددًا: الثواني، والدقائق، والساعة، ويوم الشهر، والشهر، والسنة، ويوم الأسبوع، وعلامة التوقيت الصيفي، والمنطقة الزمنية. (نناقشها بالتفصيل أدناه.)

التوقيت العالمي

لحساب الوقت العالمي الحالي يمكنك استخدام get-universal-time أو get-decoded-time. الأولى تُرجع عدد الثواني الحالي منذ 1900-01-01T00:00Z، والثانية تُرجع البيانات نفسها بالصيغة المُفكَّكة.

التوقيت المُفكَّك

decode-universal-time وencode-universal-time هما الدالتان الأساسيتان للتعامل مع الوقت. الأولى تأخذ وقتًا عالميًا وتُرجع قيمة وقت مُفكَّك على هيئة قيم متعددة، والثانية تأخذ قيم الوقت المُفكَّك كوسائط وتُرجع وقتًا عالميًا.

كلتاهما تأخذ وسيطًا اختياريًا هو المنطقة الزمنية. انظر أدناه لمعرفة صيغة المنطقة الزمنية.

الوقت المُفكَّك عبارة عن مجموعة من القيم:

  • الثواني: عدد صحيح بين 0 و59
  • الدقائق: عدد صحيح بين 0 و59
  • الساعة: عدد صحيح بين 0 و23
  • يوم الشهر: عدد صحيح بين 1 و31 (الحد الأعلى يعتمد في الواقع على الشهر والسنة كما هو واضح)
  • الشهر: عدد صحيح بين 1 و12
  • السنة: عدد صحيح يشير إلى السنة.
  • يوم الأسبوع: عدد صحيح بين 0 و6. 0 يعني الاثنين، و1 يعني الثلاثاء، وهكذا ... و6 يعني الأحد.
  • علامة التوقيت الصيفي: قيمة صحيحة تشير إلى أن التوقيت الصيفي سارٍ.
  • المنطقة الزمنية: عدد من الساعات بين -24 و24 يشير إلى الإزاحة عن التوقيت العالمي المنسق. العدد عدد نسبي ويجب أن يكون من مضاعفات 1/3600
(encode-universal-time 1 2 3 4 5 2000 0) ; => 3166398121
(decode-universal-time 3166398121)       ; => 1
                                         ;    2
                                         ;    3
                                         ;    4
                                         ;    5
                                         ;    2000
                                         ;    3 (Thursday)
                                         ;    NIL
                                         ;    0
(decode-universal-time 2208988800) ; => 0
                                   ;    0
                                   ;    0
                                   ;    1
                                   ;    1
                                   ;    1970
                                   ;    3
                                   ;    NIL
                                   ;    0

القيم المتعددة

في Common Lisp لا تقتصر الدالة على إرجاع قيمة واحدة، بل يمكنها إرجاع قيم متعددة. على سبيل المثال، floor التي تقرّب للأسفل نحو الصفر، تُرجع قيمتين: الأولى هي القيمة المقرّبة والثانية هي الباقي.

(floor 3.5) ; => 3
            ;    0.5

(سنعرض القيم المتعددة المُرجَعة على أسطر منفصلة في المخرجات.)

إرجاع قيم متعددة

إذا أردت أن تُرجع دالة قيمًا متعددة، استخدم أداة الوصول values:

(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
                ;    2
                ;    3

التعامل مع القيم المتعددة

إذا كنت تهتم بالقيمة الأولى فقط، فلا حاجة إلى أي إجراء خاص، فاللغة تتكفل بذلك:

(+ (values 1 2 3) (values 10 20 30)) ; => 11

لكن إذا أردت الوصول إلى تلك القيم الأخرى، فهناك عدة دوال ستحتاج إلى استخدامها. الماكروان الرئيسيان هما multiple-value-list وmultiple-value-bind. يُستخدمان لتغليف شيء يُرجع قيمًا متعددة والتقاط كل القيم. الأول يُنشئ قائمة بكل القيم. والثاني يتيح لك ربط المتغيرات بالقيم الفردية.

(multiple-value-list (values 1 2 3))                   ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3) 
   (+ a b c)) ; => 6

وثمة دالة مفيدة أخرى هي nth-value

التعليمات

فضائيو Lisp يحبون الاحتفال بالذكريات السنوية. وبالنسبة لهم، فإن تاريخ الذكرى السنوية المهم هو الجيجا ثانية. أي: 1,000,000,000 ثانية منذ وقوع الحدث.

1. احسب تاريخ ذكرى الجيجا ثانية

اكتب دالة from تأخذ 6 معاملات: year، month، day، hour، min، sec، وتحسب تاريخ ووقت ذكرى الجيجا ثانية. ينبغي أن تُرجع هذه الدالة التاريخ كمصفوفة بنفس ترتيب ودلالة معاملات الإدخال.

(from 2000 1 1 0 0 0) ; => (2031 9 9 1 46 40)
تعديل عبر GitHub يفتح الرابط في نافذة أو علامة تبويب جديدة
Common Lisp Exercism

مستعد لبدء ذكرى الجيجا ثانية؟

سجّل في Exercism لتتعلّم وتتقن Common Lisp عبر 27 مفهومًا92 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.