
- •История развития фп.
- •Введение в лисп.
- •Элементарные понятия лисп.
- •Функции. Базовые функции.
- •Использование символов в качестве переменных.
- •Базовые функции.
- •Лекция № 2.
- •Арифметические функции
- •Определение функций.
- •Передача параметров глобальной и локальной переменной.
- •Дополнительные функции обработки списков.
- •Логические функции.
- •Управляющие структуры. Лекция №3.
- •Вводы выводы информации
- •Операторы вычисления локальных переменных и циклических предложений.
- •Дополнительные функции печати.
- •Циклические предложения
- •Лекция №4 (05.03.2013)
- •Рекурсия
- •Функции-функционалы
- •Лямбда-выражения
- •Свойства символов
Арифметические функции
Операции сложения, умножения, деления. Первый аргумент списка, задающего вычисления – имя операции, затем произвольное количество аргументов.
(+ 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: что есть поустота, и что есть истина? Ложь – любое пустое значение. А истина – всё, что отлично от лжи.