LISP - Ayarla

Common Lisp set veri türü sağlamaz. Bununla birlikte, bir listede ayar işlemlerinin gerçekleştirilmesine izin veren bir dizi işlev sağlar.

Çeşitli kriterlere göre bir listedeki öğeleri ekleyebilir, kaldırabilir ve arayabilirsiniz. Ayrıca birleştirme, kesişim ve farklı ayarlama gibi çeşitli ayar işlemlerini de gerçekleştirebilirsiniz.

LISP'de Setleri Uygulama

Kümeler, benzer listeler genellikle eksiler hücreleri açısından uygulanır. Bununla birlikte, tam da bu nedenle, setler büyüdükçe set işlemleri daha az verimli hale gelir.

adjoinişlevi bir küme oluşturmanıza izin verir. Bir öğeyi ve bir kümeyi temsil eden bir listeyi alır ve öğeyi ve orijinal kümedeki tüm öğeleri içeren kümeyi temsil eden bir liste döndürür.

adjoinfonksiyon önce verilen listedeki öğeyi arar, eğer bulunursa, ardından orijinal listeyi döndürür; aksi halde yeni bir mahkum hücresi yaratır.car öğe olarak ve cdr orijinal listeyi gösterir ve bu yeni listeyi döndürür.

adjoin işlevi de alır :key ve :testanahtar kelime argümanları. Bu argümanlar, öğenin orijinal listede olup olmadığını kontrol etmek için kullanılır.

Adjoin işlevi orijinal listeyi değiştirmediğinden, listenin kendisinde bir değişiklik yapmak için ya adjoin tarafından döndürülen değeri orijinal listeye atamalısınız ya da makroyu kullanabilirsiniz. pushnew Sete bir öğe eklemek için.

Misal

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

; creating myset as an empty list
(defparameter *myset* ())
(adjoin 1 *myset*)
(adjoin 2 *myset*)

; adjoin did not change the original set
;so it remains same
(write *myset*)
(terpri)
(setf *myset* (adjoin 1 *myset*))
(setf *myset* (adjoin 2 *myset*))

;now the original set is changed
(write *myset*)
(terpri)

;adding an existing value
(pushnew 2 *myset*)

;no duplicate allowed
(write *myset*)
(terpri)

;pushing a new value
(pushnew 3 *myset*)
(write *myset*)
(terpri)

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

NIL
(2 1)
(2 1)
(3 2 1)

Üyelik Kontrol Ediliyor

Üye işlev grubu, bir elemanın bir kümenin üyesi olup olmadığını kontrol etmenize olanak sağlar.

Aşağıdakiler, bu işlevlerin sözdizimleridir -

member item list &key :test :test-not :key 
member-if predicate list &key :key 
member-if-not predicate list &key :key

Bu işlevler, testi karşılayan belirli bir öğe için verilen listede arama yapar. Böyle bir öğe bulunmazsa, işlevler dönernil. Aksi takdirde, ilk eleman olarak eleman içeren listenin kuyruğu döndürülür.

Arama yalnızca en üst düzeyde yapılır.

Bu işlevler yüklemler olarak kullanılabilir.

Misal

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

