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)