في Common Lisp يُمثَّل الوقت بأربعة أساليب، وسنتطرق هنا إلى اثنين منها.
1900-01-01T00:00:00Z (أي منتصف ليل الأول من يناير عام 1900 بالتوقيت العالمي المنسق).لحساب الوقت العالمي الحالي يمكنك استخدام get-universal-time أو get-decoded-time.
الأولى تُرجع عدد الثواني الحالي منذ 1900-01-01T00:00Z، والثانية تُرجع البيانات نفسها بالصيغة المُفكَّكة.
decode-universal-time وencode-universal-time هما الدالتان الأساسيتان للتعامل مع الوقت.
الأولى تأخذ وقتًا عالميًا وتُرجع قيمة وقت مُفكَّك على هيئة قيم متعددة، والثانية تأخذ قيم الوقت المُفكَّك كوسائط وتُرجع وقتًا عالميًا.
كلتاهما تأخذ وسيطًا اختياريًا هو المنطقة الزمنية. انظر أدناه لمعرفة صيغة المنطقة الزمنية.
الوقت المُفكَّك عبارة عن مجموعة من القيم:
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 ثانية منذ وقوع الحدث.
اكتب دالة from تأخذ 6 معاملات: year، month، day، hour، min، sec، وتحسب تاريخ ووقت ذكرى الجيجا ثانية.
ينبغي أن تُرجع هذه الدالة التاريخ كمصفوفة بنفس ترتيب ودلالة معاملات الإدخال.
(from 2000 1 1 0 0 0) ; => (2031 9 9 1 46 40)
سجّل في Exercism لتتعلّم وتتقن Common Lisp عبر 27 مفهومًا92 تمرينًا، وإرشاد بشري حقيقي، وكل ذلك مجانًا.