Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Функции с побочным эффектом.



Функции в языке ЛИСП могут обладать не только возвращаемым значением, но и побочным эффектом (side-effect), который заключается в некотором изменении среды вычислений. По аналогия с императивным программированием можно сказать, что функции, в которых нас интересует возвращаемое значение, – это «настоящие» («чистые») функции, а если нас интересует побочный эффект – это процедуры.

Примером подобной функции с основным результатом в виде побочного эффекта может служить set, которая на самом деле присваивает символу значение, а возвращает присвоенное значение. Несмотря на то, что с помощью «чистых» функций, не изменяющих окружения, можно построить все функциональное программирование, при написании действительно больших программ приходится жертвовать чистотой идеологии ради комфорта скорости и расширяемости работы.

 

Базовые функции

В Лиспе существует минимальный набор функций с помощью которых, вообще говоря, может быть построена любая программа (то есть более сложная функция). Рассмотрим их на примерах.

Операции над списками

(car l)

Значением аргумента l должен быть непустой список, тогда значением функции является первый элемент (верхнего уровня) этого списка.

(cdr l)

Значением аргумента l должен быть непустой список, и значением функции является "хвост" этого списка, т.е. список, полученный отбрасыванием первого элемента.

(car ’(a b с)) => a

(cdr ’(a b c)) => (b c)

(cdr ’(a)) => nil

Последний пример демонстрирует то, что последняя ячейка указывает на nil.

Кроме этих двух функций-селекторов элементов списка часто используются функции, являющиеся их суперпозициями. Имена всех таких функций начинаются на букву c, а заканчиваются на букву r, между ними же может стоять произвольная комбинация из не более чем 5 букв a и d, например,

(cadar l)≡(car(cdr(car l))) .

Предполагается, что список-аргумент l всех этих функций, так же как и следующей функции nth, содержит необходимое число элементов (в противном случае вычисления прерываются).

(car (cdr ’(a b c))) => b

(cadr ’(a b c)) => b ;; car от cdr

Функции доступа к элементам списка:

(nth n l)

Значением аргумента n должно быть положительное целое число (обозначим его N), а значением аргумента l - список. Значением функции является N-й от начала элемент этого списка.

(last l)

Функция выбирает последний (от начала) элемент списка, являющегося значением ее аргумента.

(cons e l)

В отличие от предыдущих функций эта функция является конструктором, т.е. строит новый список, который и выдает в качестве своего результата. Первым элементом этого списка будет значение аргумента e, а хвостом списка - значение аргумента l .

(cons ’a ’(b с)) => (a b c)

(cons ’a ( )) => (a)

(cons (car ’(a b c)) (cdr ’(a b c)))

=> (a b c)

(append l1 l2)

Эта функция осуществляет слияние (конкатенацию) двух списков, являющихся значением двух ее аргументов.

(list e1 e2 ... en )

Еще одна функция конструктор, она имеет произвольное количество аргументов, из их значений она строит список (количество элементов результирующего списка равно количеству аргументов).

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

(add1 n)

Значением аргумента этой функции должно быть число, функция прибавляет к этому числу 1 и выдает результат в качестве своего значения.

(sub1 n)

Значением аргумента должно быть число, функция вычитает из него 1 и выдает результат в качестве своего значения.

(+ n1 n2)

Значениями обоих аргументов функции должны быть числа, результат вычисления функции - их сумма.

(- n1 n2)

Значениями аргументов должны быть числа, значение функции - их разность.

(length l)

Значением аргумента l должен быть список, значением функции является количество элементов (верхнего уровня) этого списка, например:

(mod n1 n2)

Значениями обоих аргументов функции должны быть целые числа. Функция выполняет деление нацело первого числа на второе, и результат выдает в качестве своего значения.

(rem n1 n2)

Значениями аргументов функции должны быть целые числа, результат вычисления функции - остаток от деления первого числа на второе.

Предикаты

Предикатом обычно называется форма (выражение), значение которой рассматривается как логическое значение "истина" или "ложь". Особенностью языка Лисп является то, что "ложью" считается пустой список, записываемый как () или nil, а "истиной" - любое другое выражение (часто в этой роли выступает атом T).

(null e)

Эта функция проверяет, является ли значение ее аргумента пустым списком: если да, то значение функции равно T, иначе – ().

(atom х)

Предикат atom возвращает истинное значение, если его аргумент является атомом, и ложь – в противном случае:

(atom ’х) => Т

(atom ’(a b c)) => NIL

(atom nil) => T

(atom ’( )) => T ;; Пустой список –

;; это nil

(atom ’(nil)) => NIL

;; (nil) - одноэлементный список

(atom (atom (+ 2 1))) => Т ;; Т - атом


Поделиться:



Последнее изменение этой страницы: 2019-06-20; Просмотров: 210; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.014 с.)
Главная | Случайная страница | Обратная связь