在 Common Lisp 中,時間有四種表示方式,這裡會介紹其中兩種。
1900-01-01T00:00:00Z(也就是 UTC 時間 1900 年 1 月 1 日的午夜)起算的秒數。要取得目前的通用時間,可以使用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)