ЛЕКЦИЯ 5
Базовые функции
В Лиспе для обработки списков, т.е. для разбора, анализа и построения списков существуют базовые функции. Они образуют систему аксиом языка, к которым сводятся символьные вычисления. В этом смысле их можно сравнить с основными арифметическими операциями. Простота базовых функций и их малое число – одно из достоинств Лиспа.
Базовые функции:
CAR, CDR, CONS, ATOM, EQ
Функции CAR и CDR извлекают информацию из списка, или обеспечивают доступ к элементам списка.
CONS объединяет элементы в список.
ATOM и EQ проверяют аргументы.
Функция CAR
Первый элемент списка - голова. Список без головы – хвост
Функция CAR возвращает в качестве значения первый элемент списка, т.е. голову.
CAR < список >
*( car '(( head ) tail ))
( head )
*( car ( a b ))
ошибка - имя несуществующей функции.
Car применяется только для списков, т.е. если есть голова списка.
*( car nil )
nil
*( car ' nil )
nil
*( car ' ( nil a ) )
nil
Функция CDR
Функция CDR применяется к спискам и значением ее является хвост списка, получаемый из исходного списка после удаления головы.
*(cdr '(a b c))
(b c)
*(cdr ' (a (b c))
((b c))
*(cdr ' ( a ) )
nil
Так как список из одного элемента, его хвост - пустой список.
*( cdr nil )
nil
Для атомов:
*( cdr ' kat )
ошибка, т.к. не список
*( cdr ' ( ( a b) ( c d ) ) )
( ( c d ) )
Имена функций CAR и CDR возникли по историческим причинам. Автор Лиспа реализовывал свою первую систему на машине IBM 605. Для хранения адреса головы списка использовался регистр CAR (content of address registr) Для хранения адреса хвоста списка использовался регистр CDR (contеnt of decrement registr)
В MCL можно наряду с CAR и CDR использовать имена FIRST и REST.
*( FIRST ' ( a b c ) )
a
*( FIRST ( REST ' ( 1 2 3 4 ) )
2
*( FERST ' ( REST ' ( 1 2 3 4 ) ) )
REST
В Лиспе первым выполняются внутренние функции, а затем - внешние. Исполнение идет "изнутри наружу".
Рассмотрим ( сar ( cdr ' ( ( a b ) c d ) ) )
Первым выполняется cdr ,а затем - car.
Функция CONS
Функция CONS строит новый список из своих аргументов.
cons: s-выражение + список = список
CONS < s-выражение > <список >
Примеры:
*( cons ' a ' ( b c ) )
( a b c )
*( cons ' ( a b ) ' ( c d ) )
( ( a b) c d )
Первый аргумент становится головой второго аргумента, который обязательно является списком
*( cons ' ( a b ) ' ( ( a b ) ) )
( ( a b ) ( a b ) )
*(cons ( + 1 2 ) ' ( + 3 4 ) )
( 3 + 3 4 )
*(cons ' ( + 1 2 ) ( + 3 4 ) )
error
*( cons ' ( + 1 2 ) ' ( + 3 4 ) )
( ( + 1 2 ) + 3 4 )
Примеры манипуляции с пустым списком:
*( cons ' ( a b c ) nil )
( ( a b c ) )
*( cons nil ' ( a b c ) )
( nil a b c )
*( cons nil nil )
( nil )
*( cons ' a nil )
( a )
Так можно превращать элемент в список.
Связь между CAR, CDR и CONS
Функции по принципу их использования можно поделить на группы:
- назначение
- запись
- результат
*( cons ( car '( голова хвост ))
( сdr '( голова хвост )))
( голова хвост)
Селекторы CAR и CDR являются обратными для конструктора CONS. Список, разбитый с помощью функции CAR и CDR на голову и хвост, можно восстановить функцией CONS.
Комбинации функций CAR и CDR
Комбинируя функции CAR и CDR, можно выделить произвольный элемент списка.
*( cdr ( cdr ( car ' ( ( a b c ) d ))))
( c )
Эту функцию можно записать проще :
( CDDAR ' ( ( a b c ) d ) )
Т.е. записывается (C...R список)
А - CAR D – CDR
В MCL можно использовать только три буквы, в других реализациях больше.
N – элемент
Функция NTH извлекает n-й элемент из списка.
Форма записи:
NTH < n > <список >
Пример:
Извлекаем седьмой элемент :
*( NTH 7 '( 1 2 3 4 5 6 7 8 9 10 ) )
7
Функция LIST
Функция LIST создает список из S- выражений (списков или атомов).
Форма записи. Число аргументов может быть любое.
Примеры:
*( list 1 2 )
( 1 2 )
*( list ' a ' b ( + 1 2 ) )
( a b 3 )
*( list ' a ' ( b c ) ' d )
( a ( b c ) d )
*( list nil )
( nil )
*( list ' a )
( a )
*( list ' a nil )
( a nil )
Функция LENGTH
Функция LENGTH возвращает в качестве значения длину списка, т.е. число элементов на верхнем уровне.
Арифметические функции
Арифметические функции могут быть использованы с целыми или действительными аргументами.
Число аргументов для большинства арифметических функций может быть разным.
(+ x1 x2 ... xn) возвращает x1 + x2 + x3 + ... + xn.
(- x1 x2 ... xn) возвращает x1 - x2 - x3 - ... - xn.
(* y1 y2 ... yn) возвращает y1 x y2 * y3 * ... * yn.
(/ x1 x2 ... xn) возвращает x1/x2/... /xn.
Используются специальные функции для прибавления и вычитания единицы:(1+ x) и (1- x).
Похожие статьи: