В программировании на языке Лисп используются символы и построенные из них символьные структуры. В соответствии со словарным определением, символом (греч. "symbolon", знак) является опознавательный знак, условное обозначение, художественный образ, обозначающие какую-нибудь мысль, идею и т.п. В Лиспе понятие символа используется в более узком и точном смысле: под ним подразумевается запись или обозначение.
Символ - это имя, состоящее из букв, цифр и специальных знаков, которое обозначает какой-нибудь предмет, объект, вещь, действие из реального мира. В Лиспе символы обозначают числа, другие символы или более сложные структуры, программы (функции) и другие лисповские объекты. Например, символ "+" может обозначать определение действия сложения, "углерод-14" - изотоп углерода и т.п.
Примеры символов:
x
Символ
defmacro
STeP-1984
Символы языка могут состоять из букв, цифр и некоторых других знаков, а именно
+ - * / @ $ % ^ & _ \ < > ~.
В принципе, вопросительный и восклицательный знаки, так же как тильда (~), и квадратные скобки тоже могут входить в состав символов, но эти знаки лучше приберечь для специального использования.
Символы могут состоять как из прописных, так и из строчных букв, хотя в большинстве Лисп-систем, как и в описываемом диалекте, прописные и строчные буквы отождествляются и представляются прописными буквами. Поэтому, например:
слово ≡ Слово ≡ СЛОВО
Наряду с символами в Лиспе используется и числа, которые, как и символы, записываются при помощи ограниченной пробелами знаками. Числа все же не являются символами, так как число не может представлять иные лисповские объекты, кроме самого себя, или своего числового значения. Числа отличаются от символов способом записи.
Символы true, false и nil имеют в Лиспе специальное назначение: true обозначает логическое значение истина, false - ложь, nil - ничего. Символом nil обозначается также и пустой список. Эти символы имеют всегда одно и то же фиксированное встроенное значение. Их нельзя использовать в качестве имён других лисповских объектов.
Логические значения true, false и nil являются константами, остальные символы - переменными, которые используются для обозначения других лисповских объектов.
Символы, числа, строки и другие встроенные объекты языка представляют собой те простейшие объекты, из которых строятся остальные структуры. Поэтому их называют атомарными объектами или просто атомами.
Атомы и списки - это основные типы данных языка. В естественном языке под списком понимают перечень. Список в Лиспе это упорядоченная последовательность, элементами которой являются атомы либо списки. Списки заключаются в круглые скобки, элементы списка разделяются пробелами. Список всегда начинается с открывающей скобки и заканчивается закрывающей скобкой. Например, следующий список состоит из трёх символов и одного подсписка, который в свою очередь состоит из двух атомов:
(x y (z 1) z)
Список это многоуровневая структура данных, в которой открывающие и закрывающие скобки находятся в строгом соответствии. Например, приведённые ниже выражения являются правильно составленными списками:
(+ 2 3) - список из трёх элементов
(((((первый) 2) третий) 4) 5) - список из двух элементов
В следующих списках соответственно 5 и 4 элемента:
(Добрый день сказал бородатый мужчина)
(кот-37 (кличка Петя) (цвет ?) (хвост nil))
Список, в котором нет ни одного элемента, называется пустым списком и обозначается () или символом nil. Пустой список - это не то же самое, что "ничего". Он выполняет ту же роль, что и нуль в арифметике. nil может быть, например, элементом других списков:
nil ≡ ()
(nil) ≡ список, состоящий из атома nil
(()) ≡ (nil)
((())) ≡ ((nil))
(nil ()) ≡ список, состоящий из двух пустых списков
Списки можно использовать для представления всевозможных знаний. Например, для характеристики героя комиксов Zippy the Pinhead подошло бы следующее выражение:
(герой-56
(имя Zippy)
(кличка Pinhead)
(язык английский)
(приметы
(голова грушевидная)
(волосы редкие))
(встречается Лисп-машины и комиксы))
Запись в виде списка гибка, свободна по форме и одновременно достаточно точна и понятна. Как видно из примера, такая запись с раскрывающим структуру расположением текста помогает получить общее представление о структуре и вникнуть в нее. При вводе выражений в Лисп-систему пустые строки, пробелы и расположение текста игнорируются.
Планирование способа представления данных и знаний и решение проблемы их изображения являются важнейшими моментами при программировании на языке Лисп. Речь идет о нахождении способа записи, который бы облегчал программирование и был естественен как для описания задачи, так и для работы с данными. Часто удаётся предложить форму записи, в какой-то мере аналогичную самой задаче и позволяющую упростить дальнейшую работу.
Программируя на языке Лисп, задачу обычно пробуют разбить на более простые составляющие. В структуре данных пытаются максимально отобразить всё, что известно о задаче, и, таким образом, упростить программирование. Это позволяет добавлять в систему новые знания, не меняя программу, применять ту же программу с разными знаниями и решать сложные задачи с помощью простых программ.
Одним из основных отличий языка Лисп от традиционных языков программирования является запись в виде списков не только данных, но и программ. Например, список (2 + 3) можно интерпретировать в зависимости от окружения и использования либо как действие, дающее в результате число 5, либо как список, состоящий из трех элементов. Способ интерпретации определяется положением выражения и алгоритмом функционирования Лисп-системы.