Στη Common Lisp ο χρόνος αναπαρίσταται με τέσσερις τρόπους, από τους οποίους δύο θα μας απασχολήσουν εδώ.
1900-01-01T00:00:00Z (δηλαδή τα μεσάνυχτα της 1ης Ιανουαρίου 1900 σε UTC).Για να πάρεις την τρέχουσα καθολική ώρα χρησιμοποιείς τη get-universal-time ή τη get-decoded-time.
Η πρώτη επιστρέφει τα τρέχοντα δευτερόλεπτα από το 1900-01-01T00:00Z και η δεύτερη επιστρέφει τα ίδια δεδομένα σε αποκωδικοποιημένη μορφή.
Οι decode-universal-time και encode-universal-time είναι οι βασικές συναρτήσεις για την εργασία με τον χρόνο.
Η πρώτη παίρνει μια καθολική ώρα και επιστρέφει μια αποκωδικοποιημένη τιμή χρόνου ως multiple-values και η δεύτερη παίρνει τις αποκωδικοποιημένες τιμές χρόνου ως ορίσματα και επιστρέφει μια καθολική ώρα.
Και οι δύο δέχονται ένα προαιρετικό όρισμα ζώνης ώρας. Δες παρακάτω τη μορφή της ζώνης ώρας.
Ένας αποκωδικοποιημένος χρόνος είναι ένα σύνολο τιμών:
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 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.