Στο Cargo Shuffle γνώρισες τη στοίβα δεδομένων του Factor και τις λέξεις αναδιάταξης που την ανακατεύουν. Αυτή η άσκηση χτίζει πάνω σε αυτό: θα ορίσεις λέξεις που υπολογίζουν με τις εισόδους τους αντί να τις μετακινούν απλώς.
Ένα ! ξεκινά ένα σχόλιο γραμμής: ο Factor αγνοεί τα πάντα, από το ! μέχρι το τέλος της γραμμής. Τα παρακάτω παραδείγματα χρησιμοποιούν το ! και για να σχολιάσουν τι κάνει ο κώδικας και για να δείξουν τι θα τύπωνε.
Μια λέξη είναι το όνομα που δίνει ο Factor σε μια συνάρτηση. Η κλήση μιας λέξης βγάζει κάποιες τιμές από την κορυφή της στοίβας και βάζει κάποιες τιμές πίσω. Η . βγάζει την πάνω τιμή και την τυπώνει· οι λέξεις ακέραιας αριθμητικής +, -, * βγάζουν δύο αριθμούς και βάζουν το αποτέλεσμα:
2 3 + . ! prints 5
8 3 - . ! prints 5 (8 - 3, not 3 - 8)
2 3 * . ! prints 6
Μια συγγενική λέξη, η .s, τυπώνει ολόκληρη τη στοίβα δεδομένων χωρίς να καταναλώνει τίποτα. Είναι βολική στον listener (το διαδραστικό περιβάλλον του Factor, όπου πληκτρολογείς κώδικα και βλέπεις αποτελέσματα) για να δεις τι αφήνει πίσω του ένα απόσπασμα κώδικα. Γι' αυτό τα παρακάτω παραδείγματα τελειώνουν μερικές φορές σε .s αντί για .: αφήνουν πάνω από μία τιμή στη στοίβα και η .s τις δείχνει όλες.
Οι αριθμητικές λέξεις βρίσκονται στο λεξιλόγιο math, οπότε ένα αρχείο που τις χρησιμοποιεί χρειάζεται το math στη γραμμή USING: του.
Κάθε λέξη τεκμηριώνεται με ένα αποτέλεσμα στοίβας της μορφής ( inputs -- outputs ). Είναι το συμβόλαιο της λέξης: βγάζει τις εισόδους από την κορυφή της στοίβας και αφήνει τις εξόδους στη θέση τους. Τα ονόματα μέσα υπάρχουν μόνο για να σε βοηθήσουν να το διαβάσεις. Ο Factor δεν τα χρησιμοποιεί: παρακολουθεί μόνο τη σειρά με την οποία κάθονται οι τιμές στη στοίβα.
! + is specified as ( x y -- sum )
! . is specified as ( x -- )
Η κορυφή της στοίβας είναι η δεξιά είσοδος. Έτσι, στο 8 3 - το 3 βρίσκεται στην κορυφή, το αποτέλεσμα στοίβας είναι ( x y -- difference ) και το αποτέλεσμα είναι 8 - 3.
Ένα ? στο τέλος των εξόδων είναι η σύμβαση για "ένα boolean", αλλά η άσκηση lasagna χρησιμοποιεί μόνο αριθμούς.
Μια λέξη αναδιάταξης από το Cargo Shuffle εμφανίζεται παρακάτω: η swap ( x y -- y x ), που αντιστρέφει τις δύο πάνω τιμές όταν βρίσκονται σε λάθος σειρά για την επόμενη λέξη.
Το : ξεκινά έναν ορισμό λέξης, ακολουθεί το αποτέλεσμα στοίβας, μετά το σώμα και στο τέλος το ; τον κλείνει.
: square ( x -- x^2 ) dup * ;
4 square . ! => 16
Ο μεταγλωττιστής του Factor ελέγχει ότι το σώμα ταιριάζει πραγματικά με το δηλωμένο αποτέλεσμα στοίβας: μια λέξη που δηλώνει ( x -- y ) αλλά αφήνει μηδέν ή δύο τιμές στη στοίβα δεν θα μεταγλωττιστεί.
Το CONSTANT: ορίζει ένα όνομα για μια σταθερή τιμή. Η ίδια η σταθερά είναι μια λέξη: όταν την καλείς, βάζει την τιμή στη στοίβα:
CONSTANT: pi 3
pi pi * . ! => 9
Το CONSTANT: είναι βασική σύνταξη και δεν χρειάζεται γραμμή USING:. Βάλε τις σταθερές στην αρχή του αρχείου, πριν από κάθε λέξη που τις χρησιμοποιεί.
Το σώμα μιας λέξης μπορεί να καλέσει οποιαδήποτε λέξη βρίσκεται ήδη σε εμβέλεια, ακόμη και εκείνες που όρισες νωρίτερα στο ίδιο αρχείο:
: double ( x -- 2x ) 2 * ;
: quadruple ( x -- 4x ) double double ;
5 quadruple . ! => 20
Έτσι η τελευταία εργασία της άσκησης επαναχρησιμοποιεί μια προηγούμενη.
Και οι λέξεις και οι σταθερές χρησιμοποιούν lowercase-kebab-case: πεζά γράμματα ενωμένα με παύλες (για παράδειγμα, expected-bake-time, preparation-time).
Σε αυτή την άσκηση θα γράψεις κώδικα για να σε βοηθήσει να μαγειρέψεις καταπληκτικά λαζάνια από το αγαπημένο σου βιβλίο μαγειρικής.
Έχεις τέσσερις εργασίες, όλες σχετικές με τον χρόνο που περνάς μαγειρεύοντας τα λαζάνια.
Όρισε τη σταθερά expected-bake-time, η οποία πρέπει να επιστρέφει
πόσα λεπτά χρειάζονται τα λαζάνια για να ψηθούν στον φούρνο.
Σύμφωνα με το βιβλίο μαγειρικής, τα λαζάνια πρέπει να μείνουν στον φούρνο συνολικά 40 λεπτά.
expected-bake-time .
! => 40
Όρισε τη λέξη preparation-time. Παίρνει από τη στοίβα τον αριθμό
των στρώσεων που πρόσθεσες στα λαζάνια και αφήνει πίσω πόσα λεπτά
πέρασες προετοιμάζοντάς τα, υποθέτοντας ότι κάθε στρώση θέλει 2 λεπτά
για να ετοιμαστεί.
4 preparation-time .
! => 8
Όρισε τη λέξη remaining-time. Παίρνει τον αριθμό των λεπτών που τα
λαζάνια έχουν ήδη περάσει στον φούρνο και αφήνει πίσω πόσα λεπτά
πρέπει να μείνουν ακόμα εκεί.
25 remaining-time .
! => 15
Όρισε τη λέξη total-working-time. Παίρνει δύο ορίσματα από τη
στοίβα (πρώτα τον αριθμό των στρώσεων στα λαζάνια και μετά τον αριθμό
των λεπτών που τα λαζάνια βρίσκονται ήδη στον φούρνο) και αφήνει πίσω
τον συνολικό χρόνο μαγειρέματος μέχρι τώρα: τον χρόνο προετοιμασίας
συν τον χρόνο που έχουν ήδη περάσει στον φούρνο.
3 20 total-working-time .
! => 26
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Factor με 47 έννοιες163 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.