مسیرها
/
Common Lisp
Common Lisp
/
تمرین‌ها
/
سالگرد گیگاثانیه
سالگرد گیگاثانیه

سالگرد گیگاثانیه

تمرین یادگیری

مقدمه

تاریخ و زمان

در Common Lisp زمان به چهار شکل نمایش داده می‌شود که در اینجا به دو مورد از آن‌ها می‌پردازیم.

  • زمان جهانی یک زمان مطلق است: عددی که تعداد ثانیه‌های گذشته از 1900-01-01T00:00:00Z را نشان می‌دهد (یعنی نیمه‌شب اول ژانویه‌ی ۱۹۰۰ به وقت UTC).
  • زمان رمزگشایی‌شده یک تاپل از ۹ مقدار است که با هم یک زمان تقویمی مشخص را نمایش می‌دهند: ثانیه، دقیقه، ساعت، روزِ ماه، ماه، سال، روزِ هفته، پرچم ساعت تابستانی، منطقه‌ی زمانی. (در ادامه به‌تفصیل بررسی می‌شود.)

زمان جهانی

برای گرفتن زمان جهانی کنونی، از get-universal-time یا get-decoded-time استفاده می‌کنید. اولی تعداد ثانیه‌های کنونی از 1900-01-01T00:00Z را برمی‌گرداند و دومی همان داده‌ها را در قالب رمزگشایی‌شده برمی‌گرداند.

زمان رمزگشایی‌شده

decode-universal-time و encode-universal-time توابع اصلی کار با زمان‌اند. اولی یک زمان جهانی می‌گیرد و یک مقدار زمان رمزگشایی‌شده را به‌صورت مقادیر چندگانه برمی‌گرداند و دومی مقادیر زمان رمزگشایی‌شده را به‌عنوان ورودی می‌گیرد و یک زمان جهانی برمی‌گرداند.

هر دو یک ورودی اختیاری برای منطقه‌ی زمانی می‌گیرند. قالب منطقه‌ی زمانی را در ادامه ببینید.

زمان رمزگشایی‌شده مجموعه‌ای از مقادیر است:

  • ثانیه: عددی بین ۰ و ۵۹
  • دقیقه: عددی بین ۰ و ۵۹
  • ساعت: عددی بین ۰ و ۲۳
  • روزِ ماه: عددی بین ۱ و ۳۱ (که حد بالای آن، بدیهی است که به ماه و سال بستگی دارد)
  • ماه: عددی بین ۱ و ۱۲
  • سال: عددی که سال را نشان می‌دهد.
  • روزِ هفته: عددی بین ۰ و ۶. ۰ یعنی دوشنبه، ۱ یعنی سه‌شنبه و به همین ترتیب... ۶ یعنی یکشنبه.
  • پرچم ساعت تابستانی: مقدار «درست» نشان می‌دهد که ساعت تابستانی فعال است.
  • منطقه‌ی زمانی: عددی بر حسب ساعت بین -۲۴ و ۲۴ که اختلاف با UTC را نشان می‌دهد. این عدد، عددی گویا است و باید مضربی از 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. محاسبه‌ی تاریخ سالگرد گیگاثانیه

تابعی به اسم from بنویسید که ۶ پارامتر می‌گیرد: 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 تمرین و مربی‌گری انسانی واقعی یاد بگیرید و در آن استاد شوید، همه‌ی این‌ها رایگان.