ЛЕКЦИЯ 2.Функции. Базовые функции.
Содержание





















Понятие функции.
| В математике функция отображает одно множество в другое. Записывается: Y = F (x)
Для х из множества определения (Domain) ставится в соответствие Y из множества значений (range) функции F. |
|||
Можно записать:
в том числе их может не быть совсем.
| | |
Примеры функций:
abs( -3 ) --> 3 абсолютная величина.
+ ( 2 , 3 ) --> 5 сложение
union ( ( a , b ), ( c , b ) ) --> ( a , b , c ) объединение множеств.
количество_букв ( слово ) --> 5
Типы аргументов и функций.
Функция в общем случае задает отображение из нескольких множеств в множество значений. |
||
Можно записать :
Это функция двух аргументов: первый х принадлежит А, второй у принадлежит В, значение z принадлежит С. В этом случае говорят, что аргументы и значение имеют разные типы.
Пример:
1.2 Префиксная нотация.
| В математике принята префиксная нотация, в которой имя функции стоит перед аргументами заключенными в скобках. | В Лиспе для записи арифметических выражений и функций используется единая префиксная форма записи, в которой имя функции или действия стоит перед аргументами и записывается внутри скобок. | |
f ( x ) g ( x , y ) h ( x , g ( y , z ) ) |
( f x ) ( g x y ) ( h x ( g y z ) ) ( + x y ) ( - x y ) ( * x ( + x z ) ) |
|
| в арифметических выражениях используется инфиксная запись : | ||
x + y x - y x * ( x + z ) |
Достоинства :
символу текущего выражения система уже знает, с какой структурой
имеет дело.
Диалог с интерпретатором ЛИСПА.
Транслятор Лиспа работает как правило в режиме интерпретатора.
* ( + 2 3 ) 5 |
||
* (* ( + 1 2 ) ( + 3 4 )) 21 |
||
QUOTE - специальная функция с одним аргументом, которая возвращает в качестве значения этот аргумент. |
||
* ' ( + 2 3 ) ( + 2 3 ) Или * ' y y |
||
* ( quote ( + 2 3 ) ) ( + 2 3 ) * ( quote y ) y |
Вместо апострофа можно использовать функцию QUOTE. |
* ' ( a b ' ( c d ) ) (a b ( quote c d ) ) |
Апостроф автоматически преобразуется в QUOTE. |
* ( quote ' y ) ( QUOTE Y ) * '' y ( QUOTE Y ) * ( QUOTE QUOTE ) QUOTE |
||
* ' 3.17 3.17 * ( + ' 2 3 ) 5 * t T * ' t T * ' nil NIL |
||
* ( quote ( + 1 2 ) ) ( + 1 2 ) * ( eval ( quote ( + 1 2 ) ) ) 3 |
quote и eval действуют во взаимно противоположенных направлениях и аннулируют эффект друг друга. |
* ( setq x ' ( a b c ) ) ( a b c ) * ' x x |
* x ( a b c ) * ( eval ' x ) ( a b c ) |
EVAL - это универсальная функция Лиспа, которая может вычислить любое правильно составленное s-выражение. |
||
|
|
Значения символов хранятся в ячейках, закрепленных за каждым символом. Если в эту ячейку положить значение, то символ будет связан (bind) сo значением. В процедурных языках говорят "будет присвоено значение". | |
|
|
Функция SET cвязывает символ со значением, предварительно вычисляя значения аргументов. | |
| В качестве значения функция SET возвращает значение второго аргумента. |
Если перед первым аргументом нет апострофа, то значение будет присвоено значению этого аргумента. |
|
* ( set 'd ' ( x y z ) ) ( x y z ) |
* ( set a ' e ) e |
|
* ( set ' a ' b ) b |
* a b * b e |
|
* ( setq m ' k ) k |
* m k |
|
|
или обеспечивают доступ к элементам списка. |
|
|
|
|
|
|
|
Функция CAR возвращает в качестве значения первый элемент списка, т.е. голову. | |
| CAR < список > |
|
* ( car ( a b )) ошибка - имя несуществующей функции. |
car применяется только для списков, т.е. если есть голова списка. |
|
* ( car nil ) nil * ( car ' nil ) nil |
* ( car ' ( nil a ) ) nil |
|
* (cdr ' ( a ) ) nil * ( cdr nil ) nil |
Так как список из одного элемента ,его хвост - пустой список. |
|
|
В 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: 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 ) |
Очень полезно, т.к. позволяет превращать элемент в список. |
* ( cons ( car '( голова хвост )) ( сdr '( голова хвост ))) ( голова хвост) |
Селекторы и являются обратными для конструктора . Список, разбитый с помощью функции CAR и CDR на голову и хвост, можно восстановить функцией CONS. |
* ( cdr ( cdr ( car ' ( ( a b c ) d )))) ( a b c ) ( b c ) ( c ) |
Можно записать проще : ( CDDAR ' ( ( a b c ) d ) ) Т.е. записывается (C...R список) А - CAR D - CDR |
Функция NTH извлекает n-й элемент из списка. |
||
NTH < n > <список > |
Функция 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 возвращает в качестве значения длину списка. т.е. число элементов на верхнем уровне |
||