
Введение в Common Lisp: Основы языка и работа со списками
Вот и готова новая статья по основам языка Lisp, старался сделать всё довольно кратко. Перед прочтением этой статьи советую прочитать Введение в Common Lisp: Установка и первый запуск . Я изложил более компактное содержание нескольких глав книги "МИР ЛИСПА. Т.1"
Символы могут состоять из букв, цифр, других знаков. Также символы могут быть как и строчные, так и прописные. Lisp, прописные и строчные буквы отождествляются и представляются прописными буквами:
devhead.ru <=> DEVHEAD.RU
На ряду с символами используются числа:
123 ; Целое число
12.3 ; Десятичное число
1.23Е4 ; число, представленное мантиссой и порядком
Логические значения
Логические значения True и False, нам известны из многих языков программирования, но в место привычных значений в Лиспе используют T и NIL.
T <== True (истина)
NIL <== False (ложь)
Построение списков из атомов и подсписков
Символы и числа представляют собой те простейшие объекты Лиспа, из которых строятся остальные структуры. Поэтому их называют атомами (atom). Списки являются основными типами данных в языке Лисп, списки могут содержать атомы, а могут и содержать и другие списки, списки заключаются в круглые скобки:
(a b (c d)e) ; Список состоит из 3 символов и одного подсписка, который состоит из 2 символов.
() ; Пустой список
(NIL) ; пустой список
Атомы и списки называются символьными выражениями или s-выражениями.
Лисп в качестве калькулятора :)
Когда пользователь заканчивает ввод какого нибудь выражения, то интерпретатор вычисляет evaluate (eval) и выдает значение этого выражения.
Например:
>>(+ 2 2)
4
>>(- 3 2)
1
>>(* 3 3)
9
>>(/ 6 2)
3
>>(/ 6.0 2.5) ; Вычисления с десятичными числами
2.3999999999999999
>>(+ (* 3 2)(+ 2 2))
10
QUOTE блокирует вычисление выражения
Например:
>>(quote (+ 2 3))
(+ 2 3)
>>'(+ 2 3)
(+ 2 3)
Апостроф перед выражением является сделан для упрощения и эквивалентен QUOTE.
Работа со списками
Первый элемент списка называют головой, а остаток от списка хвостом.
'(голова хвост хвост хвост)
CAR функция возвращает головную часть списка:
>>(CAR '(голова хвост хвост хвост))
ГОЛОВА
CDR функция возвращает хвост списка:
>>(CDR '(голова хвост хвост хвост))
(ХВОСТ ХВОСТ ХВОСТ)
LAST - последний элемент из списка
>>(LAST '(test hello))
HELLO
NTH более простая и наглядная функция извлечения из списка.
>>(NTH 1'(голова хвост хвост хвост)) ; извлекаем второй элемент
ХВОСТ
>>(NTH 0'(голова хвост хвост хвост)) ; извлекаем первый элемент
ГОЛОВА
Функция CAR,CDR и NTH имеет смысл только для аргументов, являющихся списками.
CONS функция включает новый элемент вначало списка.
>>(CONS 'голова '(хвост хвост))
(ГОЛОВА ХВОСТ ХВОСТ)
АТОМ проверяет, является ли аргумент атомом.
>>(ATOM 'атом) ; Это атом
T >>
(ATOM '(голова хвост)) ; Это не атом
NIL
NULL проверка на пустой список
>>(NILL '())
T
>>(NILL '(test test))
NIL
LIST создает список из элементов
>>(LIST 1 2 3)
(1 2 3)
>>(LIST 'test '(hello))
(TEST (HELLO))
EQ сравнивает два синвола и если они равны, возвращает T, а иначе NIL.
>>(EQ 't 't)
T
>>(EQ 'test (car '(test test1)))
T
EQL сравнивает числа одинаковых типов:
>>(EQL 1 1)
T
>>(EQL 1.0 1.0)
T
>>(EQL 1 1.0) ; числа разных типов NIL
Чтобы сравнить числа с разными типами, то нужно воспользоваться :
>>(= 1 1.0)
T
EQUAL может сравнивать записи:
>>(equal 'test 'test)
T
>>(equal '(test test1) '(test test1))
T
EQUALP проверяет любое логическое равенство, но при этом он для этого требуется на много больше вычислений, в следствии чего падает быстродействие.
>>(equalp '(test test1) '(test test1))
T
>>(equalp 2 2.0)
T