LİSTELER

Lisp’te listeler birbirine referanslar vererek uzanan yapılardır.

liste Lisp Notları: Listeler, Kümeler, Diziler, Vektörler, Stringler, Structlar

(list 'a 'b 'c)
(cons 'a (cons 'b (cons 'c nil)))
(setf x (list 'a 'b 'c))
(car x) ; a
(cdr x) ; '(b c)

Yukarıdaki komutlar listeyi incelemek için yeterlidir. (Bir önceki yazıda değinilmişti)

(shadow 'lisp)
(defun listp (x) 
	(or (null x) (consp x)))
(shadow 'atom)
(defun atom (x)
	(not (consp x)))
(eql (cons 'a nil) (cons 'a nil)) ;T
(equal (cons 'a nil) (cons 'a nil)) ;T

Listenin nasıl değerlendirildiğini de hatırlamış olduk.

lstsame Lisp Notları: Listeler, Kümeler, Diziler, Vektörler, Stringler, Structlar

(setf x '(a b c))
(setf y x)

Listenin aynı olması durumunda bir elemanın değerinin değişmesi diğer değişkene de etki eder. Bunu engellemek için listeyi kopyalamak gerekir.

listeesit Lisp Notları: Listeler, Kümeler, Diziler, Vektörler, Stringler, Structlar

(setf x '(a b c))
(setf y (copy-list x))

Listeye bir eleman eklersek;

(setf x '(a b c))
(append x 'd)

şeklinde yazarız.

(nth 0 '(a b c)) ; 'a
(nth 1 '(a b c)) ; 'b

Listenin belirli elemanını almaya yarar.

(nthcdr 1 '(a b c)) ; '(b c)
(last '(a b c)) ; 'c
(substute 'x 'b '(a b c d)) ; '(a x c d)

AĞAÇ VERİ YAPISI

agac Lisp Notları: Listeler, Kümeler, Diziler, Vektörler, Stringler, Structlar

Ağaç veri tipleri de birer listedir.

'(a (b c) d)
(setf x '(a (b c) d)
(setf y (copy-tree x))
(subst 'x 'b '(a (b c) d)) ; substute ağaçta çalışmaz

KÜMELER

Kümeler de basit anlamı ile listelerdir.

(member 'b '(a b c)) ; '(B C)

teklin çiflik durumu için olan iki fonksiyona bakalım

(oddp 3) ; 3 tek T
(evenp 2) ; 2 çift T
(member-if #'evenp '(3 2 5)) ;'(2 5)

member-if kendinden sonraki fonksiyonu kümenin her değeri için tek tek gerçekleştirir ve T değeri oluşunca member işlemini yapar.

(addjoin 'c '(a b c d)) ; '(a b c d)
(addjoin 'x '(a b c d)) ; '(x a b c d)
(union '(a b c) '(c d e)) ; '(a b c d e)
(intersection '(a b c) '(b c d)) ; '(b c)
(set-difference '(a b c d) '(a c)) ; '(a d)

DİZİNLER

Bir başka yol da dizi olarak listeyi düşünmektir.

(length '(a b c d)) ; 4
(subseq '(a b c d e) 1 4) ; '(b c d)
(reverse '(a b c d)) ; '(d c b a)
(mirror? '(a b c c b a)) ; T
(sort '(2 4 3 1) '#>) ; '(4 3 2 1) 
(sort '(2 4 3 1) '#<) ; '(1 2 3 4)
(every #'evenp '(2 4 6)) ; T
(same #'oddp '(1 2 3)) ; T
(elt '(a b c d) 2) ; 'c

YIÄžINLAR

Stack veri yapısı gibi de liste düşünülebilir.

(setf lst '(a b c))
(push 'x lst) ; '(x a b c)

veya

(setf lst '(a b c))
(setf lst (cons 'x lst))

geri almak için

(setf lst '(a b c))
(pop lst) ; 'a

veya

(setf lst '(a b c))
(let ((ret (car lst))
    (setf lst (cdr lst))
    ret)

NOKTALI LİSTE

Noktalı listeler geçerli bir liste değildir. Liste şöyle tanımlanabilir.

noktaliste Lisp Notları: Listeler, Kümeler, Diziler, Vektörler, Stringler, Structlar

'(a . b)
(cons 'a 'b) ; '(a . b)

Bir listeden beklenen elemanın sonunun nil ile bitmesidir. Bu durum olmuyorsa düzensiz bir liste olur.

Noktalı listeler en iyi ikili listelerde işe yarar

(setf lookup '((a . 1) (b . 2))
(assoc 'a lookup) ; '(a . 1)

assoc yapısına :test ve :key anahtarları ile müdahale edilebilir. Ayrıca member-if gibi assoc-if de bulunmaktadır.

DİZİLER

Array yapısı Lisp’te de bulunur.

(setf myarry (make-array 2 2))

make-array 7 boyuta kadar dizi tanımlayabilir.

(aref myarry 1 0) ; nil
(setf (aref myarry 1 0) 'a) ;a takısı array demek

VEKTÖRLER

Tek boyutlu dizilere vektör denir.

(setf myvec (vector 'a 'b 'c))
(sv myvec 1) ; 'b sv simple vector

STRING

String character tipli verilerin oluşturduğu vektörlerdir. (Daha onceki yazıda değinmiştik). Kullanılan bazı fonksiyonlar string=, char=, char> idi. Lispte karakterler #k şeklinde yazılırlar.

(aref "Merhaba" 1) ; #\e
(char "Merhaba" 1) ; #\e
(position #\a "Merhaba") ; 4
(position #\a "Merhaba" :start 5) ; 6

position yüklemi :key :start :from-end :test :end ile ifadeler kullanır. Emacs ortamında : yazdıktan sonra TAB tuşuna basarsanız slime size bu kelimeleri verecektir. Position aynı member gibi position-if formuna da sahiptir.

(position-if #'evenp '(1 2 3)) ; 1
(find #\k "Taktik") ; #\k
(find-if #'characterp "Karakter") ; #\K
(remove-duplicates "haham") ; "ham"
(reduce #intersection '((a b c d e) (a c e f) (a c d)) ; '(a c)

veya

(intersectin (intersectin '(a b c d e) '(a c e f)) '(a c d))

STRUCTLAR

C dilinden de tanıdığımız structlar Lispte de mevcuttur.

(defstruct point 
    x y)
(setf mypoint (make-point :x 1 :y 2))
(point-x mypoint) ; 1
(setf (point-x mypoint) 2)
 
(point-p mypoint) ; T
(typep mypoint 'point)

Ayrıca değer almak ta mümkündür.

(defstruct kedi
    (tip (progn 
        (format t "Ne tür kedi")
        (read)))
    (hayvan t))
(setf shainepher (make-kedi :tip "Himalayan"))

HASH TABLOSU

(setf ht (make-hash-table))
(setf (gethash 'renk ht) 'siyah)
(setf (gethash 'koku ht) 'pis)
(setf (gethash 'amac ht) 'yok)
(setf (gethash 'isim ht) 'noname)
(remhash 'renk ht)
(maphash #'(lambda (x y) 
                (format t "~A = ~A ~%" x y))
        ht)

BİZİ BEKLEYENLER

Bir sonraki yazıda bizi kontrol blokları, şartlı ifadeler, iterasyonlar, durdurma, fonksiyonlar, closure kavramı, dinamik scope, derleme, giriş ve çıkış birimleri konuları bekliyor. Güzel bir yazı oldu (tamamı örnek). Bir sonraki de böyle olacak.