LISP - Listeler

Listeler, geleneksel LISP'deki en önemli ve birincil bileşik veri yapısı olmuştur. Günümüzün Ortak LISP'si vektör, karma tablo, sınıflar veya yapılar gibi diğer veri yapılarını sağlar.

Listeler tek bağlantılı listelerdir. LISP'de listeler, adı verilen basit bir kayıt yapısının zinciri olarak oluşturulur.cons birbirine bağlı.

Eksileri Kayıt Yapısı

Bir cons adı verilen iki bileşeni içeren bir kayıt yapısıdır. car ve cdr.

Eksileri hücreleri veya eksileri, işlev kullanılarak oluşturulan değer çiftleridir. cons.

consfunction iki argüman alır ve iki değeri içeren yeni bir eksiler hücresi döndürür. Bu değerler her tür nesneye referans olabilir.

İkinci değer sıfır değilse veya başka bir eks hücresi değilse, değerler parantez içinde noktalı bir çift olarak yazdırılır.

Bir eksper hücresindeki iki değere car ve cdr. car işlevi, ilk değere erişmek için kullanılır ve cdr işlevi ikinci değere erişmek için kullanılır.

Misal

Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.

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

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

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

Yukarıdaki örnek, eksiler yapılarının tek bir bağlantılı liste oluşturmak için nasıl kullanılabileceğini gösterir, örneğin liste (ABC) cdr'leri ile birbirine bağlanmış üç kons hücresinden oluşur .

Şematik olarak şu şekilde ifade edilebilir:

LISP'deki listeler

Eks hücreleri listeleri oluşturmak için kullanılabilir, ancak iç içe geçmiş bir listeden bir liste oluşturmak consişlev çağrıları en iyi çözüm olamaz. list işlevi daha çok LISP'de liste oluşturmak için kullanılır.

List işlevi herhangi bir sayıda argüman alabilir ve bir işlev olduğu için argümanlarını değerlendirir.

first ve restfonksiyonlar, bir listenin ilk öğesini ve geri kalan kısmını verir. Aşağıdaki örnekler kavramları göstermektedir.

örnek 1

Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.

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

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

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

Örnek 2

Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.

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

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

"Hunger Game"

İşleyiş İşlevlerini Listele

Aşağıdaki tablo, yaygın olarak kullanılan bazı liste işleme işlevlerini göstermektedir.

Sr.No. İşlev ve Açıklama
1

car

Bir listeyi bağımsız değişken olarak alır ve ilk öğesini döndürür.

2

cdr

Bağımsız değişken olarak bir liste alır ve ilk elemanı olmayan bir liste döndürür

3

cons

Bir öğe ve bir liste olmak üzere iki bağımsız değişken alır ve ilk sırada eklenen öğenin olduğu bir liste döndürür.

4

list

Herhangi bir sayıda bağımsız değişken alır ve listenin üye öğeleri olarak bağımsız değişkenleri içeren bir liste döndürür.

5

append

İki veya daha fazla listeyi birde birleştirir.

6

last

Bir liste alır ve son elemanı içeren bir liste döndürür.

7

member

İlk bağımsız değişken ikinci bağımsız değişkenin üyesiyse, ikincisi bir liste olması gereken iki bağımsız değişken alır ve ardından ilk bağımsız değişkenle başlayan listenin geri kalanını döndürür.

8

reverse

Bir liste alır ve en üstteki elemanların ters sırada olduğu bir listeyi döndürür.

Lütfen tüm sıralama işlevlerinin listelere uygulanabileceğini unutmayın.

Örnek 3

Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.

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

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

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)

Araba ve cdr İşlevlerinin Birleştirilmesi

car ve cdr işlevler ve bunların kombinasyonları, bir listenin herhangi bir belirli öğesinin / üyesinin çıkarılmasına izin verir.

Ancak, car ve cdr işlevlerinin dizileri, car için a harfi ve cdr için d harfi c ve r harfleri içinde birleştirilerek kısaltılabilir.

Örneğin, işlev çağrılarının sırasını kısaltmak için cadadr yazabiliriz - car cdr car cdr.

Böylece, (cadadr '(a (cd) (efg))) d döndürür

Örnek 4

Main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.

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

Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -

D
A
(3 4)