Στην Common Lisp, όπως και σε άλλες γλώσσες, ένας πίνακας είναι ένα σύνολο στοιχείων στα οποία έχεις πρόσβαση μέσω ακέραιων θέσεων. Οι τύποι των στοιχείων μπορούν να είναι ετερογενείς. Ο πίνακας μπορεί να είναι πολυδιάστατος (όχι απλώς μονοδιάστατος).
Το make-array σου επιτρέπει να δημιουργήσεις πίνακες.
Έχει πολλές επιλογές, αλλά οι απλούστερες μορφές του σου επιτρέπουν να δημιουργήσεις N-διάστατους πίνακες με όλα τα στοιχεία αρχικοποιημένα σε μία μόνο τιμή ή με τον πίνακα αρχικοποιημένο στις τιμές μιας άλλης ακολουθίας (όπως μιας λίστας).
Το πρώτο όρισμά του είναι μια λίστα με το μέγεθος κάθε διάστασης.
(make-array '(4) :initial-element 3) ; => #(3 3 3 3)
(make-array '(2 2) :initial-element 'x) ; => #2A((X X) (X X))
(make-array '(3 3 3)
:initial-contents '(((a b c) (d e f) (g h i))
((j k l) (m n o) (p q r))
((s t u) (v w x) (y z &))))
; => #3A(((A B C) (D E F) (G H I))
((J K L) (M N O) (P Q R))
((S T U) (V W X) (Y Z &)))
(Παρατήρησε πώς οι N-διάστατοι πίνακες εκτυπώνονται με τον αριθμό των διαστάσεων.)
Οι πίνακες μπορούν επίσης να δημιουργηθούν χρησιμοποιώντας την ίδια μορφή με την οποία εκτυπώνονται:
#(x y z) ; => #(X Y Z)
#2A((1 2) (3 4)) ; => #2A((1 2) (3 4))
Για να έχεις πρόσβαση σε στοιχεία ενός διανύσματος, χρησιμοποίησε το aref. Οι θέσεις ξεκινούν από το μηδέν.
Ο αριθμός των θέσεων που δίνεις πρέπει να αντιστοιχεί στον βαθμό του πίνακα.
(aref #2A((1 2 3) (3 4 5)) 1 0) ; => 3
(aref #3A(((a b) (c d))
((e f) (g h))
((t u) (v w)))
2 0 1) ; => U
(aref #2A((1) (2)) 0) ; => ERROR (because not enough indexes provided)
Επίσης, οι θέσεις που δίνεις πρέπει να είναι "εντός ορίων" με βάση τις διαστάσεις που δόθηκαν όταν δημιουργήθηκε ο πίνακας.
Αυτό μπορεί να ελεγχθεί με το array-in-bounds-p:
(array-in-bounds-p #2A((1) (2)) 0 0) ; => T
(array-in-bounds-p #2A((1) (2)) 2 0) ; => NIL
Ένα στοιχείο μπορεί επίσης να προσπελαστεί με το row-major-aref, το οποίο δέχεται έναν μόνο ακέραιο που καθορίζει το στοιχείο σε διάταξη κατά γραμμές.
(Η θέση κατά γραμμές μπορεί να υπολογιστεί από τις θέσεις μέσω του array-row-major-index.)
(array-row-major-index #2A((1 2 3) (4 5 6)) 1 1 ) ; => 4
(row-major-aref #2A((1 2 3) (4 5 6)) 4) ; => 5
Για να προσδιορίσεις αν ένα αντικείμενο είναι πίνακας, μπορείς να χρησιμοποιήσεις το arrayp.
(arrayp #(1 2 3)) ; => T
(arrayp #2((1 2 3) (4 5 6))) ; => T
(arrayp (list 1 2 3)) ; => NIL
Διάφορες πληροφορίες για έναν πίνακα μπορούν να ανακτηθούν με τις παρακάτω συναρτήσεις:
array-rank για να πάρεις τον αριθμό των διαστάσεων του πίνακα (αναφέρεται ως ο βαθμός του πίνακα).array-dimensions για να πάρεις μια λίστα με τα μεγέθη των διαστάσεων του πίνακα.array-dimension για να πάρεις το μέγεθος μιας από τις διαστάσεις.array-total-size για να πάρεις τον συνολικό αριθμό στοιχείων στον πίνακα.(let ((array #3A(((0 1) (2 3) (4 5))
((6 7) (8 9) (A B))
((C D) (E F) (G H))
((I J) (K L) (M N)))))
(list (array-rank array)
(array-dimensions array)
(array-dimension array 1)
(array-total-size array))) ; => (3 (4 3 2) 2 24)
Το Πρότυπο της Common Lisp ορίζει κάποια όρια στο μέγιστο μέγεθος των πινάκων. Αυτά τα όρια είναι διαθέσιμα σε κάποιες καθορισμένες σταθερές:
array-rank-limit: ο μέγιστος επιτρεπόμενος αριθμός διαστάσεων ενός πίνακα (ορίζεται ότι δεν είναι μικρότερος από 8).array-dimension-limit: το μέγιστο μέγεθος οποιασδήποτε διάστασης (ορίζεται ότι δεν είναι μικρότερο από 1024).array-total-size-limit: ο μέγιστος αριθμός στοιχείων οποιουδήποτε πίνακα (ορίζεται ότι δεν είναι μικρότερος από 1024).