Τις περισσότερες φορές το Factor χειρίζεται την επανάληψη μέσω συνδυαστών όπως τα each, map και count. Μερικές φορές όμως, ο πιο καθαρός τρόπος να εκφράσεις έναν υπολογισμό είναι η αναδρομή: μια λέξη που καλεί τον εαυτό της.
Ένας ορισμός : μπορεί να καλέσει τον εαυτό του απευθείας:
: count-down ( n -- )
dup 0 = [ drop ] [ dup . 1 - count-down ] if ;
5 count-down
! prints 5 4 3 2 1
Το if-empty (στο sequences) είναι η φυσική βασική περίπτωση της αναδρομής:
if-empty ( seq emptyquot nonemptyquot -- )
{ 4 0 9 } [ "empty" ] [ "got data" ] if-empty .
! => "got data"
Το emptyquot εκτελείται αφού η (κενή) ακολουθία έχει ήδη καταναλωθεί· το nonemptyquot εκτελείται με την ακολουθία ακόμα στη στοίβα.
cond: μια αλυσίδα διακλαδώσεων με συνθήκεςΌταν η αναδρομή σου έχει περισσότερες από δύο περιπτώσεις, το cond (στο combinators) κρατάει τον κώδικα ευανάγνωστο:
: classify ( n -- label )
{
{ [ dup 0 < ] [ drop "negative" ] }
{ [ dup 0 = ] [ drop "zero" ] }
[ drop "positive" ]
} cond ;
DEFER:
Ένας ορισμός : μπορεί να καλέσει τον εαυτό του απευθείας, αλλά όταν δύο λέξεις καλούν η μία την άλλη, ο αναλυτής βλέπει την πρώτη πριν υπάρξει η δεύτερη. Το DEFER: δεσμεύει ένα όνομα ώστε ο πρώτος ορισμός να μπορεί να μεταγλωττιστεί:
DEFER: even?
: odd? ( n -- ? ) dup 0 = [ drop f ] [ 1 - even? ] if ;
: even? ( n -- ? ) dup 0 = [ drop t ] [ 1 - odd? ] if ;
Το DEFER: είναι επίσης χρήσιμο όταν μια βοηθητική λέξη διαβάζεται πιο φυσικά μετά τη λέξη που τη χρησιμοποιεί.
Κρατάς καθημερινές μετρήσεις για το πόσα πουλιά επισκέπτονται τον κήπο σου. Τα δεδομένα αποθηκεύονται ως πίνακας ακεραίων, με πρώτη τη σημερινή μέτρηση.
Όρισε τη today ώστε να παίρνει από τη στοίβα έναν πίνακα με τις καθημερινές μετρήσεις και να επιστρέφει τη σημερινή μέτρηση, ή f αν ο πίνακας είναι κενός.
{ 2 5 1 } today .
! => 2
{ } today .
! => f
Όρισε τη increment-day-count ώστε να επιστρέφει έναν νέο πίνακα με τη σημερινή μέτρηση αυξημένη κατά ένα. Αν η είσοδος είναι κενή, επέστρεψε { 1 }.
{ 4 0 2 } increment-day-count .
! => { 5 0 2 }
{ } increment-day-count .
! => { 1 }
Όρισε τη has-day-without-birds? ώστε να επιστρέφει t αν τουλάχιστον μία μέρα κατέγραψε μηδέν πουλιά, αλλιώς f.
Χρησιμοποίησε αναδρομή αντί για any? ή άλλες λέξεις ανώτερης τάξης για ακολουθίες.
{ 2 0 4 } has-day-without-birds? . ! => t
{ 3 8 1 5 } has-day-without-birds? . ! => f
Όρισε τη total ώστε να επιστρέφει το άθροισμα όλων των μετρήσεων.
Χρησιμοποίησε αναδρομή αντί για sum.
{ 4 0 9 0 5 } total .
! => 18
Μια πολυάσχολη μέρα είναι αυτή με πέντε ή περισσότερα πουλιά. Όρισε τη busy-days ώστε να επιστρέφει τον αριθμό των πολυάσχολων ημερών.
Χρησιμοποίησε αναδρομή αντί για count.
{ 4 5 0 0 6 } busy-days .
! => 2
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Factor με 47 έννοιες163 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.