LISP - Symbole

W LISP, symbol to nazwa, która reprezentuje obiekty danych i co ciekawe, jest również obiektem danych.

To, co sprawia, że ​​symbole są wyjątkowe, to fakt, że mają one składnik o nazwie property listlub plist.

Listy nieruchomości

LISP umożliwia przypisywanie właściwości do symboli. Na przykład, mamy obiekt „osoba”. Chcielibyśmy, aby obiekt „osoba” miał takie właściwości jak imię i nazwisko, płeć, wzrost, waga, adres, zawód itp. Właściwość jest jak nazwa atrybutu.

Lista właściwości jest zaimplementowana jako lista z parzystą liczbą (możliwie zero) elementów. Każda para elementów na liście stanowi wpis; pierwsza pozycja toindicator, a drugi to value.

Kiedy tworzony jest symbol, jego lista właściwości jest początkowo pusta. Właściwości są tworzone przy użyciuget w granicach setf Formularz.

Na przykład poniższe instrukcje pozwalają nam przypisać właściwości tytuł, autora i wydawcę oraz odpowiednie wartości do obiektu o nazwie (symbol) „książka”.

Przykład 1

Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.

(write (setf (get 'books'title) '(Gone with the Wind)))
(terpri)
(write (setf (get 'books 'author) '(Margaret Michel)))
(terpri)
(write (setf (get 'books 'publisher) '(Warner Books)))

Po wykonaniu kodu zwraca następujący wynik -

(GONE WITH THE WIND)
(MARGARET MICHEL)
(WARNER BOOKS)

Różne funkcje listy właściwości umożliwiają przypisywanie właściwości, a także pobieranie, zastępowanie lub usuwanie właściwości symbolu.

Plik getfunkcja zwraca listę właściwości symbolu dla danego wskaźnika. Ma następującą składnię -

get symbol indicator &optional default

Plik getfunkcja wyszukuje listę właściwości danego symbolu dla określonego wskaźnika, jeśli zostanie znaleziona, zwraca odpowiednią wartość; w przeciwnym razie zwracana jest wartość domyślna (lub nil, jeśli nie określono wartości domyślnej).

Przykład 2

Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.

(setf (get 'books 'title) '(Gone with the Wind))
(setf (get 'books 'author) '(Margaret Micheal))
(setf (get 'books 'publisher) '(Warner Books))

(write (get 'books 'title))
(terpri)
(write (get 'books 'author))
(terpri)
(write (get 'books 'publisher))

Po wykonaniu kodu zwraca następujący wynik -

(GONE WITH THE WIND)
(MARGARET MICHEAL)
(WARNER BOOKS)

Plik symbol-plist funkcja pozwala zobaczyć wszystkie właściwości symbolu.

Przykład 3

Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.

(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)

(terpri)
(write (symbol-plist 'annie))

Po wykonaniu kodu zwraca następujący wynik -

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)

Plik remprop funkcja usuwa określoną właściwość z symbolu.

Przykład 4

Utwórz nowy plik kodu źródłowego o nazwie main.lisp i wpisz w nim następujący kod.

(setf (get 'annie 'age) 43)
(setf (get 'annie 'job) 'accountant)
(setf (get 'annie 'sex) 'female)
(setf (get 'annie 'children) 3)

(terpri)
(write (symbol-plist 'annie))
(remprop 'annie 'age)
(terpri)
(write (symbol-plist 'annie))

Po wykonaniu kodu zwraca następujący wynik -

(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT AGE 43)
(CHILDREN 3 SEX FEMALE JOB ACCOUNTANT)