AutoLISP’de bir sembol için bir değer oluşturma işlemi atama olarak adlandırılır. Atama yapmak için ortak yöntem SETQ fonksiyonunu kullanmaktır. Atama, ikinci argümanının değerini, bir simge olması gereken argümanının birinci değeri haline gelmesine neden olur. Sembol, örtük olarak bildirilen bir sözcük olan değişkendir.
SET fonksiyonu, SETQ fonksiyonunun yaptığı gibi ilk argümanı değerlendirmenin haricinde SETQ fonksiyonu gibidir. Bu nedenle, birinci argüman, dinamik bir değişkenin (değeri dinamik olarak oluşturulan değişken) değeri olarak değerlendirilmelidir. Diğer fark, SET fonksiyonu yalnızca iki argüman almasıdır.
Aşağıdaki atamaları inceleyin:
(setq a var) a sembolünü var olarak ayarlar. var sembolü tanımlı değildir.
(set a 2) a sembolünün değerini değerlendirir ve bu değerlendirmenin sonucunu 2 olarak ayarlar.
(princ var) 2 olarak geri döner. var sembolü artık tanımlanmış ve 2 olarak ayarlanmıştır.
SET fonksiyonunu kullanarak atama yapmanın ortak kullanımı; simgeleri çalışma anında tanımlamaktır ve öğe sayısı önceden bilinmiyorsa, bazen liste oluşturma yönteminden daha etkilidir. Bunun bir örneği olarak, aşağıdaki lisp rutini değişken sayıda nokta alır; bu noktaları Y koordinatlarına göre sıralar ve sıralanmış noktaları kullanarak bir çizgi çizer.
(defun c:test ( / j lpt symb)
(setq j 1)
(while (set (read (strcat “point_” (itoa j)))
(getpoint “\nNokta : “)
)
(setq j (1+ j))
)
; Son nokta boş tur “nil”.
(setq j (1- j))
;Noktaları sıralar. Aşağıdaki ” sortpoints” fonksiyonuna bakın.
(sortpoints j)
;(command “_line”) fonksiyonuna aktarılacak noktalar listesini hazırlama
(setq lpt (list “”))
;Listeyi oluşturma ve;sembolleri anında boş “nil” olarak ayarlama
(while (> j 0)(setq
symb (read (strcat “point_” (itoa j)))
lpt (cons (eval symb) lpt))
(set symb nil)(setq j (1- j)))
; çizgiyi çizme(command “_line”)(mapcar ‘command lpt)
(princ)
)
;Bu fonksiyon noktaları Y koordinatlarına göre sıralar.
(defun sortpoints (j / i cur_y prev_y cur_symb prev_symb point)(setq i 2)
(while (<= i j)
(setqcur_symb (read (strcat “point_” (itoa i)))
prev_symb (read (strcat “point_” (itoa (1- i))))
cur_y (cadr (eval cur_symb))
prev_y (cadr (eval prev_symb))
)
(if (> cur_y prev_y)(progn
(setq point (eval prev_symb))
(set prev_symb (eval cur_symb))
(set cur_symb point)
(if (/= i 2) (setq i (1- i))))(setq i (1+ i))
)
)