Değişkenleri Yerelleştirme

Bu benim tecrübelerime göre, birçok yeni AutoLISP programcısının gözünden kaçmış bir uygulamadır ve bazen programlarında zorlu hatalarla sonuçlanır.

Bu makalemde sizlere, defun fonksiyonuna kısa bir bakış ve ayrıca yerelleştirilmiş değişkenlerin neden iyi bir alışkanlık olduğunu anlatacağım. İşleri netleştirmek için bu makalemde küçük ayrıntılara girmemeye çalıştım.

 

Defun Fonksiyonunun Arka Planı

 

defun fonksiyonu hakkında daha kapsamlı bir genel bilgi için, Visual LISP Editor’da (VLIDE) verilen yardım belgelerini okuyun.

Bir Fonksiyon Hakkında Bilgiler

defun fonksiyonu amacı isminden anlaşılır: “fonksiyonu tanımlama”. defun fonksiyonu, kullanıcının fonksiyonu adlandırmak için kullanılan sembolü yazarak komut satırından çağırdığı bir programı yaratmak veya belki de belirli bir görevi yerine getirmek için başka bir fonksiyon içinde çağrılabilecek bir alt fonksiyon oluşturmak için kullanılabilir.

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

(defun <symbol> ([arguments] [/ variables]) <expressions>)

Burada,

  • symbol (sembol) fonksiyonun adıdır (şayet bu adın önünde c: ön eki varsa, fonksiyon komut satırından çağrılabilir).
  • arguments, (argüman) çağrıldığında fonksiyonun gerektirdiği verileri temsil eden simgelerdir.
  • variables, (değişken) fonksiyon içerisinde veri tutmak için kullanılan simgelerdir.
  • expressions, (ifade) fonksiyonun kendisini oluşturan tüm ifadelerdir.

Örnekler

(defun test ( arg1 arg2 / var1 var2 ) ;; Fonksiyon iki yerel değişken ile iki argüman alıyor

   ;; İfadeler

(setq var1 (* arg1 2.0) var2 (+ arg2 3))

   (print ( var2 var1))

  (princ

) ;; defun fonksiyonu sonu

(defun c:MyCommand ( / a b c ) ;; Üç yerel değişkenli fonksiyon

   (setq a 1.0 b 2 c 3)

   (print ( b (/ a c)))

  (princ)

)

(defun myfunc ( x y ) … )         ;; Fonksiyon iki argüman alıyor

(defun myfunc ( / a b ) … )       ;; İki yerel değişkenli fonksiyon

(defun myfunc ( x / temp ) … )    ;; Bir argüman, bir yerel değişken

(defun myfunc ( ) … )             ;; argüman veya yerel değişken yok

Değişkenleri Niçin Yerelleştirmeliyiz?

Fonksiyon çağrılırken defun ifadesinin değişkenler “variables” argümanı içine bir sembol eklenirse, daha sonra bu simgeye bağlı herhangi bir veriyi tutmak için bellek alanı kullanılabilir hale getirilir ve ayrıca fonksiyon tamamlandıktan sonra veriler bu singe ilişkilendirilir; dolayısıyla simge artık fonksiyon çağrılmadan önce düzenlenen verilere işaret eder veya boş “nil” olmaz.

Her şeyden önce, bu kesinlikle temizleyici bir yöntemdir; çünkü fonksiyonun içinde ayarlanan tüm değişkenler daha sonra temizlenir ve bu nedenle değişken isimleri için aynı sembolleri kullanan diğer programlarla etkileşime girmez veya bellekte boş alan yaratılır.

Bunun Sonuçları Nelerdir?

Genellikle, programcılar yerelleştirilmiş veya yerelleştirilmemiş değişkenlerin bulunduğu bir fonksiyonun davranışında herhangi bir fark bulamazlar – ancak beklenmedik sonuçlar alabilecekleri birkaç durum vardır ve bazen böylesi hatalar ile baş etmek zordur.

Bu örneği ele alalım (Hiçbir değişkenin yerelleştirilmediğine dikkat edin):

(defun c:test ( )

   (foreach x ‘(1 2 3 4 5)    (setq lst (cons x lst))

  )

  (print lst)

  (princ)

)

Yukarıdaki kodu çalıştırdıktan sonra, komut satırında aşağıdakiler görüntülenecektir (neden sayıların tersten dizildiğini bildiğinizden emin olun):

(5 4 3 2 1)

Şimdi, aynı AutoCAD oturumunda, kodu tekrar çalıştırırsak, şunları elde ederiz:

(5 4 3 2 1 5 4 3 2 1)

Liste iki katına çıktı! Bunun nedeni, fonksiyonun tamamlanmasından sonra lst değişkeninin liste verilerini hala tutuyor olmasıdır. Bu nedenle, fonksiyon ikinci kez çalıştırıldığında mevcut listeye yeni değerler eklenir.

Bu kesinlikle önemli bir meseleyi vurguluyor, ancak yerelleştirilmiş değişkenler olmadan başka bir fonksiyona sahipsek, aynı sembolü bir değişken adı olarak kullansaydık ne olurdu?

(defun c:test ( )

   (foreach x ‘(“1” “2” “3” “4” “5”)

    (setq lst (cons x lst))

  )

   (print lst)

  (princ)

)

Yukarıdaki kodu çalıştırdıktan sonra, artık veri türlerinin bir karışımını içeren bir listemiz olacaktır – gerçekten listemiz gittikçe dağılıyor!

(“5” “4” “3” “2” “1” 5 4 3 2 1 5 4 3 2 1)

Bu sorunları önlemek için değişkenleri yerelleştiririz:

(defun c:test ( / lst )

   (foreach x ‘(1 2 3 4 5)

    (setq lst (cons x lst))

  )

 (print lst)

  (princ)

)

Artık, programı çalıştırdığımızda, lst değişkeninin değerinin her zaman tutarlı olacağından emin olabiliriz:

(5 4 3 2 1)

Hakkında Sertan Türkan

AutoCAD Beyni

Bunu da Kontrol edin

Revitte Nesne Stilleri için Alt Kategoriler Hakkında

Bir model öğeleri kategorisindeki ayrık geometrinin görünürlüğünü ve grafiklerini kontrol etmek için, alt kategoriler “subcategories“ …

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.