LISP - Chuỗi

Trình tự là một kiểu dữ liệu trừu tượng trong LISP. Vectơ và danh sách là hai kiểu con cụ thể của kiểu dữ liệu này. Tất cả các chức năng được xác định trên kiểu dữ liệu tuần tự thực sự được áp dụng trên tất cả các vectơ và kiểu danh sách.

Trong phần này, chúng ta sẽ thảo luận về các hàm thường được sử dụng nhất trên chuỗi.

Trước khi bắt đầu các cách khác nhau để thao tác chuỗi (ví dụ, vectơ và danh sách), chúng ta hãy xem danh sách tất cả các hàm có sẵn.

Tạo trình tự

Hàm tạo chuỗi cho phép bạn tạo một chuỗi thuộc bất kỳ loại nào. Cú pháp của hàm này là:

make-sequence sqtype sqsize &key :initial-element

Nó tạo ra một chuỗi kiểu sqtype và có độ dài là sqsize.

Bạn có thể tùy ý chỉ định một số giá trị bằng cách sử dụng đối số : initial-element , sau đó mỗi phần tử sẽ được khởi tạo thành giá trị này.

Ví dụ: Tạo tệp mã nguồn mới có tên main.lisp và nhập mã sau vào đó.

(write (make-sequence '(vector float) 
   10 
   :initial-element 1.0))

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

#(1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)

Các chức năng chung trên chuỗi

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

elt

Nó cho phép truy cập vào các phần tử riêng lẻ thông qua một chỉ mục số nguyên.

2

length

Nó trả về độ dài của một chuỗi.

3

subseq

Nó trả về một dãy con bằng cách trích xuất dãy con bắt đầu từ một chỉ mục cụ thể và tiếp tục đến một chỉ mục kết thúc cụ thể hoặc cuối dãy.

4

copy-seq

Nó trả về một chuỗi có chứa các phần tử giống như đối số của nó.

5

fill

Nó được sử dụng để đặt nhiều phần tử của một chuỗi thành một giá trị duy nhất.

6

replace

Nó có hai chuỗi và chuỗi đối số đầu tiên bị sửa đổi một cách triệt để bằng cách sao chép các phần tử liên tiếp vào nó từ chuỗi đối số thứ hai.

7

count

Nó nhận một mục và một chuỗi và trả về số lần mục đó xuất hiện trong chuỗi.

số 8

reverse

Nó trả về một chuỗi chứa các phần tử giống nhau của đối số nhưng theo thứ tự ngược lại.

9

nreverse

Nó trả về cùng một chuỗi chứa các phần tử giống như chuỗi nhưng theo thứ tự ngược lại.

10

concatenate

Nó tạo ra một chuỗi mới có chứa sự ghép nối của bất kỳ số chuỗi nào.

11

position

Nó nhận một mục và một chuỗi và trả về chỉ mục của mục trong chuỗi hoặc nil.

12

find

Nó có một mục và một trình tự. Nó tìm mục trong chuỗi và trả về, nếu không tìm thấy thì trả về nil.

13

sort

Nó nhận một chuỗi và một vị từ hai đối số và trả về một phiên bản đã được sắp xếp của chuỗi.

14

merge

Nó nhận hai chuỗi và một vị từ và trả về một chuỗi được tạo ra bằng cách hợp nhất hai chuỗi, theo vị từ.

15

map

Nó nhận một hàm n đối số và n dãy và trả về một dãy mới chứa kết quả của việc áp dụng hàm cho các phần tử tiếp theo của dãy.

16

some

Nó nhận một vị từ làm đối số và lặp qua chuỗi đối số và trả về giá trị không phải NIL đầu tiên được trả về bởi vị từ hoặc trả về false nếu vị từ không bao giờ được thỏa mãn.

17

every

Nó nhận một vị từ làm đối số và lặp qua chuỗi đối số, nó kết thúc, trả về false ngay khi vị từ bị lỗi. Nếu vị từ luôn được thỏa mãn, nó trả về true.

18

notany

Nó nhận một vị từ làm đối số và lặp qua chuỗi đối số, và trả về false ngay khi vị từ được thỏa mãn hoặc đúng nếu nó không bao giờ như vậy.

19

notevery

Nó nhận một vị từ làm đối số và lặp qua chuỗi đối số và trả về true ngay khi vị từ bị lỗi hoặc sai nếu vị từ luôn được thỏa mãn.

20

reduce

Nó ánh xạ trên một dãy đơn, áp dụng một hàm hai đối số trước tiên cho hai phần tử đầu tiên của dãy và sau đó đến giá trị được trả về bởi hàm và các phần tử tiếp theo của dãy.

21

search

Nó tìm kiếm một chuỗi để xác định một hoặc nhiều phần tử đáp ứng một số thử nghiệm.

22

remove

Nó lấy một mục và một chuỗi và trả về chuỗi với các trường hợp của mục đã bị xóa.

23

delete

Thao tác này cũng nhận một mục và một chuỗi và trả về một chuỗi cùng loại với chuỗi đối số có các phần tử giống nhau ngoại trừ mục.

24

substitute

