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)