LISP - Urutan

Urutan adalah tipe data abstrak di LISP. Vektor dan daftar adalah dua subtipe konkret dari tipe data ini. Semua fungsi yang didefinisikan pada tipe data urutan sebenarnya diterapkan pada semua vektor dan tipe daftar.

Di bagian ini, kita akan membahas fungsi yang paling umum digunakan pada urutan.

Sebelum memulai berbagai cara memanipulasi urutan (mis., Vektor dan daftar), mari kita lihat daftar semua fungsi yang tersedia.

Membuat Urutan

Fungsi make-sequence memungkinkan Anda membuat urutan jenis apa pun. Sintaks untuk fungsi ini adalah -

make-sequence sqtype sqsize &key :initial-element

Ini menciptakan urutan tipe sqtype dan panjang sqsize.

Secara opsional, Anda dapat menentukan beberapa nilai menggunakan argumen: elemen awal , lalu setiap elemen akan diinisialisasi ke nilai ini.

Misalnya, Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.

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

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

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

Fungsi Generik pada Urutan

Sr.No. Deskripsi fungsi
1

elt

Ini memungkinkan akses ke elemen individu melalui indeks integer.

2

length

Ini mengembalikan panjang urutan.

3

subseq

Ini mengembalikan sub-urutan dengan mengekstraksi urutan yang dimulai dari indeks tertentu dan melanjutkan ke indeks akhir tertentu atau akhir urutan.

4

copy-seq

Ini mengembalikan urutan yang berisi elemen yang sama dengan argumennya.

5

fill

Ini digunakan untuk mengatur beberapa elemen urutan ke satu nilai.

6

replace

Dibutuhkan dua urutan dan urutan argumen pertama dimodifikasi secara destruktif dengan menyalin elemen berturut-turut ke dalamnya dari urutan argumen kedua.

7

count

Ini mengambil item dan urutan dan mengembalikan berapa kali item tersebut muncul dalam urutan.

8

reverse

Ini mengembalikan urutan berisi elemen yang sama dari argumen tetapi dalam urutan terbalik.

9

nreverse

Ini mengembalikan urutan yang sama yang mengandung elemen yang sama sebagai urutan tetapi dalam urutan terbalik.

10

concatenate

Ini menciptakan urutan baru yang berisi penggabungan sejumlah urutan.

11

position

Dibutuhkan item dan urutan dan mengembalikan indeks item dalam urutan atau nihil.

12

find

Dibutuhkan item dan urutan. Ia menemukan item dalam urutan dan mengembalikannya, jika tidak ditemukan maka ia mengembalikan nihil.

13

sort

Ini mengambil urutan dan predikat dua argumen dan mengembalikan versi urutan yang diurutkan.

14

merge

Dibutuhkan dua urutan dan satu predikat dan mengembalikan urutan yang dihasilkan dengan menggabungkan dua urutan tersebut, sesuai dengan predikatnya.

15

map

Ini mengambil fungsi n-argumen dan n urutan dan mengembalikan urutan baru yang berisi hasil penerapan fungsi ke elemen berikutnya dari urutan.

16

some

Ini mengambil predikat sebagai argumen dan mengulangi urutan argumen, dan mengembalikan nilai non-NIL pertama yang dikembalikan oleh predikat atau mengembalikan salah jika predikat tidak pernah terpenuhi.

17

every

Ini mengambil predikat sebagai argumen dan mengulangi urutan argumen, itu berakhir, mengembalikan salah, segera setelah predikat gagal. Jika predikat selalu terpenuhi, ia mengembalikan nilai true.

18

notany

Ini mengambil predikat sebagai argumen dan mengulangi urutan argumen, dan mengembalikan false segera setelah predikat terpenuhi atau benar jika tidak pernah.

19

notevery

Ini mengambil predikat sebagai argumen dan mengulangi urutan argumen, dan mengembalikan nilai benar segera setelah predikat gagal atau salah jika predikat selalu terpenuhi.

20

reduce

