Введение в 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

Ссылки

Введение в Common Lisp: Установка и первый запуск

http://lisp.ru/

Теги: , , ,

Дата: 14 декабря 2010

Автор: ignusius

Комментарии: 0

Оставить комментарий

*

Комментарий:

Ваш e-mail не будет опубликован.
Обязательные поля помечены *

Разрешенные HTML теги:

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>