(write (member 'zara '(ayan abdul zara riyan nuha)))
(terpri)
(write (member-if #'evenp '(3 7 2 5/3 'a)))
(terpri)
(write (member-if-not #'numberp '(3 7 2 5/3 'a 'b 'c)))

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

(ZARA RIYAN NUHA)
(2 5/3 'A)
('A 'B 'C)

Birlik Ayarla

İşlevlerin birleşim grubu, bir test temelinde bu işlevlere bağımsız değişken olarak sağlanan iki listede küme birleşimi gerçekleştirmenize olanak tanır.

Aşağıdakiler, bu işlevlerin sözdizimleridir -

union list1 list2 &key :test :test-not :key 
nunion list1 list2 &key :test :test-not :key

unionişlevi iki liste alır ve listelerden herhangi birinde bulunan tüm öğeleri içeren yeni bir liste döndürür. Çoğaltmalar varsa, iade listesinde üyenin sadece bir kopyası tutulur.

nunion işlevi aynı işlemi gerçekleştirir ancak bağımsız değişken listelerini yok edebilir.

Misal

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

(setq set1 (union '(a b c) '(c d e)))
(setq set2 (union '(#(a b) #(5 6 7) #(f h)) 
   '(#(5 6 7) #(a b) #(g h)) :test-not #'mismatch)
)
       
(setq set3 (union '(#(a b) #(5 6 7) #(f h)) 
   '(#(5 6 7) #(a b) #(g h)))
)
(write set1)
(terpri)
(write set2)
(terpri)
(write set3)

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

(A B C D E)
(#(F H) #(5 6 7) #(A B) #(G H))
(#(A B) #(5 6 7) #(F H) #(5 6 7) #(A B) #(G H))

Lütfen aklınızda bulundurun

Birleştirme işlevi beklendiği gibi çalışmaz :test-not #'mismatchüç vektörün listesi için argümanlar. Bunun nedeni, listelerin eksiler hücrelerinden oluşması ve görünüşe göre değerler bize aynı görünse de,cdrHücrelerin bir kısmı eşleşmiyor, bu yüzden LISP yorumlayıcısı / derleyicisi ile tam olarak aynı değiller. Sebep bu; Listeler kullanılarak büyük kümelerin uygulanması tavsiye edilmez. Yine de küçük setler için iyi çalışıyor.

Kesişimi Ayarla

İşlevlerin kesişim grubu, bir test temelinde bu işlevlere bağımsız değişken olarak sağlanan iki listede kesişim gerçekleştirmenize olanak tanır.

Aşağıdakiler, bu işlevlerin sözdizimleridir -

intersection list1 list2 &key :test :test-not :key 
nintersection list1 list2 &key :test :test-not :key

Bu işlevler iki liste alır ve her iki bağımsız değişken listesinde bulunan tüm öğeleri içeren yeni bir liste döndürür. Her iki listede de yinelenen girişler varsa, gereksiz girişler sonuçta görünebilir veya görünmeyebilir.

Misal

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

(setq set1 (intersection '(a b c) '(c d e)))
(setq set2 (intersection '(#(a b) #(5 6 7) #(f h)) 
   '(#(5 6 7) #(a b) #(g h)) :test-not #'mismatch)
)
       
(setq set3 (intersection '(#(a b) #(5 6 7) #(f h)) 
   '(#(5 6 7) #(a b) #(g h)))
)
(write set1)
(terpri)
(write set2)
(terpri)
(write set3)

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

(C)
(#(A B) #(5 6 7))
NIL

Kesişme işlevi, kesişimin yıkıcı versiyonudur, yani orijinal listeleri yok edebilir.

Farkı Ayarla

Küme farkı işlev grubu, bir test temelinde bu işlevlere bağımsız değişken olarak sağlanan iki listede küme farkı gerçekleştirmenize olanak tanır.

Aşağıdakiler, bu işlevlerin sözdizimleridir -

set-difference list1 list2 &key :test :test-not :key 
nset-difference list1 list2 &key :test :test-not :key

Set-fark işlevi, ilk listenin ikinci listede görünmeyen öğelerinin bir listesini döndürür.

Misal

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

(setq set1 (set-difference '(a b c) '(c d e)))
(setq set2 (set-difference '(#(a b) #(5 6 7) #(f h)) 
   '(#(5 6 7) #(a b) #(g h)) :test-not #'mismatch)
)
(setq set3 (set-difference '(#(a b) #(5 6 7) #(f h)) 
   '(#(5 6 7) #(a b) #(g h)))
)
(write set1)
(terpri)
(write set2)
(terpri)
(write set3)

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

(A B)
(#(F H))
(#(A B) #(5 6 7) #(F H))