LISP - Mảng
LISP cho phép bạn xác định mảng đơn hoặc mảng nhiều chiều bằng cách sử dụng make-arraychức năng. Một mảng có thể lưu trữ bất kỳ đối tượng LISP nào dưới dạng các phần tử của nó.
Tất cả các mảng bao gồm các vị trí bộ nhớ liền kề. Địa chỉ thấp nhất tương ứng với phần tử đầu tiên và địa chỉ cao nhất cho phần tử cuối cùng.
Số thứ nguyên của một mảng được gọi là thứ hạng của nó.
Trong LISP, một phần tử mảng được chỉ định bởi một chuỗi các chỉ số nguyên không âm. Độ dài của dãy phải bằng thứ hạng của mảng. Lập chỉ mục bắt đầu từ số không.
Ví dụ, để tạo một mảng có 10 ô, được đặt tên là mảng của tôi, chúng ta có thể viết:
(setf my-array (make-array '(10)))
Hàm aref cho phép truy cập nội dung của các ô. Nó có hai đối số, tên của mảng và giá trị chỉ mục.
Ví dụ, để truy cập nội dung của ô thứ mười, chúng ta viết:
(aref my-array 9)
ví dụ 1
Tạo một tệp mã nguồn mới có tên main.lisp và nhập mã sau vào đó.
(write (setf my-array (make-array '(10))))
(terpri)
(setf (aref my-array 0) 25)
(setf (aref my-array 1) 23)
(setf (aref my-array 2) 45)
(setf (aref my-array 3) 10)
(setf (aref my-array 4) 20)
(setf (aref my-array 5) 17)
(setf (aref my-array 6) 25)
(setf (aref my-array 7) 19)
(setf (aref my-array 8) 67)
(setf (aref my-array 9) 30)
(write my-array)
Khi bạn thực thi mã, nó trả về kết quả sau:
#(NIL NIL NIL NIL NIL NIL NIL NIL NIL NIL)
#(25 23 45 10 20 17 25 19 67 30)
Ví dụ 2
Hãy để chúng tôi tạo một mảng 3 x 3.
Tạo một tệp mã nguồn mới có tên main.lisp và nhập mã sau vào đó.
(setf x (make-array '(3 3)
:initial-contents '((0 1 2 ) (3 4 5) (6 7 8)))
)
(write x)
Khi bạn thực thi mã, nó trả về kết quả sau:
#2A((0 1 2) (3 4 5) (6 7 8))
Ví dụ 3
Tạo một tệp mã nguồn mới có tên main.lisp và nhập mã sau vào đó.
(setq a (make-array '(4 3)))
(dotimes (i 4)
(dotimes (j 3)
(setf (aref a i j) (list i 'x j '= (* i j)))
)
)
(dotimes (i 4)
(dotimes (j 3)
(print (aref a i j))
)
)
Khi bạn thực thi mã, nó trả về kết quả sau:
(0 X 0 = 0)
(0 X 1 = 0)
(0 X 2 = 0)
(1 X 0 = 0)
(1 X 1 = 1)
(1 X 2 = 2)
(2 X 0 = 0)
(2 X 1 = 2)
(2 X 2 = 4)
(3 X 0 = 0)
(3 X 1 = 3)
(3 X 2 = 6)
Cú pháp hoàn chỉnh cho hàm make-array
Hàm make-array nhận nhiều đối số khác. Chúng ta hãy xem cú pháp đầy đủ của hàm này:
make-array dimensions :element-type :initial-element :initial-contents :adjustable :fill-pointer :displaced-to :displaced-index-offset
Ngoài đối số thứ nguyên , tất cả các đối số khác đều là từ khóa. Bảng sau đây cung cấp mô tả ngắn gọn về các đối số.
Sr.No. | Lập luận & Mô tả |
---|---|
1 | dimensions Nó cung cấp các kích thước của mảng. Nó là một số cho mảng một chiều và một danh sách cho mảng nhiều chiều. |
2 | :element-type Nó là định nghĩa kiểu, giá trị mặc định là T, tức là bất kỳ kiểu nào |
3 | :initial-element Giá trị phần tử ban đầu. Nó sẽ tạo một mảng với tất cả các phần tử được khởi tạo thành một giá trị cụ thể. |
4 | :initial-content Nội dung ban đầu như đối tượng. |
5 | :adjustable Nó giúp tạo ra một vectơ có thể thay đổi kích thước (hoặc điều chỉnh) có bộ nhớ cơ bản có thể được thay đổi kích thước. Đối số là giá trị Boolean cho biết mảng có thể điều chỉnh được hay không, giá trị mặc định là NIL. |
6 | :fill-pointer Nó theo dõi số lượng phần tử thực sự được lưu trữ trong một vector có thể thay đổi kích thước. |
7 | :displaced-to Nó giúp tạo một mảng đã thay thế hoặc mảng được chia sẻ chia sẻ nội dung của nó với mảng được chỉ định. Cả hai mảng phải có cùng kiểu phần tử. Tùy chọn: displaced-to có thể không được sử dụng với tùy chọn: initial-element hoặc: initial-content. Đối số này mặc định là nil. |
số 8 | :displaced-index-offset Nó cung cấp độ lệch chỉ số của mảng được chia sẻ đã tạo. |
Ví dụ 4
Tạo một tệp mã nguồn mới có tên main.lisp và nhập mã sau vào đó.
(setq myarray (make-array '(3 2 3)
:initial-contents
'(((a b c) (1 2 3))
((d e f) (4 5 6))
((g h i) (7 8 9))
))
)
(setq array2 (make-array 4 :displaced-to myarray :displaced-index-offset 2))
(write myarray)
(terpri)
(write array2)
Khi bạn thực thi mã, nó trả về kết quả sau:
#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#(C 1 2 3)
Nếu mảng đã dời là hai chiều -
(setq myarray (make-array '(3 2 3)
:initial-contents
'(((a b c) (1 2 3))
((d e f) (4 5 6))
((g h i) (7 8 9))
))
)
(setq array2 (make-array '(3 2) :displaced-to myarray :displaced-index-offset 2))
(write myarray)
(terpri)
(write array2)
Khi bạn thực thi mã, nó trả về kết quả sau:
#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#2A((C 1) (2 3) (D E))
Hãy thay đổi độ lệch chỉ mục đã dời thành 5 -
(setq myarray (make-array '(3 2 3)
:initial-contents
'(((a b c) (1 2 3))
((d e f) (4 5 6))
((g h i) (7 8 9))
))
)
(setq array2 (make-array '(3 2) :displaced-to myarray :displaced-index-offset 5))
(write myarray)
(terpri)
(write array2)
Khi bạn thực thi mã, nó trả về kết quả sau:
#3A(((A B C) (1 2 3)) ((D E F) (4 5 6)) ((G H I) (7 8 9)))
#2A((3 D) (E F) (4 5))
Ví dụ 5
Tạo một tệp mã nguồn mới có tên main.lisp và nhập mã sau vào đó.
;a one dimensional array with 5 elements,
;initail value 5
(write (make-array 5 :initial-element 5))
(terpri)
;two dimensional array, with initial element a
(write (make-array '(2 3) :initial-element 'a))
(terpri)
;an array of capacity 14, but fill pointer 5, is 5
(write(length (make-array 14 :fill-pointer 5)))
(terpri)
;however its length is 14
(write (array-dimensions (make-array 14 :fill-pointer 5)))
(terpri)
; a bit array with all initial elements set to 1
(write(make-array 10 :element-type 'bit :initial-element 1))
(terpri)
; a character array with all initial elements set to a
; is a string actually
(write(make-array 10 :element-type 'character :initial-element #\a))
(terpri)
; a two dimensional array with initial values a
(setq myarray (make-array '(2 2) :initial-element 'a :adjustable t))
(write myarray)
(terpri)
;readjusting the array
(adjust-array myarray '(1 3) :initial-element 'b)
(write myarray)
Khi bạn thực thi mã, nó trả về kết quả sau:
#(5 5 5 5 5)
#2A((A A A) (A A A))
5
(14)
#*1111111111
"aaaaaaaaaa"
#2A((A A) (A A))
#2A((A A B))