Nó lấy một mục mới, một mục hiện có và một chuỗi và trả về một chuỗi với các trường hợp của mục hiện có được thay thế bằng mục mới.

25

nsubstitute

Nó lấy một mục mới, một mục hiện có và một chuỗi và trả về cùng một chuỗi với các trường hợp của mục hiện có được thay thế bằng mục mới.

26

mismatch

Nó có hai chuỗi và trả về chỉ mục của cặp phần tử không khớp đầu tiên.

Đối số từ khóa của hàm theo trình tự chuẩn

Tranh luận Ý nghĩa Giá trị mặc định
:kiểm tra Nó là một hàm hai đối số được sử dụng để so sánh mục (hoặc giá trị được trích xuất bởi: key function) với phần tử. EQL
:Chìa khóa Hàm một đối số để trích xuất giá trị khóa từ phần tử chuỗi thực tế. NIL có nghĩa là sử dụng phần tử nguyên trạng. KHÔNG
:khởi đầu Chỉ mục bắt đầu (bao gồm) của dãy con. 0
:kết thúc Chỉ mục kết thúc (loại trừ) của dãy con. NIL cho biết kết thúc của chuỗi. KHÔNG
: từ cuối Nếu đúng, trình tự sẽ được chuyển theo thứ tự ngược lại, từ cuối đến đầu. KHÔNG
:đếm Số cho biết số phần tử cần loại bỏ hoặc thay thế hoặc số NIL để chỉ ra tất cả (chỉ XÓA và GỬI). KHÔNG

Chúng ta vừa thảo luận về các hàm và từ khóa khác nhau được sử dụng làm đối số trong các hàm này hoạt động trên chuỗi. Trong các phần tiếp theo, chúng ta sẽ xem cách sử dụng các hàm này bằng các ví dụ.

Tìm độ dài và yếu tố

Các length hàm trả về độ dài của một chuỗi và elt hàm cho phép bạn truy cập các phần tử riêng lẻ bằng cách sử dụng một chỉ mục số nguyên.

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 x (vector 'a 'b 'c 'd 'e))
(write (length x))
(terpri)
(write (elt x 3))

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

5
D

Sửa đổi chuỗi

Một số hàm tuần tự cho phép lặp qua trình tự và thực hiện một số hoạt động như tìm kiếm, loại bỏ, đếm hoặc lọc các phần tử cụ thể mà không cần viết các vòng lặp rõ ràng.

Ví dụ sau đây chứng minh điều này -

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 (count 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete 5 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (substitute 10 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (find 7 '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (position 5 '(1 5 6 7 8 9 2 7 3 4 5)))

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

2
(1 6 7 8 9 2 7 3 4)
(1 6 7 8 9 2 7 3 4)
(1 5 6 10 8 9 2 10 3 4 5)
7
1

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

(write (delete-if #'oddp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (delete-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5)))
(terpri)
(write (remove-if #'evenp '(1 5 6 7 8 9 2 7 3 4 5) :count 1 :from-end t))
(terpri)
(setq x (vector 'a 'b 'c 'd 'e 'f 'g))
(fill x 'p :start 1 :end 4)
(write x)

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

(6 8 2 4)
(1 5 7 9 7 3 5)
(1 5 6 7 8 9 2 7 3 5)
#(A P P P E F G)

Sắp xếp và Hợp nhất các chuỗi

Các hàm sắp xếp nhận một chuỗi và một vị từ hai đối số và trả về một phiên bản đã được sắp xếp của chuỗi.

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 (sort '(2 4 7 3 9 1 5 4 6 3 8) #'<))
(terpri)
(write (sort '(2 4 7 3 9 1 5 4 6 3 8) #'>))
(terpri)

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

(1 2 3 3 4 4 5 6 7 8 9)
(9 8 7 6 5 4 4 3 3 2 1)

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

(write (merge 'vector #(1 3 5) #(2 4 6) #'<))
(terpri)
(write (merge 'list #(1 3 5) #(2 4 6) #'<))
(terpri)

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

#(1 2 3 4 5 6)
(1 2 3 4 5 6)

Dự đoán trình tự

Các hàm every, some, notany và notevery được gọi là các vị từ trình tự.

Các hàm này lặp qua các chuỗi và kiểm tra vị từ Boolean.

Tất cả các hàm này nhận một vị từ làm đối số đầu tiên và các đối số còn lại là chuỗi.

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 (every #'evenp #(2 4 6 8 10)))
(terpri)
(write (some #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (every #'evenp #(2 4 6 8 10 13 14)))
(terpri)
(write (notany #'evenp #(2 4 6 8 10)))
(terpri)
(write (notevery #'evenp #(2 4 6 8 10 13 14)))
(terpri)

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

T
T
NIL
NIL
T

Lập bản đồ trình tự

Chúng ta đã thảo luận về các chức năng ánh xạ. Tương tự như vậymap hàm cho phép bạn áp dụng một hàm cho các phần tử tiếp theo của một hoặc nhiều chuỗi.

Các map hàm nhận một hàm n đối số và n dãy và trả về một dãy mới sau khi áp dụng hàm cho các phần tử tiếp theo của dãy.

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 (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))

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

#(6 15 16 40)