Καλώς ήρθες στο Factor! Το Factor είναι μια συνενωτική γλώσσα: αντί να καλείς συναρτήσεις όπως square(add(2, 3)), γράφεις μια σειρά από λέξεις από αριστερά προς τα δεξιά, 2 3 + square, που περνούν τιμές η μία στην άλλη μέσω μιας κοινής στοίβας δεδομένων. Φαντάσου μια στοίβα από κιβώτια φορτίου σε μια αποβάθρα, με το νεότερο στην κορυφή.
Ένα ! ξεκινά ένα σχόλιο γραμμής: το Factor αγνοεί τα πάντα, από το ! ως το τέλος της γραμμής. Τα παρακάτω παραδείγματα χρησιμοποιούν το ! για να σχολιάσουν τι κάνει ο κώδικας.
Όταν γράφεις ένα literal, το σπρώχνεις στην κορυφή της στοίβας. Ο κώδικας διαβάζεται από αριστερά προς τα δεξιά.
1 2 3 ! stack (bottom → top): 1 2 3
Κάθε λέξη διαβάζει τις εισόδους της από την κορυφή της στοίβας και γράφει εκεί πίσω τις εξόδους της. Η . βγάζει την πάνω τιμή και την τυπώνει· η .s τυπώνει ολόκληρη τη στοίβα χωρίς να καταναλώσει τίποτα, κάτι που είναι βολικό για να δεις τι άφησε πίσω του ένα απόσπασμα κώδικα.
Κάθε λέξη τεκμηριώνεται με μια επίδραση στη στοίβα της μορφής ( inputs -- outputs ). Είναι το συμβόλαιο της λέξης: η λέξη βγάζει τις εισόδους από την κορυφή της στοίβας και αφήνει τις εξόδους στη θέση τους. Τα ονόματα μέσα είναι τεκμηρίωση για ανθρώπους: η ίδια η στοίβα είναι θεσιακή, όχι ονομαστική. Η κορυφή της στοίβας είναι το όνομα στα δεξιά.
Το : ξεκινά έναν ορισμό λέξης, ακολουθεί η επίδραση στη στοίβα, μετά το σώμα και τέλος το ; τον κλείνει. Ο μεταγλωττιστής του Factor ελέγχει ότι το σώμα αφήνει πραγματικά αυτό που δηλώνει η επίδραση στη στοίβα.
: restow ( a b -- b a ) swap ;
Αυτές οι λέξεις του kernel αναδιατάσσουν την κορυφή της στοίβας χωρίς να κάνουν καμία αριθμητική πράξη: απλώς μετακινούν κιβώτια:
dup ( x -- x x ) ! copy the top crate
drop ( x -- ) ! remove the top crate
swap ( x y -- y x ) ! flip the top two
over ( x y -- x y x ) ! copy the second crate onto the top
nip ( x y -- y ) ! remove the second crate
rot ( x y z -- y z x ) ! roll the third crate up to the top
Χρησιμοποίησε την dup όταν ένα κιβώτιο πρέπει να τροφοδοτήσει δύο λέξεις, την drop για να πετάξεις ένα κιβώτιο, την swap όταν τα δύο πάνω είναι σε λάθος σειρά, την over ή την nip για να δουλέψεις με το κιβώτιο από κάτω, και την rot για να φέρεις στην κορυφή ένα θαμμένο κιβώτιο.
Η ευρύτερη οικογένεια (-rot, dupd, swapd, 2dup, …) ακολουθεί την ίδια ιδέα· αυτές τις λέξεις θα τις συναντήσεις αργότερα.
Οι λέξεις που γράφονται στη σειρά εκτελούνται από αριστερά προς τα δεξιά: κάθε λέξη δρα στη στοίβα που άφησε πίσω της η προηγούμενη λέξη. Να τι κάνει το swap nip στη στοίβα 1 2 (κάτω → πάνω), μία λέξη τη φορά:
1 2 ! 1 2 the starting crates
swap ! 2 1 swap flipped the top two
nip ! 1 nip dropped the 2nd-from-top crate (the 2)
Και να τι κάνει το dup rot στα ίδια αρχικά κιβώτια, πάλι μία λέξη τη φορά:
1 2 ! 1 2 the starting crates
dup ! 1 2 2 dup copied the top crate
rot ! 2 2 1 rot rolled the 3rd-from-top crate up to the top
Οι λέξεις χρησιμοποιούν lowercase-kebab-case: πεζά γράμματα ενωμένα με παύλες.
Είσαι ένας ναύτης που ξαναστοιβάζει κιβώτια φορτίου στην αποβάθρα. Κάθε εργασία είναι μία μόνο λέξη, το σώμα της οποίας χρησιμοποιεί μόνο λέξεις αναδιάταξης, χωρίς αριθμητική.
Όρισε τη λέξη swap-crates. Παίρνει δύο κιβώτια από τη στοίβα και τα αφήνει πίσω με αντίστροφη σειρά.
1 2 swap-crates .s
! 2
! 1
Όρισε τη λέξη clear-spill. Παίρνει τρία κιβώτια από τη στοίβα και αφήνει πίσω τα δύο κάτω, πετώντας το πάνω.
1 2 3 clear-spill .s
! 1
! 2
Όρισε τη λέξη peek-under. Παίρνει δύο κιβώτια από τη στοίβα και τα αφήνει πίσω με ένα αντίγραφο του κάτω κιβωτίου τοποθετημένο από πάνω.
1 2 peek-under .s
! 1
! 2
! 1
Όρισε τη λέξη tidy-deck. Παίρνει τρία κιβώτια από τη στοίβα, με τη σειρά x y z, και αφήνει πίσω z z y: πέτα το κάτω κιβώτιο και μετά άφησε δύο αντίγραφα του πάνω κιβωτίου να κάθονται κάτω από το μεσαίο.
1 2 3 tidy-deck .s
! 3
! 3
! 2
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Factor με 47 έννοιες163 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.