Διαδρομές
/
Common Lisp
Common Lisp
/
Ασκήσεις
/
Τα λαζάνια της Lilly
Τα λαζάνια της Lilly

Τα λαζάνια της Lilly

Άσκηση εκμάθησης

Εισαγωγή

Συναρτήσεις

Για να ορίσεις μια καθολική συνάρτηση στην Common Lisp, χρησιμοποιείς την έκφραση defun. Αυτή η έκφραση παίρνει ως πρώτο όρισμα μια λίστα παραμέτρων (μια κενή λίστα σημαίνει ότι η συνάρτηση δεν έχει παραμέτρους). Ακολουθεί προαιρετικά μια συμβολοσειρά τεκμηρίωσης (δείτε παρακάτω) και έπειτα μηδέν ή περισσότερες εκφράσεις που αποτελούν το "σώμα" της συνάρτησης.

Οι συναρτήσεις μπορούν να έχουν μηδέν ή περισσότερες παραμέτρους.

(defun no-args () (+ 1 1))

(defun add-one (x) (1+ x))

(defun add-nums (x y) (+ x y))

Καλείς μια συνάρτηση αξιολογώντας μια έκφραση που έχει ως πρώτο στοιχείο το σύμβολο που ορίζει τη συνάρτηση και ως υπόλοιπα στοιχεία τα ορίσματα της συνάρτησης (αν υπάρχουν).

Η τιμή στην οποία αξιολογείται μια συνάρτηση είναι η τιμή της τελευταίας έκφρασης που αξιολογήθηκε στο σώμα της συνάρτησης. Όλες οι συναρτήσεις αξιολογούνται σε μια τιμή.

(add-nums 2 2) ;; => 4

Οι συναρτήσεις μπορούν επίσης να έχουν, προαιρετικά, μια συμβολοσειρά τεκμηρίωσης (που ονομάζεται και "docstring"). Αν δοθεί, έρχεται μετά τη λίστα ορισμάτων αλλά πριν από το σώμα της συνάρτησης. Μπορείς να έχεις πρόσβαση στη συμβολοσειρά τεκμηρίωσης μέσω του documentation.

(defun add-nums (x y) "Add X and Y together" (+ x y))

(documentation 'add-nums 'function) ;; => "Add X and Y together"

;; Note that if one provides a docstring but fails to provide a body
;; then the docstring is interpreted by Common Lisp as the body, not
;; the docstring
(defun no-body ())
(no-body) ;; => NIL

(defun mistake () "This is not a docstring")
(mistake) ;; => "This is not a docstring"
(documentation 'mistake 'function) ;; => NIL

Οδηγίες

Η Lilly η Lisp Alien επέστρεψε και μαγειρεύει ξανά! Αυτή τη φορά θα φτιάξει τα Λαζάνια Lisp Alien, που δεν διαφέρουν και τόσο από τα ανθρώπινα λαζάνια.

Η Lilly θα χρειαστεί μερικές συναρτήσεις για να υπολογίσει τον χρόνο ψησίματος των λαζανιών. Και καθεμία από αυτές χρειάζεται καλή τεκμηρίωση, ώστε η Lilly να μη ξεχάσει τι κάνει η καθεμία.

Μπορείς να βοηθήσεις τη Lilly να γράψει συναρτήσεις που θα τη βοηθήσουν να υπολογίσει τον χρόνο ψησίματος των λαζανιών;

1. Όρισε τον αναμενόμενο χρόνο στον φούρνο σε λεπτά

Όρισε τη συνάρτηση expected-time-in-oven που δεν παίρνει καμία παράμετρο και επιστρέφει πόσα λεπτά πρέπει να μείνουν τα λαζάνια στον φούρνο. Σύμφωνα με την παράδοση των Lisp Alien (όπως ακριβώς μαγείρευε και η γονική μονάδα της Lilly), ο αναμενόμενος χρόνος στον φούρνο σε λεπτά είναι 337:

(expected-time-in-oven) ;; => 337

2. Υπολόγισε τον χρόνο που απομένει στον φούρνο σε λεπτά

Όρισε τη συνάρτηση remaining-minutes-in-oven που παίρνει ως παράμετρο τα πραγματικά λεπτά που τα λαζάνια βρίσκονται ήδη στον φούρνο και επιστρέφει πόσα λεπτά πρέπει ακόμη να μείνουν τα λαζάνια στον φούρνο, με βάση τον αναμενόμενο χρόνο στον φούρνο σε λεπτά από την προηγούμενη εργασία.

(remaining-minutes-in-oven 100) ;; => 237

3. Υπολόγισε τον χρόνο προετοιμασίας σε λεπτά

Όρισε τη συνάρτηση preparation-time-in-minutes που παίρνει ως παράμετρο τον αριθμό των στρώσεων που πρόσθεσε η Lilly στα λαζάνια και επιστρέφει πόσα λεπτά πέρασε η Lilly προετοιμάζοντας τα λαζάνια, υποθέτοντας ότι κάθε στρώση θέλει 19 λεπτά για να ετοιμαστεί.

(preparation-time-in-minutes 3) ;; => 57

4. Υπολόγισε τον χρόνο που έχει περάσει σε λεπτά

Όρισε τη συνάρτηση elapsed-time-in-minutes που παίρνει δύο παραμέτρους: η πρώτη παράμετρος είναι ο αριθμός των στρώσεων που πρόσθεσε η Lilly στα λαζάνια και η δεύτερη παράμετρος είναι ο αριθμός των λεπτών που τα λαζάνια βρίσκονται στον φούρνο. Η συνάρτηση πρέπει να επιστρέφει πόσα λεπτά έχει αφιερώσει η Lilly στο μαγείρεμα των λαζανιών, δηλαδή το άθροισμα του χρόνου προετοιμασίας σε λεπτά και του χρόνου σε λεπτά που τα λαζάνια έχουν περάσει στον φούρνο εκείνη τη στιγμή.

(elapsed-time-in-minutes 3 100) ;; => 157
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα
Common Lisp Exercism

Έτοιμος να ξεκινήσεις την άσκηση Τα λαζάνια της Lilly;

Γράψου στο Exercism για να μάθεις και να κατακτήσεις Common Lisp με 27 έννοιες92 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.