1372826956:AAFe2Py65GSQkfGiRnXuOQ-eD9yXcwMv988

AutoLisp’te Mapcar & Lambda Fonksiyonları

Benim tecrübelerime göre mapcar ve lambda fonksiyonları, AutoLISP programlama dilinde en az anlaşılmış fonksiyonlardan ikisidir; ancak doğru anlaşıldığında ve doğru kullanıldığında, gereksiz kodları değiştirebilir ve listelerle uğraşmak için güçlü fonksiyonlar halini alırlar.

Mapcar Fonksiyonu

Basitçe söylemek gerekirse mapcar, bir veya daha fazla listenin her bir öğesinde bir fonksiyonu değerlendirecek ve her bir değerlendirmenin sonucunun bir listesini geri döndürecektir.

mapcar fonksiyonu şu şekilde kullanılır:

(mapcar <Function> <list-1> <list-2> … <list-n>)

Burada Function, verilen listelerdeki her bir öğe üzerinde değerlendirilecek bir fonksiyondur; Bu, kullanıcı tarafından tanımlanmış veya başka türlü herhangi bir sayıda argüman alarak herhangi bir fonksiyon olabilir.

list-1 … list-n, değerlendirilecek fonksiyon tarafından gerekli argüman sayısına eşit sayıda listedir. Dolayısıyla, tek bir bağımsız değişken gerektiren, örneğin strcase gibi bir fonksiyonu ile kullanılırsa, yalnızca bir liste sağlanmalıdır.

Buraya kadar olan açıklamaları örnekler ile açıklığa kavuşturayım:

Örnek 1

Aşağıdaki dizge listesine sahip olduğumuzu varsayalım:

(“mustafa” “ben” “dilek” “koray”)

Bu dizelerin her birini büyük harfe dönüştürmek istediğimizi varsayalım.

Bu işi birkaç farklı şekilde yapabiliriz. Örneğin, foreach  fonksiyonunu kullanarak listeyi karıştırıp yeni bir büyük dizge listesi oluşturabiliriz:

(foreach str (reverse ‘(“mustafa” “ben” “dilek” “koray”))

    (setq lst (cons (strcase str) lst))

)

Böylece, lst değişkeninin sonuç değeri şöyle olacaktır:

_$ lst

(“MUSTAFA” “BEN” “DILEK” “KORAY”)

Bununla birlikte, aynı iş, mapcar  fonksiyonu kullanarak çok daha kısa olarak gerçekleştirilebilir:

_$ (mapcarstrcase ‘(“mustafa” “ben” “dilek” “koray”))

(“MUSTAFA” “BEN” “DILEK” “KORAY”)

Büyük harfe dönüştürürken, strcase  fonksiyonu tek bir argüman (bir dize) gerektirdiğinden, yalnızca bir liste sağlanır: bu da büyük harfe dönüştürülecek dizelerin listesidir.

Sonuç olarak, mapcar fonksiyonu strcase  fonksiyonu için sağlanan listenin her bir öğesi için fonksiyonu değerlendirir – bu aşağıdakine eşdeğerdir:

_$ (list (strcase “mustafa”) (strcase “ben”) (strcase “dilek”) (strcase “koray”))

(“MUSTAFA” “BEN” “DILEK” “KORAY”)

Ayrıca, mapcar  fonksiyonunu çıktıları önünde kesme işareti ()bulunan strcase fonksiyonuna aktarılır; böylece strcase  sembolü değerlendirilmez; ancak mapcar  fonksiyonu için bir argüman olarak ele alınır. Bu da, aşağıda görüldüğü üzere quote  fonksiyonu tırnak kullanarak elde edilebilir:

_$ (mapcar (quote strcase) (quote (“mustafa” “ben” “dilek” “koray”)))

(“MUSTAFA” “BEN” “DILEK” “KORAY”)

Veya function ifadesini bir fonksiyon olarak deklare etmek için strcase  fonksiyonunu kullanarak:

_$ (mapcar (Function strcase) (quote (“mustafa” “ben” “dilek” “koray”)))

(“MUSTAFA” “BEN” “DILEK” “KORAY”)

Birden Fazla Agümana Sahip Fonksiyonlar

Yukarıdaki Örnekte gösterilen strcase  fonksiyonu için büyük harfe dönüştürülecek bağımsız değişken gerektiren yalnızca tek bir liste sağlanmıştır. Peki, birden çok argüman gerektiren bir fonksiyonu kullanmak istiyorsak ne olur?

Örnek 2

İki listenin öğelerini birleştiren aşağıdaki Örneğe bir göz atın:

_$ (mapcar + ‘(1 2 3 4 5) ‘(3 4 5 6 7))

(4 6 8 10 12)

