<< lekcja 3 | lekcja 5 >>
4. Set Quantity – setq i setf
We wczesnych dialektach Lispa istniała tylko funkcja SETQ, zaś uogólnione zmienne były niedostępne. Obecnie funkcja SETQ jest nadal używana, jednak w nowszych wersjach programiści używają raczej podobnego znaczeniowo makra SETF, które pozwala na przechowywanie w zarówno zwykłych zmiennych takich jak X, jak i w uogólnionych zmiennych takich jak (SECOND X).
4.1
(setq x ’(wartosc)) => (WARTOSC)
|
Funkcja SET, podobnie jak SETQ, wywodzi się z najwcześniejszych odmian Lispa. Jednak jej znaczenie zmieniło się. W Common Lisp SET zachowuje wartość w odpowiedniej komórce, a dokładniej ustawia symbol jako nazwę zmiennej globalnej, nawet jeżeli istnieje już zmienna lokalna o tej samej nazwie.
4.2 zmienna globalna KACZKA
(setf kaczka ’donald)
|
4.3 zmienna lokalna KACZKA
(defun test1 (kaczka)
(list kaczka
(symbol-value ’ kaczka)
)
)
(test1 ’kwak) => (kwak donald)
|
4.4 zmiana zmiennej globalnej KACZKA
(defun test2 (kaczka)
(set ’ kaczka ’daffy)
(list kaczka
(symbol-value ’ kaczka)
)
)
(test2 ’ kwak) => (kwak daffy)
kaczka => daffy
|
Specjalna forma SETF używa swojego pierwszego argumentu do zdefiniowania miejsca w pamięci, analizuje drugi argument i zapisuje wynik w wynikowej pozycji pamięci.
4.5
(setq tablica (make-array 3)) => #(NIL NIL NIL)
(aref tablica 1) => NIL
(setf (aref tablica 1) 3) => 3
tablica => #(NIL 3 NIL)
(aref tablica 1) => 3
(defstruct foo bar) => FOO
(setq tablica (make-foo)) => #s(FOO :BAR NIL)
(foo-bar tablica) => NIL
(setf (foo-bar a) 3) => 3
tablica => #s(FOO :BAR 3)
(foo-bar a) => 3
|
SETF jest również jedynym sposobem na ustawianie pól struktury lub tablicy.
<< lekcja 3 | lekcja 5 >> |