LISP - Daftar

Daftar merupakan struktur data komposit yang paling penting dan utama dalam LISP tradisional. LISP Umum saat ini menyediakan struktur data lain seperti, vektor, tabel hash, kelas atau struktur.

Daftar adalah daftar tertaut tunggal. Di LISP, daftar dibuat sebagai rantai struktur rekaman sederhana bernamacons dihubungkan bersama.

Kontra Struktur Rekaman

SEBUAH cons adalah struktur record yang berisi dua komponen yang disebut car dan cdr.

Kontra sel atau kontra adalah objek pasangan nilai yang dibuat menggunakan fungsi cons.

Itu consfunction mengambil dua argumen dan mengembalikan sel kontra baru yang berisi dua nilai. Nilai-nilai ini dapat menjadi referensi untuk segala jenis objek.

Jika nilai kedua bukan nol, atau sel kontra lainnya, maka nilai akan dicetak sebagai pasangan titik-titik yang diapit oleh tanda kurung.

Dua nilai dalam sel kontra disebut car dan cdr. Itu car fungsi digunakan untuk mengakses nilai pertama dan cdr fungsi digunakan untuk mengakses nilai kedua.

Contoh

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

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

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

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

Contoh di atas menunjukkan bagaimana struktur kontra dapat digunakan untuk membuat satu daftar tertaut, misalnya, daftar (ABC) terdiri dari tiga sel kontra yang dihubungkan bersama oleh cdr mereka .

Secara diagram, ini dapat dinyatakan sebagai -

Daftar di LISP

Meskipun sel kontra dapat digunakan untuk membuat daftar, namun, membuat daftar dari bersarang conspanggilan fungsi tidak bisa menjadi solusi terbaik. Itulist fungsi ini lebih digunakan untuk membuat daftar di LISP.

Fungsi list dapat mengambil sejumlah argumen dan karena ini adalah fungsi, ia mengevaluasi argumennya.

Itu first dan restfungsi memberikan elemen pertama dan bagian lainnya dari daftar. Contoh berikut menunjukkan konsepnya.

Contoh 1

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

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

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

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

Contoh 2

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

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

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

"Hunger Game"

Daftar Fungsi Memanipulasi

Tabel berikut menyediakan beberapa fungsi manipulasi daftar yang umum digunakan.

Sr.No. Deskripsi fungsi
1

car

Ini mengambil list sebagai argumen, dan mengembalikan elemen pertamanya.

2

cdr

Dibutuhkan daftar sebagai argumen, dan mengembalikan daftar tanpa elemen pertama

3

cons

Dibutuhkan dua argumen, elemen dan daftar dan mengembalikan daftar dengan elemen yang disisipkan di tempat pertama.

4

list

Dibutuhkan sejumlah argumen dan mengembalikan daftar dengan argumen sebagai elemen anggota daftar.

5

append

Ini menggabungkan dua atau lebih daftar menjadi satu.

6

last

Ini mengambil daftar dan mengembalikan daftar yang berisi elemen terakhir.

7

member

Dibutuhkan dua argumen dimana yang kedua harus berupa daftar, jika argumen pertama adalah anggota dari argumen kedua, dan kemudian mengembalikan sisa daftar yang dimulai dengan argumen pertama.

8

reverse

Dibutuhkan daftar dan mengembalikan daftar dengan elemen teratas dalam urutan terbalik.

Harap dicatat bahwa semua fungsi urutan berlaku untuk daftar.

Contoh 3

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

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

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

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)

Penggabungan Fungsi mobil dan cdr

Itu car dan cdr fungsi dan kombinasinya memungkinkan ekstraksi elemen / anggota tertentu dari daftar.

Namun urutan fungsi car dan cdr dapat disingkat dengan menggabungkan huruf a untuk car dan d untuk cdr di dalam huruf c dan r.

Misalnya kita dapat menulis cadadr untuk menyingkat urutan panggilan fungsi - car cdr car cdr.

Jadi, (cadadr '(a (cd) (efg))) akan mengembalikan d

Contoh 4

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

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

Saat Anda menjalankan kode, ia mengembalikan hasil berikut -

D
A
(3 4)