Burada mapcar, sayısal argümanlardan herhangi birisini alıp bir araya getiren + fonksiyonu ile birlikte verilir. Dolayısıyla yukarıdaki Örnek’te mapcar, her bir listenin her bir üyesinin + fonksiyonu bölümünü değerlendirecek ve sonuçların bir listesini geri döndürecektir:

(4 6 8 10 12) = ((+ 1 3) (+ 2 4) (+ 3 5) (+ 4 6) (+ 5 7))

Şayet sağlanan listelerin uzunluğu eşit değilse, en kısa liste işlendiği zaman, mapcar, değerlendirme işlemini durduracaktır. Örneğin:

_$ (mapcar + ‘(1 2 3 4 5) ‘(3 4 5))

(4 6 8)

Lambda Fonksiyonu

Haydi, orijinal dizgi listemize geri dönelim:

(“mustafa” “ben” “dilek” “koray”)

Her bir dizedeki kelimeyi ilk harfi büyük harfle yazılmış olacak şekilde bir başlık dizinine’ dönüştürmek istediğimizi varsayalım. Örneğin:

(“Mustafa” “Ben” “Dilek” “Koray”)

foreach  fonksiyonunu kullanarak bir yöntem daha uygulayabilir ve listemizi karıştırabiliriz:

 

(foreach str (reverse ‘(“mustafa” “ben” “dilek” “koray))

    (setq lst (cons (strcat (strcase (substr str 1 1)) (substr str 2)) lst))

)

Ancak, listeyi tersine çevirmeme ve ek değişkenleri dahil etmeyi önlemek için mapcar  ifadesini de kullanabiliriz. Bununla birlikte, LISP’de bir sözcüğün ilk harfini büyük harfle kullanmamıza izin veren bir fonksiyon yoktur; bu nedenle, bir fonksiyon ile mapcar  ifadesini nasıl değerlendirmeliyiz?

mapcar  ifadesine verilen fonksiyon, keyfi bir şey olduğundan, olası bir çözüm, kendimizin bir fonksiyon tanımlaması ve tedarik etmesi olabilir:

(defun titlecase ( str )

    (strcat (strcase (substr str 1 1)) (substr str 2))

)

_$ (mapcar ‘titlecase ‘(“mustafa” “ben” “dilek” “koray”))

(“Mustafa” “Ben” “Dilek” “Koray”)

Burada, tek bir bağımsız değişken str değişkenini alan ve bu bağımsız değişkenin değerini büyük harfle döndüren bir fonksiyon olan titlecase fonksiyonunu tanımladık.

Fakat bu şimdi, kodumuzda yalnızca bir kez kullanılabilecek ve kodun herhangi bir yerinde bulunabilecek; bu sebeple kodumuzu daha az okunabilir hale getirilebilecek ek bir fonksiyon tanımına sahip olduğumuz anlamına geliyor. Bu görevi yerine getirmenin daha iyi bir yolu, lambda fonksiyonunu kullanmak olacaktır.

 

lambda fonksiyonu, isimsiz bir fonksiyon tanımlar (şayet isterseniz, defun  fonksiyonu bir isim içermez) ve yeni bir fonksiyon tanımlar.

(mapcar ‘(lambda ( s ) (strcat (strcase (substr s 1 1)) (substr s 2))) ‘(“mustafa” “ben” “dilek” “koray”))

Anonim lambda fonksiyonu tarafından gerçekleştirilen işlemler kodun akışıyla uyumlu olduğu için, kod artık çok daha anlaşılır durumdadır.

İlave Örnekler

mapcar ve lambda fonksiyonları en iyi şekilde örneklerle gösterilmekte ve anlaşılmaktadır, bu nedenle burada sizin için biraz daha araştırma yapacağım:

Örnek 3

Bir listenin her bir elemanına bir öğe ekleme:

_$ (mapcar1+ ‘(1 2 3 4 5))

(2 3 4 5 6)

Örnek 4

defun fonksiyonunu kullanarak bir listenin her bir elemanına iki öğe ekleme:

(defun addtwo ( x ) (+ x 2))

_$ (mapcar addtwo ‘(1 2 3 4 5))

(3 4 5 6 7)

lambda fonksiyonunu anonim olarak kullanarak:

_$ (mapcar ‘(lambda ( x ) (+ x 2)) ‘(1 2 3 4 5))

(3 4 5 6 7)

 

 

Hakkında Sertan Türkan

AutoCAD Beyni

Bunu da Kontrol edin

Revitte Kırılmış Kesit Çizgilerinin Çizgi Stilini Kontrol Etme

Revit’te kesit çizgisinin çizgi stilini Aralıklı çizgi tipinden Sürekli çizgi tipine değiştirebilirsiniz. Bunun için: Yönetim …

Bir cevap yazın

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Yardıma mı ihtiyacınız var? Chat with us
Bir görüşme başlatmak için lütfen önce gizlilik politikamızı kabul edin.