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

(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.

(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.

(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

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.

'(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.
" Lisp Notları: Listeler, Kümeler, Diziler, Vektörler, Stringler, Structlar " için 5 Yorum
Teşekkürler ben de yazmayı düşünüyorum zaman meselesi..
teşekkürler Kemal yazmayı düşünüyorum zaman bulamıyorum biraz
Daha iyisini yazarım ben de
lisp ile ilgili notlarınıza devam etmenizi isterim. güzel çalışma olmuş. hobi olarak ilgileniyorum. gözümden kaçan ayrıntıları yazmışsınız.
tÅŸkler.