LISPouczek



STRONA SAMOUCZKA JĘZYKA LISP  



powered by FreeFind
główna

lekcje

odnośniki

pliki
<< 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 >>