Суббота, 04.05.2024, 16:14
Приветствую Вас Гость | RSS | PDA

Всё для студента информата

Полезная информация

Материалы для студента

Всё для студента IT » Материалы для студента » Функциональное программирование

Лекции по функциональному программированию. Базовые функции Лиспа.

ЛЕКЦИЯ 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).

Похожие статьи:

Не нашли то, что Вам нужно?.. Найдите ответ на форуме!
Категория: Функциональное программирование | Добавил: admin (04.11.2010)
Просмотров: 1619 | Теги: лекция
Сообщество
Помощь
Форма входа
Поиск

Студенческий помощник по информатике © 2024
При цитировании материалов данного сайта, обязательна ссылка на источник: ITstudents.ru



>