LISP - Diziler
Sıra, LISP'de soyut bir veri türüdür. Vektörler ve listeler, bu veri türünün iki somut alt tipidir. Sıralı veri türünde tanımlanan tüm işlevler aslında tüm vektörlere ve liste türlerine uygulanır.
Bu bölümde, diziler üzerinde en sık kullanılan işlevleri tartışacağız.
Dizileri (yani vektörler ve listeler) değiştirmenin çeşitli yollarına başlamadan önce, mevcut tüm işlevlerin listesine bir göz atalım.
Sıra Oluşturma
Make-sequence işlevi, herhangi bir türden bir dizi oluşturmanıza olanak sağlar. Bu işlevin sözdizimi -
make-sequence sqtype sqsize &key :initial-element
Sqtype türünde ve uzunluk sqsize türünde bir dizi oluşturur .
İsteğe bağlı olarak : initial-element argümanını kullanarak bazı değerler belirtebilirsiniz , ardından her eleman bu değerle başlatılacaktır.
Örneğin, main.lisp adında yeni bir kaynak kodu dosyası oluşturun ve içine aşağıdaki kodu yazın.
(write (make-sequence '(vector float)
10
:initial-element 1.0))
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
#(1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0 1.0)
Dizilerde Genel İşlevler
Sr.No. | İşlev ve Açıklama |
---|---|
1 | elt Bir tamsayı indeksi aracılığıyla tek tek öğelere erişim sağlar. |
2 | length Bir dizinin uzunluğunu döndürür. |
3 | subseq Belirli bir dizinden başlayıp belirli bir bitiş dizinine veya dizinin sonuna kadar devam ederek alt diziyi çıkararak bir alt dizi döndürür. |
4 | copy-seq Bağımsız değişkeniyle aynı öğeleri içeren bir dizi döndürür. |
5 | fill Bir dizinin birden çok öğesini tek bir değere ayarlamak için kullanılır. |
6 | replace İki sekans alır ve birinci argüman sekansı, ikinci argüman sekansından ardışık elemanların ona kopyalanmasıyla yıkıcı bir şekilde değiştirilir. |
7 | count Bir öğe ve bir sıra alır ve öğenin dizide görünme sayısını döndürür. |
8 | reverse Bağımsız değişkenin aynı öğelerini içeren ancak ters sırada bir dizi döndürür. |
9 | nreverse Sırayla aynı öğeleri içeren ancak ters sırayla aynı sırayı döndürür. |
10 | concatenate Herhangi bir sayıda dizinin birleştirilmesini içeren yeni bir dizi oluşturur. |
11 | position Bir öğeyi ve sırayı alır ve sıradaki veya sıfırdaki öğenin dizinini döndürür. |
12 | find Bir öğe ve bir sıra alır. Sıradaki öğeyi bulur ve döndürür, bulunamazsa sıfır döndürür. |
13 | sort Bir dizi ve iki bağımsız değişkenli bir yüklem alır ve dizinin sıralanmış bir sürümünü döndürür. |
14 | merge İki dizi ve bir yüklem alır ve yüklemeye göre iki dizinin birleştirilmesiyle üretilen bir dizi döndürür. |
15 | map Bir n-bağımsız değişken işlevini ve n dizi alır ve işlevi dizilerin sonraki öğelerine uygulamanın sonucunu içeren yeni bir dizi döndürür. |
16 | some Bir yüklemi bağımsız değişken olarak alır ve bağımsız değişken dizisi üzerinde yineler ve yüklem tarafından döndürülen ilk NIL olmayan değeri döndürür veya yüklem hiçbir zaman karşılanmazsa yanlış döndürür. |
17 | every Bir yüklemi bir argüman olarak alır ve argüman dizisi üzerinde yineler, sona erer, yüklem başarısız olur olmaz yanlış döndürür. Yüklem her zaman tatmin edilirse, doğru döndürür. |
18 | notany Bir yüklemi bir argüman olarak alır ve argüman dizisi üzerinde yineler ve yüklem tatmin edilir edilmez false veya hiç değilse doğru olur. |
19 | notevery Bir yüklemi argüman olarak alır ve argüman dizisi üzerinde yineler ve yüklem her zaman karşılanırsa yüklem başarısız olur olmaz doğru veya yanlış döndürür. |
20 | reduce Tek bir diziyi eşler, önce dizinin ilk iki öğesine ve ardından işlev tarafından döndürülen değere ve dizinin sonraki öğelerine iki bağımsız değişken uygular. |
21 | search Bazı testleri karşılayan bir veya daha fazla öğeyi bulmak için bir dizi arar. |
22 | remove Bir öğeyi ve bir diziyi alır ve kaldırılan öğe örnekleriyle diziyi döndürür. |
23 | delete Bu aynı zamanda bir öğe ve bir dizi alır ve öğe dışında aynı öğelere sahip olan argüman dizisi ile aynı türden bir dizi döndürür. |
24 | substitute Yeni bir öğeyi, mevcut bir öğeyi ve bir diziyi alır ve yeni öğeyle değiştirilen mevcut öğenin örnekleriyle bir sıra döndürür. |
25 | nsubstitute Yeni bir öğeyi, mevcut bir öğeyi ve bir sıralamayı alır ve aynı sırayı, yeni öğeyle değiştirilen mevcut öğenin örnekleriyle döndürür. |
26 | mismatch İki sıra alır ve ilk eşleşmeyen öğe çiftinin dizinini döndürür. |
Standart Sıra Fonksiyonu Anahtar Kelime Bağımsız Değişkenleri
Argüman | Anlam | Varsayılan değer |
---|---|---|
:Ölçek | Öğeyi (veya: anahtar işlevi tarafından çıkarılan değeri) öğeyle karşılaştırmak için kullanılan iki bağımsız değişkenli bir işlevdir. | EQL |
: anahtar | Gerçek sıra öğesinden anahtar değerini çıkarmak için tek bağımsız değişkenli işlev. NIL, öğeyi olduğu gibi kullanmak anlamına gelir. | NIL |
:Başlat | Alt dizinin başlangıç dizini (dahil). | 0 |
:son | Alt dizinin bitiş endeksi (hariç). NIL, dizinin sonunu belirtir. | NIL |
: sondan | Doğruysa, dizi uçtan başa ters sırada geçecektir. | NIL |
:Miktar | Kaldırılacak veya değiştirilecek öğelerin sayısını gösteren sayı veya tümünü belirtmek için NIL (yalnızca KALDIR ve YEDEK) | NIL |
Diziler üzerinde çalışan bu işlevlerde argüman olarak kullanılan çeşitli işlevleri ve anahtar sözcükleri tartıştık. Sonraki bölümlerde örneklerle bu fonksiyonları nasıl kullanacağımızı göreceğiz.
Uzunluk ve Eleman Bulma
length işlev bir dizinin uzunluğunu döndürür ve elt işlevi, bir tamsayı dizini kullanarak tek tek öğelere erişmenizi sağlar.
Misal
Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.
(setq x (vector 'a 'b 'c 'd 'e))
(write (length x))
(terpri)
(write (elt x 3))
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
5
D
Dizileri Değiştirme
Bazı dizi işlevleri, dizi boyunca yinelemeye izin verir ve belirli öğeleri açık döngüler yazmadan arama, kaldırma, sayma veya filtreleme gibi bazı işlemleri gerçekleştirir.
Aşağıdaki örnek bunu göstermektedir -
örnek 1
Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.
(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)))
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
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
Örnek 2
Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.
(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)
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
(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)
Dizileri Sıralama ve Birleştirme
Sıralama işlevleri bir dizi ve iki bağımsız değişkenli bir yüklem alır ve dizinin sıralı bir sürümünü döndürür.
örnek 1
Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.
(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)
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
(1 2 3 3 4 4 5 6 7 8 9)
(9 8 7 6 5 4 4 3 3 2 1)
Örnek 2
Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.
(write (merge 'vector #(1 3 5) #(2 4 6) #'<))
(terpri)
(write (merge 'list #(1 3 5) #(2 4 6) #'<))
(terpri)
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
#(1 2 3 4 5 6)
(1 2 3 4 5 6)
Sıra Tahminleri
Every, some, notany ve her değil işlevlere dizi yüklemleri denir.
Bu işlevler, diziler üzerinde yinelenir ve Boole koşulunu test eder.
Tüm bu işlevler, ilk bağımsız değişken olarak bir yüklem alır ve geri kalan bağımsız değişkenler dizilerdir.
Misal
Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.
(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)
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
T
T
NIL
NIL
T
Eşleme Dizileri
Haritalama fonksiyonlarını zaten tartışmıştık. Benzer şekildemap işlevi, bir veya daha fazla dizinin sonraki öğelerine bir işlev uygulamanıza izin verir.
map işlev bir n bağımsız değişken işlevini ve n dizi alır ve işlevi dizilerin sonraki öğelerine uyguladıktan sonra yeni bir dizi döndürür.
Misal
Main.lisp adlı yeni bir kaynak kod dosyası oluşturun ve içine aşağıdaki kodu yazın.
(write (map 'vector #'* #(2 3 4 5) #(3 5 4 8)))
Kodu çalıştırdığınızda, aşağıdaki sonucu döndürür -
#(6 15 16 40)