LISP - Vektörler

Vektörler tek boyutlu dizilerdir, dolayısıyla bir dizi alt tipidir. Vektörler ve listeler topluca diziler olarak adlandırılır. Bu nedenle şimdiye kadar tartıştığımız tüm dizi jenerik fonksiyonlar ve dizi fonksiyonları vektörler üzerinde çalışır.

Vektör Oluşturma

Vektör işlevi, belirli değerlere sahip sabit boyutlu vektörler oluşturmanıza olanak sağlar. Herhangi bir sayıda argüman alır ve bu argümanları içeren bir vektör 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.

(setf v1 (vector 1 2 3 4 5))
(setf v2 #(a b c d e))
(setf v3 (vector 'p 'q 'r 's 't))

(write v1)
(terpri)
(write v2)
(terpri)
(write v3)

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

#(1 2 3 4 5)
#(A B C D E)
#(P Q R S T)

LISP'in, vektörler için değişmez gösterim olarak # (...) sözdizimini kullandığını lütfen unutmayın. Kodunuzda değişmez vektörler oluşturmak ve eklemek için bu # (...) sözdizimini kullanabilirsiniz.

Ancak, bunlar gerçek vektörlerdir, bu nedenle onları değiştirmek LISP'de tanımlanmamıştır. Bu nedenle, programlama için her zamanvector işlev veya daha genel işlev make-array değiştirmeyi planladığınız vektörler oluşturmak için.

make-arrayfonksiyon, bir vektör oluşturmanın daha genel bir yoludur. Vektör öğelerine,aref işlevi.

Örnek 2

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

(setq a (make-array 5 :initial-element 0))
(setq b (make-array 5 :initial-element 2))

(dotimes (i 5)
   (setf (aref a i) i))
   
(write a)
(terpri)
(write b)
(terpri)

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

#(0 1 2 3 4)
#(2 2 2 2 2)

İşaretçiyi Doldur

make-array işlevi yeniden boyutlandırılabilir bir vektör oluşturmanıza olanak sağlar.

fill-pointerfonksiyonun argümanı, vektörde gerçekte depolanan elemanların sayısını takip eder. Vektöre bir öğe eklediğinizde doldurulacak bir sonraki konumun dizinidir.

vector-pushişlevi, yeniden boyutlandırılabilir bir vektörün sonuna bir öğe eklemenizi sağlar. Dolgu işaretçisini 1 artırır.

vector-pop işlevi en son itilen öğeyi döndürür ve dolgu işaretçisini 1 azaltır.

Misal

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

(setq a (make-array 5 :fill-pointer 0))
(write a)

(vector-push 'a a)
(vector-push 'b a)
(vector-push 'c a)

(terpri)
(write a)
(terpri)

(vector-push 'd a)
(vector-push 'e a)

;this will not be entered as the vector limit is 5
(vector-push 'f a)

(write a)
(terpri)

(vector-pop a)
(vector-pop a)
(vector-pop a)

(write a)

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

#()
#(A B C)
#(A B C D E)
#(A B)

Vektörler sekanslardır, tüm sekans fonksiyonları vektörler için uygulanabilir. Vektör fonksiyonları için lütfen diziler bölümüne bakın.