LISP - Vectơ
Vectơ là mảng một chiều, do đó là một kiểu con của mảng. Các vectơ và danh sách được gọi chung là dãy. Do đó, tất cả các hàm chung chuỗi và các hàm mảng mà chúng ta đã thảo luận cho đến nay, đều hoạt động trên vectơ.
Tạo vectơ
Hàm vectơ cho phép bạn tạo vectơ có kích thước cố định với các giá trị cụ thể. Nó nhận bất kỳ số lượng đối số nào và trả về một vectơ chứa các đối số đó.
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 đó.
(setf v1 (vector 1 2 3 4 5))
(setf v2 #(a b c d e))
(setf v3 (vector 'p 'q 'r 's 't))
(write v1)
(terpri)
(write v2)
(terpri)
(write v3)
Khi bạn thực thi mã, nó trả về kết quả sau:
#(1 2 3 4 5)
#(A B C D E)
#(P Q R S T)
Xin lưu ý rằng LISP sử dụng cú pháp # (...) làm ký hiệu chữ cho vectơ. Bạn có thể sử dụng cú pháp # (...) này để tạo và bao gồm các vectơ chữ trong mã của mình.
Tuy nhiên, đây là các vectơ theo nghĩa đen, vì vậy việc sửa đổi chúng không được định nghĩa trong LISP. Do đó, để lập trình, bạn nên luôn sử dụngvector chức năng, hoặc chức năng tổng quát hơn make-array để tạo vectơ bạn định sửa đổi.
Các make-arrayhàm là cách chung chung hơn để tạo vectơ. Bạn có thể truy cập các phần tử vectơ bằng cách sử dụngaref chức năng.
Ví dụ 2
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 5 :initial-element 0))
(setq b (make-array 5 :initial-element 2))
(dotimes (i 5)
(setf (aref a i) i))
(write a)
(terpri)
(write b)
(terpri)
Khi bạn thực thi mã, nó trả về kết quả sau:
#(0 1 2 3 4)
#(2 2 2 2 2)
Điền con trỏ
Các make-array cho phép bạn tạo một vectơ có thể thay đổi kích thước.
Các fill-pointerđối số của hàm theo dõi số phần tử thực sự được lưu trữ trong vector. Đó là chỉ số của vị trí tiếp theo sẽ được lấp đầy khi bạn thêm một phần tử vào vectơ.
Các vector-pushcho phép bạn thêm một phần tử vào cuối một vectơ có thể thay đổi kích thước. Nó làm tăng con trỏ điền lên 1.
Các vector-pop hàm trả về mục được đẩy gần đây nhất và giảm con trỏ điền đi 1.
Thí dụ
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 5 :fill-pointer 0))
(write a)
(vector-push 'a a)
(vector-push 'b a)
(vector-push 'c a)
(terpri)
(write a)
(terpri)
(vector-push 'd a)
(vector-push 'e a)
;this will not be entered as the vector limit is 5
(vector-push 'f a)
(write a)
(terpri)
(vector-pop a)
(vector-pop a)
(vector-pop a)
(write a)
Khi bạn thực thi mã, nó trả về kết quả sau:
#()
#(A B C)
#(A B C D E)
#(A B)
Vectơ là dãy, tất cả các hàm dãy đều có thể áp dụng cho vectơ. Vui lòng tham khảo chương dãy số, để biết hàm vectơ.