Η αντιστοίχιση αναφέρεται στην εφαρμογή μιας συνάρτησης σε κάθε στοιχείο μιας ακολουθίας, ώστε να προκύψει μια νέα ακολουθία.
Αυτό μπορεί να γίνει εύκολα σε μια λίστα με τη συνάρτηση mapcar.
Ας υποθέσουμε ότι έχουμε μια συνάρτηση double που πολλαπλασιάζει το όρισμά της με το 2:
(mapcar #'double '(1 2 3 4)) ; => (2 4 6 8)
Παρατήρησε ότι το πρώτο όρισμα είναι μια συνάρτηση που θα κληθεί. Το #' είναι μια ειδική σύνταξη παράθεσης που καθορίζει μια συνάρτηση.
Η double κλήθηκε πρώτα με το πρώτο στοιχείο, μετά με το δεύτερο, κ.ο.κ.
Τα αποτελέσματα συγκεντρώθηκαν σε μια λίστα, η οποία είναι η τιμή στην οποία αποτιμάται η παράσταση.
Το φιλτράρισμα είναι η διαδικασία δημιουργίας μιας ακολουθίας από μια άλλη ακολουθία, αντιγράφοντας όλα τα στοιχεία της αρχικής ακολουθίας εκτός από ορισμένα. Η επιλογή των στοιχείων που θα συμπεριληφθούν στη νέα ακολουθία μπορεί να γίνει με μια συνάρτηση κατηγόρημα, δηλαδή μια συνάρτηση που αποτιμάται σε τιμή boolean (λογική τιμή), ή με έλεγχο ισότητας με ένα συγκεκριμένο αντικείμενο.
Η remove-if είναι μια συνάρτηση που παίρνει ως ορίσματα μια συνάρτηση κατηγόρημα και μια ακολουθία, και επιστρέφει μια ακολουθία με μόνο εκείνα τα στοιχεία για τα οποία το κατηγόρημα αποτιμήθηκε σε ψευδή τιμή.
Με άλλα λόγια, "αφαιρεί" όλα τα στοιχεία της ακολουθίας για τα οποία το κατηγόρημα αποτιμάται σε αληθή τιμή. Ωστόσο, πρόσεξε ότι αυτή η συνάρτηση δεν τροποποιεί την αρχική ακολουθία!
Αντ' αυτού, επιστρέφει μια νέα ακολουθία χωρίς τα αντίστοιχα στοιχεία. Αν το κατηγόρημα ήταν αληθές για όλες τις τιμές, τότε επιστρέφεται μια κενή ακολουθία.
(remove-if #'evenp '(1 2 3 4 5)) ; => (1 3 5)
(remove-if #'oddp '(1 3 5)) ; => ()
Αν θέλεις να αφαιρέσεις ένα συγκεκριμένο στοιχείο από μια ακολουθία, μπορείς να χρησιμοποιήσεις τη remove, η οποία παίρνει το στοιχείο προς αφαίρεση και μια ακολουθία.
Επιστρέφονται όλες οι τιμές της ακολουθίας που δεν είναι ίσες με το στοιχείο προς αφαίρεση.
ΣΗΜΕΙΩΣΗ: Η ισότητα ελέγχεται από προεπιλογή με το eql, το γενικό κατηγόρημα ισότητας.
(remove 1 '(1 2 1 3 1 4)) ; => (2 3 4)
(remove #\l "hello") ; => "heo"
Η Lucy, η εξωγήινη της Lisp, αγαπάει τους αριθμούς και πιστεύει ότι μερικοί από αυτούς είναι "υπέροχοι".
Σου ζητάει να τη βοηθήσεις να γράψει συναρτήσεις που κάνουν τους αριθμούς πιο υπέροχους.
Το τι θεωρεί η Lucy υπέροχο έναν αριθμό μπορεί να αλλάξει, οπότε οι συναρτήσεις θα πρέπει να είναι ευέλικτες.
Για να μετατρέψεις μια λίστα αριθμών σε μια λίστα με πιο υπέροχους αριθμούς, θα χρειαστεί να γράψεις μια συνάρτηση make-magnificent-maybe που παίρνει μια συνάρτηση για εφαρμογή στους αριθμούς και μια λίστα αριθμών.
Θα πρέπει να αξιολογείται σε μια λίστα αριθμών που είναι πιο υπέροχοι (σύμφωνα με τη συνάρτηση που δίνεις).
(make-magnificent-maybe #'square '(1 2 3)) ; => (1 4 9)
(make-magnificent-maybe #'1+ '(1 2 3)) ; => (2 3 4)
Αφού (ελπίζουμε) κάνει τους αριθμούς πιο υπέροχους, η Lucy θέλει να δει μόνο τους αριθμούς που είναι πραγματικά υπέροχοι.
Ξέρει σίγουρα ότι το 1 ποτέ δεν είναι υπέροχο, οπότε θα χρειαστεί απλώς να το αφαιρέσεις.
Αλλά κατά τα άλλα, η Lucy αλλάζει γνώμη καμιά φορά, οπότε και πάλι θα σου δώσει μια συνάρτηση που θα σου πει αν ένας αριθμός είναι υπέροχος ή όχι.
Θα χρειαστεί να γράψεις μια συνάρτηση only-the-best που παίρνει μια συνάρτηση και μια λίστα αριθμών και επιστρέφει μόνο τους καλύτερους αριθμούς (όχι το 1 και όχι αριθμούς για τους οποίους η συνάρτηση αξιολογείται ως αληθής).
(only-the-best #'evenp '(1 2 3 4 5)) ; => (3 5)
(only-the-best #'oddp '(1 3 5)) ; => ()
Γράψου στο Exercism για να μάθεις και να κατακτήσεις Common Lisp με 27 έννοιες92 ασκήσεις και πραγματική καθοδήγηση από ανθρώπους, όλα δωρεάν.