Ini memetakan satu urutan, menerapkan fungsi dua argumen terlebih dahulu ke dua elemen pertama dari urutan dan kemudian ke nilai yang dikembalikan oleh fungsi dan elemen berikutnya dari urutan tersebut.

21

search

Ini mencari urutan untuk menemukan satu atau lebih elemen yang memenuhi beberapa tes.

22

remove

Dibutuhkan item dan urutan dan mengembalikan urutan dengan contoh item dihapus.

23

delete

Ini juga mengambil item dan urutan dan mengembalikan urutan yang sama seperti urutan argumen yang memiliki elemen yang sama kecuali item.

24

substitute

Dibutuhkan item baru, item yang sudah ada, dan urutan dan mengembalikan urutan dengan contoh item yang ada diganti dengan item baru.

25

nsubstitute

Dibutuhkan item baru, item yang sudah ada, dan urutan dan mengembalikan urutan yang sama dengan contoh item yang ada diganti dengan item baru.

26

mismatch

Ini mengambil dua urutan dan mengembalikan indeks dari pasangan pertama elemen yang tidak cocok.

Argumen Kata Kunci Fungsi Urutan Standar

Argumen Berarti Nilai Default
:uji Ini adalah fungsi dua argumen yang digunakan untuk membandingkan item (atau nilai yang diekstrak oleh: fungsi kunci) dengan elemen. EQL
:kunci Fungsi satu argumen untuk mengekstrak nilai kunci dari elemen urutan sebenarnya. NIL berarti menggunakan elemen apa adanya. NOL
:Mulailah Indeks awal (termasuk) selanjutnya. 0
:akhir Indeks akhir (eksklusif) dari urutan. NIL menunjukkan akhir urutan. NOL
: dari akhir Jika benar, urutan akan dilintasi dalam urutan terbalik, dari akhir ke awal. NOL
:menghitung Angka yang menunjukkan jumlah elemen yang akan dihapus atau diganti atau NIL untuk menunjukkan semua (HAPUS dan GANTI saja). NOL

Kami baru saja membahas berbagai fungsi dan kata kunci yang digunakan sebagai argumen dalam fungsi yang mengerjakan urutan ini. Di bagian selanjutnya, kita akan melihat bagaimana menggunakan fungsi ini menggunakan contoh.

Menemukan Panjang dan Elemen

Itu length fungsi mengembalikan panjang urutan, dan elt fungsi memungkinkan Anda untuk mengakses elemen individu menggunakan indeks integer.

Contoh

Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.

(setq x (vector 'a 'b 'c 'd 'e))
(write (length x))
(terpri)
(write (elt x 3))

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

5
D

Mengubah Urutan

Beberapa fungsi urutan memungkinkan iterasi melalui urutan dan melakukan beberapa operasi seperti, mencari, menghapus, menghitung, atau memfilter elemen tertentu tanpa menulis loop eksplisit.

Contoh berikut menunjukkan ini -

Contoh 1

Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.

(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)))

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

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

Contoh 2

Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.

(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)

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

(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)

Urutan Sorting dan Penggabungan

Fungsi pengurutan mengambil urutan dan predikat dua argumen dan mengembalikan versi urutan yang diurutkan.

Contoh 1

Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.

(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)

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

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

Contoh 2

Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.

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

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

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

Predikat Urutan

Fungsi setiap, beberapa, notany, dan notevery disebut predikat urutan.

Fungsi-fungsi ini melakukan iterasi atas urutan dan menguji predikat Boolean.

Semua fungsi ini mengambil predikat sebagai argumen pertama dan argumen yang tersisa adalah urutan.

Contoh

Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.

(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)

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

T
T
NIL
NIL
T

Urutan Pemetaan

Kami telah membahas fungsi pemetaan. Demikian pulamap function memungkinkan Anda untuk menerapkan fungsi ke elemen berikutnya dari satu atau lebih urutan.

Itu map Fungsi mengambil fungsi n-argumen dan n urutan dan mengembalikan urutan baru setelah menerapkan fungsi ke elemen berikutnya dari urutan.

Contoh

Buat file kode sumber baru bernama main.lisp dan ketikkan kode berikut di dalamnya.

(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

#(6 15 16 40)