Логические функции. Управляющие структуры
ЛЕКЦИЯ 4.
Логические функции. Управляющие структуры. Простые функции печати. PROGN.
Содержание
4.1 MEMBER.
Функция проверяет, находится ли первый аргумент внутри списка, представленного вторым аргументом. Если элемента в списке нет, MEMBER возвращает nil. |
|
( MEMBER < s-выражение > < список > ) |
( b a ) |
|
|
Таким образом member в качестве истины возвращает не Т , а величину не-NIL.
В Лиспе для предикатов значение не-NIL означает истину.
NIL |
Т.к. элемент находится не на том уровне. |
4.2 Логические функции.
Для объединения предикатов в сложные выражения и для выделения элементов - NIL в Лиспе
используются логические функции
,
и
.
4.2.1 NOT.
Функция NOT берет один аргумент и возвращает значение, противоположное значению аргумента. Если аргумент NIL, |
NOT имеет один аргумент, который может быть |
( NOT < s-выражение >) |
Примеры:
T |
T |
NIL |
4.2.2 OR.
Логическая функция OR берет один или несколько аргументов. Она выполняет эти аргументы слева направо и возвращает значение первого аргумента, который не NIL.Если все аргументы OR имеют значение NIL, то OR возвращает NIL. |
В OR , аналогично NOT, аргументами могут быть любые выражения. |
( OR < arg-1 >< arg-2 >< arg-3 > . . . ) |
- OR возвращает значение не-NIL, если по крайней мере один аргумент не NIL.
- OR используется для выделения первого не пустого элемента в списке.
- AND
возвращает NIL значение, если хотя бы один из аргументов NIL, в противном случае возвращается значение последнего аргумента.
- AND используется для выделения пустого элемента в списке.
- Выражения < проверка-i >, выполняющие роль предикатов вычисляются последовательно, слева направо, до тех пор, пока не встретится выражение, значением которого не является NIL.
Вычисляется результирующее выражение, соответствующее этому предикату, и полученное значение возвращается в качестве значения всего предложения COND.
- Если истинного значения нет, то значением COND
будет NIL.
- Если нет действия - результат значение предиката.
- Если не одно действие - результат значение последнего аргумента.
- Примеры:
T |
NIL |
( a b c ) |
Таким образом:
|
/ul>
4.2.3 AND.
Логическая функция AND берет один или несколько аргументов. Она выполняет эти аргументы слева направо. Если она встречает аргумент, значение которого NIL, она возвращает NIL, не продолжая вычисления остальных. Если NIL аргументов не встретилось, то возвращается значение последнего аргумента. |
( AND < arg-1 >< arg-2 >< arg-3 > . . . ) |
NIL |
b |
T |
Таким образом: |
Управляющие структуры.
В обычных языках программирования существуют средства управления вычислительным процессом: организация разветвлений и циклов. В Лиспе для этих целей используются управляющие структуры - предложения (clause). |
Внешне предложения записываются как вызовы функций: Первый элемент предложения - имя; остальные - аргументы. В результате вычисления предложения получается значение. Отличие от вызова функции в использовании аргументов. |
Управляющие структуры делятся на группы. Одна из групп - разветвления вычислений.
|
4.3.1 COND.
Предложение СOND является основным средством организации разветвления вычислений. |
Структура условного предложения :
( COND ( < проверка-1 > < действие-1 > ) ( < проверка-2 > < действие-2 > ) ............................................................... ( < проверка-n > < действие-n > )) |
В качестве аргументов < проверка > и < действие > могут быть произвольные формы.
Значение COND определяется следующим образом: |
/p>
- Обычно в качестве последнего условия пишется t, соответствующее ему выражение будет вычислятся в тех случаях, когда ни одно другое условие не выполняется.
Последнюю строку можно записать: ( t ' atom ) ) )
Пример: ( функция проверяет тип аргумента)
( ( null arg ) nil ) ( ( list arg ) 'list ) ( ( numberp arg ) 'number ) ( t 'atom ) ) |
atom
number |
( ( numberp num ) ( * num 2 ) ( t ' не-число ) ) |
гарантировано удваивает число, отбрасывая не числовые аргументы. |
В COND могут отсутствовать результирующие выражения для предикатов, а так же присутствовать несколько действий.
( COND ( < проверка-1 > ) ( < проверка-2 > < действие-2 > ) (< проверка-3 > < дейст.-31 > < дейст.-32 > < дейст.-33 >)) |
|
4.3.2 Другие условные предложения.
СOND наиболее общее условное предложение. Часто пользуются более простыми условными предложениями.
( IF < условие > < то форма > < иначе форма > ) |
- Пример:
- ( if ( atom x ) 'аtоm 'not - аtom )
- Условные предложения WHEN и UNLESS являются часными случаями условного предложения IF:
- Если условие соблюдается, то выполняются формы.
( WHEN < условие >
< форма-1 > < форма-2 > < форма-3 > ... )
- Если условие не соблюдается, то выполняются формы.
( UNLESS < условие >
< форма-1 > < форма-2 > < форма-3 > ... )
4.3.3 Связь между COND и логическими функциями.
Любую логическую функцию можно заменить COND-выражением и наоборот.
Пример:
car-функция с проверкой:
- ( defun gcar ( l )
( cond
( ( listp l ) ( car l ) )
( t nil ) ) )
то же через логические функции:
- ( defun gcar1 ( l )
- ( and
( listp l ) ( car l ) ) )
* (gcar '(a b))
a
* (gcar 'a)
nil
4.4 Ввод и вывод информации.
До сих пор в определяемых функциях ввод и вывод результатов осуществлялись в процессе диалога с интерпретатором.
Интерпретатор читал вводимое пользователем выражение, вычислял его значение и возвращал его пользователю.
Теперь мы рассмотрим специальные функции ввода и вывода Лиспа.
4.4.1 READ.
READ отличается от операторов ввода-вывода других языков пpогpаммиpования, тем что он обрабатывает вводимое выражение целиком, а не одиночные элементы данных.
Вызов функции осуществляется в виде:
( READ )
функция без аргументов.
- Если условие не соблюдается, то выполняются формы.
- Как только интерпретатор встречает READ, вычисления приостанавливаются до тех пор пока пользователь не введет какой-либо символ или выражение.
- * ( READ )
new -
new - значение функции.
READ не указывает на ожидание информации. Если прочитанное выражение необходимо для дальнейшего использования, то READ должен быть аргументом какой либо формы, которая свяжет полученное выражение:
|
( + 1 2 ) ( + 1 2 ) - значение
( + 1 2 )
3 |
( list ( + arg ( read ) ) ( read ) ) ) |
14 cat ( 22 cat) |
4.4.2 PRINT.
| Функция PRINT - это функция с одним аргументом. Она выводит значение аргумента на монитор, а затем возвращает значение аргумента. |
( PRINT < arg >) |
- print перед выводом аргумента переходит на новую строку,
а после него выводит пробел.
- * ( print ( + 2 3 ) )
5 -
5 - значение
- print и read - псевдофункции, у которых кроме значения есть побочный эффект.
Значение функции - значение ее аргумента.
Побочный эффект - печать этого значения.
Это не значит, что всегда две строки. Только когда print на высшем уровне, чего практически не бывает.
- Пример:
* ( setq row ' ( x x x ) )
( x x x )
( x x ) - ( x x ) - значение |
print ( cdr row ) ) ) ( x x ) - ( o x x ) - значение |
br>
4.5 PROGN, PROG1, PROG2.
| Функции PROGN, PROG1, PROG2 относятся к управляющим структурам, к группе объединяющей последовательные вычисления. |
Предложения PROGN, PROG1, PROG2 позволяют работать с несколькими вычисляемыми формами:
( PROGN < форма-1 > < форма-2 > ...... < форма-n >) ( PROG1 < форма-1 > < форма-2 > ...... < форма-n >) ( PROG2 < форма-1 > < форма-2 > ...... < форма-n >) |
У этих предложений переменное число аргументов, которые они последовательно вычисляют:
- Пример:
- * ( progn ( setq x 2 ) ( setq y ( * 3 2 ) ) )
6
- * ( prog1 ( setq x 2 ) ( setq y ( * 3 2 ) ) )
2
- * y
6
В Лиспе часто используется так называемый неявный PROGN , т.е вычисляется последовательность форм, а в качестве значения берется значение последней формы.
4.5.1 Определение функций с использованием неявного PROGN.
При определении функций может использоваться неявный PROGN .
( defun < имя функции > < список параметров > < форма1 форма2 .... формаN > ) |
- Тело функции состоит из последовательности форм отражающих,
последовательность действий.
- В качестве значения функции принимается значение последней формы.
Пример:
Определим функцию, которая печатает список, вводит два числа, и печатает их сумму.
( print ' ( type two number ) ) ( print ( + ( read ) ( read ) ) ) ) |
( type two number ) 3 4 7 7 |