12 Eylül 2007 Çarşamba

Liste Fonksiyonları

;asagidaki kod 'lisp puzzle contest' odulunu alan Serge Volkov'a aittir.
(defun remove (expr lst)
(apply 'append (subst nil (list expr) (mapcar 'list lst))))
;Örnek :
(setq alist (list 1 2 3 4 5))
(remove 3 alist)
;Sonuc :
(1 2 4 5)

;;;çizimdeki layer'ların bir listesini verir.
;;;sonuç : ((açık layer listesi) (OFF layer listesi) (FROZEN layer listesi))
(defun layer_listesi( / elist OPEN_list OFF_list FROZEN_list durum)
(setq elist (tblnext "LAYER" T))
(while elist
(setq durum (cdr (assoc 70 elist)))
(cond
((or (= 1 durum) (= 2 durum)) (setq FROZEN_list (append FROZEN_list (list (cdr (assoc 2 elist))))))
((minusp (cdr (assoc 62 elist))) (setq OFF_list (append OFF_list (list (cdr (assoc 2 elist))))))
(t (setq OPEN_list (append OPEN_list (list (cdr (assoc 2 elist))))))
)
(setq elist (tblnext "LAYER" nil))
)
(list OPEN_list OFF_list FROZEN_list)
);_layer_listesi
; Örnek Kullanım:
(layer_listesi)
(("0" "layer1" "layer2") ("layer3") ("layer4" "layer5))
; layer_listesi fonksiyonunu çalıştırdığımızda elde edilen sonuca göre; "0","layer" ve "layer2" isimli layer'lar açık (OPEN), "layer3" isimli layer OFF, "layer4" isimli layer ise FREEZE durumundadir.

Visual Lisp'te listelerde siralama fonksiyonu olarak vl-sort kullanilir.
Örnek :
(setq liste1 (list 5 2 7 3 8))
(vl-sort liste1 '<)
Sonuc :
(2 3 5 7 8)
Burada vl-sort fonksiyonuna verdigimiz 1. parametre siralamak istedigimiz liste, 2. parametre de karşılaştırma fonksiyonudur. Burada karşılaştırma fonksiyonu olarak <> fonksiyonunu ya da kendi tanımladığımız başka bir karşılaştırma fonksiyonunu kullanabiliriz.

Ancak; elimizde, sayı çiftlerini içeren şöyle bir liste olsun:
(setq liste2 (list (list 15 7) (list 9 12) (list 38 4)))
((15 7) (9 12) (38 4))
Biz bu listeyi, sayi ciftlerinden 1.sine göre sıralamak isteyelim. Bunu vl-sort fonksiyonu ile yapmak istersek:
(vl-sort liste2 '<)
; error: bad argument type for compare: (38 4) (9 12)
gibi bir hata ile karşılaşırız. Çünkü karşılaştırma fonksiyonu olarak verilen < fonksiyonu; (38 4) ve (9 12) gibi bir yapıyı karşılaştırmak istemiş ve bunun mümkün olmadığını bildiren bir hata mesajını bildirmiştir.

Bunu aşmak için kendi karşılaştırma fonksiyonumuzu tanımlamamız gereklidir.
(defun karsilastir(a b)
(< (car a) (car b))
)
sonra yazdığımız fonksiyonu kullanarak vl-sort ile sıralayalım:
(vl-sort liste2 'karsilastir)
((9 12) (15 7) (38 4))

Aynı şeyi, yeni bir fonksiyon tanımlamak yerine lambda fonksiyonu ile yapabiliriz.
(vl-sort liste2
(function (lambda (a b)
(< (car a) (car b))
)
)
)
((9 12) (15 7) (38 4))
aynı sonucu elde ettik.
Burada; daha önce karsilastir ismiyle tanımladığımız fonksiyonu vl-sort içinde lambda fonksiyonu olarak tanımladık. Lambda fonksiyonunu kullanarak, bir daha işimize yaramayacak bir fonksiyonu (karsilastir fonk.) ayrıca tanımlamaktan kurtulduk ve yazdığımız kod daha okunur/anlaşılır bir kod oldu.
Lambda fonksiyonları Lisp programlama dilinin en güzel özelliklerinden biridir ve burada yalnızca basit bir kullanım örneği verilmiştir.

Hiç yorum yok: