COND ve IF Koşullu İfadeleri

“Şimdiye kadar lisp’de yazdığım her COND ifadesi için kenara bir TL koysaydım zengin olurdum!”

Koşullu ifadeler için sadece IF fonksiyonunu kullanan birçok lisp rutini görüyorum. Bence bu, çoğu yeni AutoLISP programcısının programcılığa  IF ile başlaması ve asla COND fonksiyonunu kullanmaya geçmemesi ile çok ilgili. COND fonksiyonunu nasıl kullanacaklarını hiçbir zaman öğrenmediklerini söyleyen birkaç lisp programcısı ile konuştum ve COND fonksiyonunun yararsız ve gereksiz olduğunu düşünüyor gibiydiler.

COND fonksiyonu muhteşemdir Niçin mi?

COND fonksiyonunun temel sözdizimi şöyledir:

(cond ((koşul1) (bir şey yap1))     ;şayet bu koşul sağlanırsa,

                                                            ;bir şey yap1 ((koşul2)

(bir şey yap2))       ; şayet bu koşul sağlanırsa,

                                 ; bir şey yap 2, 

                                 ;her bir  koşul ve eylemin

                                 ;ilk koşul ve eylemi izlemesi

                                 ;isteğe bağlıdır (zorunlu değildir.)

 (t (else do this))     ;yoksa, şayet  koşulların hiç biri doğru (T) “true” olarak dönmezse

                                   ;bunu yap.) 

Bunu IF fonksiyonunun sözdizimiyle karşılaştırın:

(if (sadece bir koşul)                             ;şart çift negatif olsa bile doğru “true” olarak geri döndürmelidir.

(then bir şey yap)                                  ;şayet koşul doğru “true” ise,

bunu yap  (else bunu yap)                   ;bu isteğe bağlıdır 

                                                                  ;şayet bir else ifadesi varsa ve koşul doğru “true” geri

                                                                  ;döndürmezse, sonrasında ne olacağını tanımlar.)

Yalnızca bir koşula sahip IF fonksiyonu ile, then ve isteğe bağlı else ifadelşeri kullanılabilir. Bunların hepsi bir araya geldiğinde IF fonksiyonu mantıksal olarak oldukça güzel çalışır. Ben IF fonksiyonunu gruplanmış then veya else ifadeleri ile kullanıldığında tatsız buluyorum. Ayrıca, şayet birden fazla koşula ihtiyaç varsa, birlikte birkaç IF fonksiyonu kullanmak gerekiyor.

IF fonksiyonu, yalnızca then ve else ifadeleri yanlızca bir deyimi kabul edebildiğinden, birkaç ifadeyi tek bir ifade olarak gruplamak için PROGN fonksiyonunu kullanmanız gerekir:

(if (> angle 90)(progn                                       ;then ifadesi

(setq ed (subst (cons 8 “somelayer”) (assoc 8 ed) ed))              

(entmod ed)

(entupd en))                                                        ;_progn

(princ “\nHiç bir şey değiştirilmedi.”)          ;isteğe bağlı else ifadesi

)                                                            ;if fonksiyonu sonu

then” ifadesi, eğer “açı 90 dereceden büyüktür” ifadesi  doğruysa birkaç ifadeyi çalıştırmalıdır; şayet “açı 90 dereceden büyüktür”,  IF fonksiyonu yalnızca bir ifadeyle ilgili bir argümanı kabul ettiğinden, üç ifadeyi çalıştıramazsınız. PROGN fonksiyonunu kullanarak bu üç ifadeyi gruplanmış bir bildirime dönüştürebilirsiniz. Şimdi bunu aynı işlemle karşılaştıralım; ancak IF fonksiyonu yerine COND fonksiyonu ile yazalım:

(cond ((< angle 90)

(setq ed (subst (cons 8 “somelayer”) (assoc 8 ed) ed))

(entmod ed)

(entupd en)              

)              ;birinci then ifadesinin sonu              

(t(princ “\n Hiç bir şey değiştirilmedi.”))                             ;isteğe bağlı else ifadesinin sonu

)                             ;cond fonksiyonunun sonu

Burada bir grupta biden fazla ifadenin yapay bir grup haline getirilmesi yoktur. Şayet  PROGN fonksiyonu  için parantezi kapatmayı unutursanız, bu COND ifadesi başarısız olmayacaktır! Yukarıdaki örnekte, COND fonksiyonunu kullanmayı daha mantıklı bir uygulama olarak görüyorum ve bu nedenle “yapılması gereken doğru şey budur“. Unutmayın, programcılar mantığa göre kendi kodlarında yaşar ve ölürler. IF fonksiyonu yerine COND fonksiyonunu kullanmayı düşünmenin kesinlikle birçok  nedeni var; ama bir tane daha yazayım: bir COND ifadesinde birden fazla koşul kullanabilirsiniz!

(cond ((and (>= angle 0) (<= angle 90)

               (setq ed (subst (cons 8 “somelayer”) (assoc 8 ed) ed))

               (entmod ed)

               (entupd en))

                             ;birinci then ifadesinin sonu

((and (> angle 90) (<= angle 180)

               (ifade 1)

               (ifade 2)

               (ifade 3)

               (ifade 4))

              ;ikinci then ifadesinin sonu

               ((and (> angle 180) (<= angle 270)

               (statement a)

               (statement b)

               (statement c)

               (statement d)

)              ;üçüncü then ifadesinin sonu

               ((and (> angle 270) (< angle 360)

               (statement x)

               (statement y)

               (statement z)

               (statement 0)

)              ;dördüncü then ifadesinin sonu

) ; cond fonksiyonun un sonu

Bir COND bildiriminde karşılanabilecek dört ayrı koşul vardır. Bununla birlikte eşdeğer IF ifadesi dört ayrı IF bildirimi gerektirir. Ayrıca, koşullar sıralı olarak değerlendirildiğinden, bu size bir avantaj sağlayacaktır. Bazı durumlarda, her koşul için her ayrıntıyı tam olarak tanımlamak zorunda kalmazsınız:

(setq angdir 354)

(cond ((< angdir 90)

               (princ “\ncond1”)

)               ((< angdir 180)

     (princ “\ncond2”)

     )     ((< angdir 270)

     (princ “\ncond3”)

     )     ((< angdir 360)

     (princ “\ncond4”)     )

)              ; cond fonksiyonun un sonu

Ve son olarak, mümkün olduğunca COND fonksiyonu kullanmanın bir başka nedeni. Şimdiye kadar başlangıçta  belirtilen bir şarta tamamen bağlı bir lisp rutini hiç gördünüz mü? Kodun büyük bir kısmını bir COND ifadesinin içine koymayı düşünün. Sonra bu koşul karşılanmazsa, rutin, bir hata çağrısı yapabilen EXIT veya QUIT fonksiyonlarını çalıştırmaya gerek kalmadan sessizce sonlanır. Bir çizimde birkaç şey yapmak isteyebilirim, ancak tüm süreç belirli bir çizim bloğunun yerleştirilmesine  bağlı olabilir:

(defun C:TEST (/)

(setq ss (ssget “X” ‘((0 . “insert”)(2 . “e1_title”))))

(cond (ss                ;şayet bir seçim seti mevcutsa, devam et

               (statement 1)

               (statement 2)

               … ad infinitum               (statement 455)

               )

               (t             ;değilse, hata bildirimi yapmadan rutini sonlandır.

(princ “\nA0_antet biçimi bulunamadı, devam edilemiyor, lisp sonlandırılacaktır!”)

               )

)              ; cond fonksiyonunun sonu

(princ)

)              ;C:TEST rutininin sonu

IF ifadelerinin yerlerinde olduğuna emin olmalısınız. Basit bir IF fonksiyonu yazarak çözebileceğimiz sorunları bir COND fonksiyonu yazarak çözmek için bir neden yoktur:

(if (null tfstd)

     (load “tfstd” “\nTFSTD.LSP dosyası destek dosya araştırma klasör yolunda bulunamadı.”)

)

(tfstd)

Yukarıdaki örnek, bir COND fonksiyonu kullanılarak yazmaya çalışılsaydı çok mantıklı olmazdı. Gördüğümüz gibi, sadece bir IF fonksiyonu ile halledilebilecek zamanlar olduğu gibi bazen de  sadece COND fonksiyonun kullanılmasını gerektiren zamanlar vardır. Sorun, AutoLISP programcılarının her koşullu ifadeyi IF fonksiyonuyla ele almaya çalıştıklarında ortaya çıkar. Elbette, aynı tür işlevsel yanılsamalara ilişkin başka örnekler de gösterebilirim; ancak bu tür tuzakları önlemenin en iyi yolu denemek, denemek, denemek ve yeni bir şey öğrenmek için başkalarının yazmış olduğu kodları incelemektir.

 

Hakkında Sertan Türkan

AutoCAD Beyni

Bunu da Kontrol edin

Revitte Kompozit Duvarların Yönünü Çevirme

REVIİT’te bir duvarın yönü (iç/dış yüzü) yerleştirilirken veya yerleştirildikten sonra değiştirilebilir. Duvar, duvarın konum çizgisi …

Bir cevap yazın

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.