LISP - Danh sách

Danh sách từng là cấu trúc dữ liệu tổng hợp quan trọng nhất và chính trong LISP truyền thống. LISP chung của ngày hôm nay cung cấp các cấu trúc dữ liệu khác như vectơ, bảng băm, các lớp hoặc cấu trúc.

Danh sách là danh sách liên kết đơn. Trong LISP, danh sách được xây dựng như một chuỗi của cấu trúc bản ghi đơn giản có têncons kết nối mọi người.

Cấu trúc bản ghi khuyết điểm

A cons là một cấu trúc bản ghi có chứa hai thành phần được gọi là carcdr.

Ô khuyết điểm hoặc ô khuyết điểm là các đối tượng là các cặp giá trị được tạo bằng cách sử dụng hàm cons.

Các conshàm nhận hai đối số và trả về một ô khuyết điểm mới chứa hai giá trị. Các giá trị này có thể là tham chiếu đến bất kỳ loại đối tượng nào.

Nếu giá trị thứ hai không phải là nil, hoặc một ô khuyết điểm khác, thì các giá trị được in dưới dạng một cặp dấu chấm được đặt trong dấu ngoặc đơn.

Hai giá trị trong ô khuyết điểm được gọi là carcdr. Các car hàm được sử dụng để truy cập giá trị đầu tiên và cdr hàm được sử dụng để truy cập giá trị thứ hai.

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 đó.

(write (cons 1 2))
(terpri)
(write (cons 'a 'b))
(terpri)
(write (cons 1 nil))
(terpri)
(write (cons 1 (cons 2 nil)))
(terpri)
(write (cons 1 (cons 2 (cons 3 nil))))
(terpri)
(write (cons 'a (cons 'b (cons 'c nil))))
(terpri)
(write ( car (cons 'a (cons 'b (cons 'c nil)))))
(terpri)
(write ( cdr (cons 'a (cons 'b (cons 'c nil)))))

Khi bạn thực thi mã, nó trả về kết quả sau:

(1 . 2)
(A . B)
(1)
(1 2)
(1 2 3)
(A B C)
A
(B C)

Ví dụ trên cho thấy cách các cấu trúc khuyết điểm có thể được sử dụng để tạo một danh sách liên kết đơn lẻ, ví dụ: danh sách (ABC) bao gồm ba ô khuyết điểm được liên kết với nhau bằng cdrs của chúng .

Theo sơ đồ, nó có thể được biểu thị là -

Danh sách trong LISP

Mặc dù các ô khuyết điểm có thể được sử dụng để tạo danh sách, tuy nhiên, việc xây dựng danh sách ngoài consgọi hàm không thể là giải pháp tốt nhất. Cáclist hàm được sử dụng để tạo danh sách trong LISP.

Hàm danh sách có thể nhận bất kỳ số lượng đối số nào và vì nó là một hàm, nó đánh giá các đối số của nó.

Các firstresthàm cung cấp phần tử đầu tiên và phần còn lại của danh sách. Các ví dụ sau đây chứng minh các khái niệm.

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 (list 1 2))
(terpri)
(write (list 'a 'b))
(terpri)
(write (list 1 nil))
(terpri)
(write (list 1 2 3))
(terpri)
(write (list 'a 'b 'c))
(terpri)
(write (list 3 4 'a (car '(b . c)) (* 4 -2)))
(terpri)
(write (list (list 'a 'b) (list 'c 'd 'e)))

Khi bạn thực thi mã, nó trả về kết quả sau:

(1 2)
(A B)
(1 NIL)
(1 2 3)
(A B C)
(3 4 A B -8)
((A B) (C D E))

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 đó.

(defun my-library (title author rating availability)
   (list :title title :author author :rating rating :availabilty availability)
)

(write (getf (my-library "Hunger Game" "Collins" 9 t) :title))

Khi bạn thực thi mã, nó trả về kết quả sau:

"Hunger Game"

Liệt kê các chức năng thao tác

Bảng sau cung cấp một số hàm thao tác danh sách thường được sử dụng.

Sr.No. Mô tả chức năng
1

car

Nó nhận một danh sách làm đối số và trả về phần tử đầu tiên của nó.

2

cdr

Nó nhận một danh sách làm đối số và trả về một danh sách không có phần tử đầu tiên

3

cons

Nó nhận hai đối số, một phần tử và một danh sách và trả về một danh sách với phần tử được chèn ở vị trí đầu tiên.

4

list

Nó nhận bất kỳ số lượng đối số nào và trả về một danh sách với các đối số là phần tử thành viên của danh sách.

5

append

Nó hợp nhất hai hoặc nhiều danh sách thành một.

6

last

Nó nhận một danh sách và trả về một danh sách có chứa phần tử cuối cùng.

7

member

Nó nhận hai đối số trong đó đối số thứ hai phải là một danh sách, nếu đối số đầu tiên là thành viên của đối số thứ hai, và sau đó nó trả về phần còn lại của danh sách bắt đầu bằng đối số đầu tiên.

số 8

reverse

Nó nhận một danh sách và trả về một danh sách với các phần tử trên cùng theo thứ tự ngược lại.

Xin lưu ý rằng tất cả các hàm tuần tự đều có thể áp dụng cho danh sách.

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 đó.

(write (car '(a b c d e f)))
(terpri)
(write (cdr '(a b c d e f)))
(terpri)
(write (cons 'a '(b c)))
(terpri)
(write (list 'a '(b c) '(e f)))
(terpri)
(write (append '(b c) '(e f) '(p q) '() '(g)))
(terpri)
(write (last '(a b c d (e f))))
(terpri)
(write (reverse '(a b c d (e f))))

Khi bạn thực thi mã, nó trả về kết quả sau:

A
(B C D E F)
(A B C)
(A (B C) (E F))
(B C E F P Q G)
((E F))
((E F) D C B A)

Sự kết hợp của chức năng xe hơi và cdr

Các carcdr và sự kết hợp của chúng cho phép trích xuất bất kỳ phần tử / thành viên cụ thể nào của danh sách.

Tuy nhiên, chuỗi các hàm car và cdr có thể được viết tắt bằng cách ghép chữ a cho car và d cho cdr trong các chữ c và r.

Ví dụ, chúng ta có thể viết cadadr để viết tắt chuỗi các lệnh gọi hàm - car cdr car cdr.

Do đó, (cadadr '(a (cd) (efg))) sẽ trả về d

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 đó.

(write (cadadr '(a (c d) (e f g))))
(terpri)
(write (caar (list (list 'a 'b) 'c)))   
(terpri)
(write (cadr (list (list 1 2) (list 3 4))))
(terpri)

Khi bạn thực thi mã, nó trả về kết quả sau:

D
A
(3 4)