Διαδρομές
/
Common Lisp
Common Lisp
/
Ύλη
/
Πολλαπλές τιμές
Πο

Πολλαπλές τιμές σε Common Lisp

3 ασκήσεις

Σχετικά με την έννοια Πολλαπλές τιμές

Στη Common Lisp μια συνάρτηση δεν μπορεί να επιστρέψει μόνο μία τιμή, αλλά μπορεί να επιστρέψει πολλαπλές τιμές. Για παράδειγμα η floor, η οποία στρογγυλοποιεί προς τα κάτω, προς το μηδέν, επιστρέφει δύο τιμές: η πρώτη είναι η στρογγυλοποιημένη τιμή και η δεύτερη το υπόλοιπο.

(floor 3.5) ; => 3
            ;    0.5

(Θα δείχνουμε τις πολλαπλές τιμές που επιστρέφονται σε ξεχωριστές γραμμές της εξόδου.)

Επιστροφή πολλαπλών τιμών

Αν θέλεις μια συνάρτηση να επιστρέφει πολλαπλές τιμές, χρησιμοποιείς τον accessor values:

(defun three-numbers () (values 1 2 3))
(three-numbers) ; => 1
                ;    2
                ;    3

Αν έχεις μια λίστα με τιμές που θέλεις να επιστρέψεις, τότε μπορείς να χρησιμοποιήσεις τη value-list:

(values-list '(a b c)) ; => a
                       ;    b
                       ;    c

Χειρισμός πολλαπλών τιμών

Αν σε ενδιαφέρει μόνο η πρώτη τιμή, τότε δεν χρειάζεται να κάνεις τίποτα το ιδιαίτερο. Η γλώσσα το αναλαμβάνει η ίδια:

(+ (values 1 2 3) (values 10 20 30)) ; => 11

Ωστόσο, αν θέλεις να έχεις πρόσβαση και στις άλλες τιμές, υπάρχουν αρκετές συναρτήσεις που θα χρειαστεί να χρησιμοποιήσεις.

Οι δύο βασικές μακροεντολές είναι οι multiple-value-list και multiple-value-bind. Χρησιμοποιούνται για να τυλίξουν κάτι που επιστρέφει πολλαπλές τιμές και να συλλάβουν όλες τις τιμές. Η πρώτη δημιουργεί μια λίστα με όλες τις τιμές. Η δεύτερη σου επιτρέπει να δεσμεύσεις μεταβλητές στις επιμέρους τιμές.

(multiple-value-list (values 1 2 3))                   ; => (1 2 3)
(multiple-value-bind (a b c) (values 1 2 3) 
   (+ a b c)) ; => 6

Σημείωσε ότι οι μεταβλητές a, b και c έχουν εμβέλεια μόνο μέσα στο multiple-values-bind.

Άλλη μια χρήσιμη μακροεντολή είναι η nth-value. Αυτή μοιάζει με τη nth για τις λίστες, με την έννοια ότι επιστρέφει το ν-οστό στοιχείο από ένα σύνολο πολλαπλών τιμών:

(nth-value 0 (values 1 2 3 )) ; => 1
(nth-value 1 (values 1 2 3 )) ; => 2
(nth-value 2 (values 1 2 3 )) ; => 3
Επεξεργασία μέσω GitHub Ο σύνδεσμος ανοίγει σε νέο παράθυρο ή καρτέλα

Μάθε την έννοια Πολλαπλές τιμές

Η εξάσκηση είναι κλειδωμένη

Ξεκλείδωσε 1 ακόμη άσκηση για να εξασκηθείς στην έννοια Πολλαπλές τιμές