<< lekcja 17 | lekcja 19 >>
18. Równość obiektów
W LISP zmienne można porównywać na kilka sposbów. Każdy kolejny przedstawiony predykat równości
obiektów będzie prawdziwy, jeśli poprzednie predykaty też były prawdziwe dla zadanych zmiennych.
Osobno omówiony jest predykat =, służący do porównywania liczb.
18.1 eq
Predykat ten służy do porównywania symboli i obiektów przez adres. Ponieważ każdy symbol może mieć
tylko jedną reprezentację w pamięci, to dla identycznie wyglądających symboli predykat ten jest
zawsze prawdziwy. Podobnie jeżeli dwie zmienne wskazują ten sam obiekt w pamięci(np. gdzięki
zastosowaniu instrukcji setq), to predykat ten będzie prawdziwy dla takich obiektów.
W przypadku liczba sprawa wygląda inaczej. Liczby nie muszą mieć pojedynczej reprezentacji
w różnych implementacjach LISP i z tego względu predykata eq będzie zawodny w przypadku liczb.
Również dwie identycznie wyglądające listy, posiadające jednak inny adres w pamięci będę różne
dla predykatu eq.
18.1
> (eq 'a 'a) => t
> (eq 'a 'b) => nil
> (eq 1 1) => nil
> (eq 1 1.0) => nil
> (setq a '(1 2 3)) => (1 2 3)
> (setq b a) => (1 2 3)
> (eq a b) => t
> (setq b '(1 2 3)) => (1 2 3)
> (eq a b) => nil
|
18.2 eql
Predykat ten jest stosowany do badania liczb należących do jednego typu, np. całkowitego. Warto
zwrócić na niego uwagę, ponieważ jest standardowo stosowany w takich instrukcjach jak np. member.
Poza tą własnością nie różni się niczym od predykatu eq.
18.2
> (eql 'a 'a) => t
> (eql 'a 'b) => nil
> (eql 1 1) => t
> (eql 1 1.0) => nil
> (setq a '(1 2 3)) => (1 2 3)
> (setq b a) => (1 2 3)
> (eql a b) => t
> (setq b '(1 2 3)) => (1 2 3)
> (eql a b) => nil
|
18.3 equal
Predykat ten jest dobry do badania identycznie wyglądających obiektów, gdyż w przypadku,gdy
dwa obietky wyglądają identycznie, to wynik tego predykatu będzie prawdziwy. Mówiąc ściślej, jeśli
mamy dwie listy zawierające identyczne symbole, lecz posiadające inny adres w pamięci komputera,
to wynikiem zastosowania dla nich tego predykatu będzie prawda. Predykat ten jest oczywiście
wolniejszy od eq, dlatego do porównywania symboli znacznie lepisj jest używać tego drugiego.
18.3
> (setq a '(1 2 3)) => (1 2 3)
> (setq b a) => (1 2 3)
> (equal a b) => t
> (setq b '(1 2 3)) => (1 2 3)
> (equal a b) => t
|
18.4 equalp
Predykat ten jest jeszcze mniej restrykcyjny niż equal, poniewać dopuszcza by porównywane łańcuchy
miały różne wielkości liter, natomiast gdy łańcuchy mają identyczny wygląd (bez względu na wielkość
liter), to predykat ten zwraca wartość prawda.
18.4
> (equal "Ala ma kota" "Ala Ma Kota") => nil
> (equal "Ala ma kota" "Ala Ma Kota") => t
|
18.5 =
Predykat ten służy do porównyania liczb, bez względu na to do jakiego typu należą. Można więc
porównywać liczby całkowite z wymiernymi czy też rzeczywistymi. Jeśli ich wartość jest taka sama
to predykat ten zwraca wartość t. Nie można go jednak stosować do porónywania żadnych innych obiektów,
w szczególności symboli.
18.5
> (= 1 2) => nil
> (= 1 1.0) => t
> (= 1/2 0.5) => t
> (= 'a 'a) => nil
|
<< lekcja 17 | lekcja 19 >> |