Примітивні об’єкти даних
Примітивними об’єктами даних є символи, числа та конси. muLisp має безліч функцій розпізнання, порівняння, комбінування та обробки цих об’єктів. Це дозволяє конструювати будь-які складні об’єкти даних. Як було сказано раніше, muLisp має два типи даних: атоми та списки. Атоми поділяються на символи та числа. Списки є підмножиною об’єктів, які мають більш загальну структуру — бінарне дерево. Вони створені за допомогою консів.
Символ є об’єктом даних, з яким пов’язано 4 атрибути, кожен з яких є вказівником на:
— PRINT - ім’я. Це унікальний рядок ASCII символів, за допомогою якого система ідентифікує символ при операціях введення-виведення. PRINT - ім’я не може бути змінене. Імена обмежені за розміром: вони повинні мати не більше від 65536 символів.
— поточне значення. Значенням символа може бути будь-який об’єкт даних, який зберігається в комірці пам’яті. Якщо в середовищі Ліспу ввести PRINT-ім‘я символу, то на виході буде його значення. Поточне значення доступно як CAR - елемент символа.
— список властивостей. Він містить значення властивостей символа, проіндексованих за ключем, його форма має вигляд: (ім’я1 значення1 ім’я2 значення2 ... ім’яN значенняN). При ініціалізації системи список властивостей є порожнім (дорівнює NIL). Його можна змінити за допомогою функцій властивостей та прапорців. Доступний як CDR - елемент символа.
— визначення функції. При створенні символу в muLisp цей атрибут дорівнює "функція невизначена". Визначення функції складається або за шаблонами машинної мови, або на D-коді. Значення цього атрибута можна отримати в результаті виконання функції флагів (GETD символ).
SYMBOLP є функція, яка розпізнає символ. Вона повертає Т, якщо аргумент є символом і NIL в протилежному випадку.
$ (SYMBOLP ‘XYZ)$ (SYMBOLP 41)
TNIL
$ (SYMBOLP ‘(q w))$ (SYMBOLP ‘())
NILT
В Коммон Ліспі (файл common.lsp) визначені функції SYMBOL-VALUE, яка повертає значення символа, та функція SYMBOL-PLIST, яка повертає весь список властивостей символа.
(DEFUN SYMBOL-VALUE (SYM)(DEFUN SYMBOL-PLIST (SYM)
((SYMBOLP SYM) (CAR SYM) ) )((SYMBOLP SYM) (CDR SYM) ) )
Узагальненою функцією присвоєння є SETF, яка визначена в common.lsp. Вона заносить данні в комірку пам’яті символа: (SETF <комірка пам’яті> <значення>). Через функцію SETF можна представити описані раніше функції SET та SETQ.
(SETQ x y) це(SETF x y)
(SET x y)це(SETF (SYMBOL-VALUE x) y)
Проміжки, дужки, коми, одинарні та подвійні лапки, крапка, крапка з комою відіграють спеціальну роль в Ліспі. Одинарним Escape-символом є \. Багатократним Еscape-символом є |. Спеціальні літери можуть використовуватися у PRINT-іменах символів, але для цього перед ними треба ставити \, або весь рядок брати в |. Вирази |q w e| та |sym(bol| є символами. Для використання літер \ та | в символах необхідно ставити перед ними \. Якщо виводиться на екран символ, який містить спеціальні літери, то він виводиться з багатократним escape-символом. Програмна змінна *PRINT-ESCAPE* булевського типу відповідає за виведення escape-символів. Якщо вона дорівнює NIL, то escape-символи на екран не виводяться. Подвійні лапки " грають роль літери |. Розглянемо приклади (спочатку *PRINT-ESCAPE*=T):