Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Функцилональное программирование лекции 4 семес...docx
Скачиваний:
0
Добавлен:
01.04.2025
Размер:
38.31 Кб
Скачать

Арифметические функции

Операции сложения, умножения, деления. Первый аргумент списка, задающего вычисления – имя операции, затем произвольное количество аргументов.

(+ x1 x2 … xN) – результатом работы функции будет сумма всех иксов.

(- x1 x2 … xN) – в качестве результата получаем, из 1 аргумента вычетаем все последующих.

(* x1 x2 … xN) – произведение всех.

(/ x1 x2 … xN) – первый аргумент делим на все остальные.

Работа лаб – научиться строить аналоги всех существующих функций.

Сумма всех элементов списка – сложение первого элемента с суммой элементов хвоста.

Определение функций.

Вот однажды, у тебя появится надобность в собственных функциях.

(defun <имя фунцкии> <список параметров> <Тело функции>) – параметры указываются в круглых скобках, тело так же содержится в круглых скобках.

Пример:

Аналог CONS, но она будет добавлять 2 аргумента вместо 1.

Пример:

*(cons-two ‘a ‘b ‘(c d))

(a b c d)

(defun cons-two

(x y oldlist)

(cons x

(cons y oldlist)

)

)

По поводу литературы: Будет на лабах.

Функция должна выполнять удвоение своего аргумента. Назовём функцию double.

(defun double

(num)

(* 2 num)

)

По хорошему, надо бы все функции запихонить в один файл. И нужно чтобы прога отсасывала из длл необходимые нам функции.

Построить функцию, которая бы помещала элемент NEW на второе место в списке.

*(insert-second ‘new ‘(a b c))

(a new b c)

НАПИСАТЬ

Передача параметров глобальной и локальной переменной.

Ещё одна особенность LISP – передача параметров в функцию выполняется по значению. Существует ещё вариант – по адресу. Во втором случае – мы даем функции работать с оригиналом. И возникает такой «Побочный эффект» при выполнении функции. В отличие от функции с побочным эффектом, чистые функции выполняются через список аргументов, и результат возвращается только одним образом, в C например это делается через return. Сами параметры функции являются локальными переменными и при вызове мы рассматриваем их фактические значения.

Примеры из учебников – рассмотреть.

Свободные переменные – если в теле функции есть переменная, не входящая в число её формальных параметров, они называются свободными, а их значения остаются в силе после её выполнения.

Дополнительные функции обработки списков.

(APPEND <list1> <list2>)

Предназначена для объеденения двух и более списков в один.

*(append ‘(1 2) ‘((3) (4 5)))

(1 2 (3) (4 5))

(REVERSE <list>) – делает список наоборот. Применяется только к верхнему уровню списка.

Пример: *(reverse ((a b c) d))

Результат: (d (a b c))

(LAST <list>) – это не последний элемент список, не аналог CDR. LAST – удаляет из списка все элементы, кроме последнего.

Объеденяющие – результатом работы будет спеисок.

Функция

Аргументы

Результат

LIST

S S S …

(S S S …)

CONS

S list

(s list)

APPEND

List list …

(list list …)

(ATOM X) – проверяет, является ли аргумент Х атомом. Если да, то возвращет Т, иначе NIL.

(EQ X Y) – проверка эквивалентности двух аргументов, которые могут быть выражениями. Если символы-аргументы совпадают, возвращается истина, иначе возвращется нил. В Случае чисел, если числа представлены одним типом, то EQ вернет истину, а если разный тип – то ложь. Например, (EQ 123 123) – истина, а (EQ 123 1.23e2) – нил.

(= x y) - сравнивает два аргумента. АРГУМЕНТЫ – ТОЛЬКО ЧИСЛА. Сравнивает значения, а не представления. То есть как раз таки если разные типы, но одинаковые значения – вернет трухана.

(EQL X Y) – может сравнивать и символы и числа, истина возвращается, когда аргументы эквивалентны по EQ, а для чисел, если они имеют одно и то же значение. То есть объеденяет две предыдущие функции.

(EQUAL X Y) – позволяет сравнивать не только символы и числа, но и списки. Списки признаются совпадающими, если только их структура ПОЛНОСТЬЮ совпадают и значения тоже равны должны быть. Иначе в нил воткнешься. Нил – это река такая.

(NULL list) – если список пустой, возвращается истина.

LISTP – проверяет, является ли аргумент списком

NUMBERP – является ли аргумент числом

SYMBOLP – проверяет, является ли аргумент символом

ZEROP – проверка на ноль

PLUSP – положительные

MINUSP – отрицательные

> - больше

< - меньше

(MEMBER X list) – x является s-выражением, list – список. Результатом будет список, начинащийся с элемента X из списка list. Нам эта функция нужна для того, чтобы проверить, есть ли смысл приступать к обработке этого списка?

Ещё одна аналогия с языком C: что есть поустота, и что есть истина? Ложь – любое пустое значение. А истина – всё, что отлично от лжи.