ЛЕКЦИЯ 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 > . . . ) |
T |
NIL |
( a b c ) |
| Таким образом:
|
Логическая функция AND берет один или несколько аргументов. Она выполняет эти аргументы слева направо. Если она встречает аргумент, значение которого NIL, она возвращает NIL, не продолжая вычисления остальных. Если NIL аргументов не встретилось, то возвращается значение последнего аргумента. |
( AND < arg-1 >< arg-2 >< arg-3 > . . . ) |
NIL |
b |
T |
Таким образом:
|
В обычных языках программирования существуют средства управления вычислительным процессом: организация разветвлений и циклов. В Лиспе для этих целей используются управляющие структуры - предложения (clause). |
Внешне предложения записываются как вызовы функций: Первый элемент предложения - имя; остальные - аргументы. В результате вычисления предложения получается значение. Отличие от вызова функции в использовании аргументов. |
Управляющие структуры делятся на группы. Одна из групп - разветвления вычислений.
|
Предложение СOND является основным средством организации разветвления вычислений. |
( COND ( < проверка-1 > < действие-1 > ) ( < проверка-2 > < действие-2 > ) ............................................................... ( < проверка-n > < действие-n > )) |
Значение COND определяется следующим образом:
|
( ( null arg ) nil ) ( ( list arg ) 'list ) ( ( numberp arg ) 'number ) ( t 'atom ) ) |
atom
number |
( ( numberp num ) ( * num 2 ) ( t ' не-число ) ) |
гарантировано удваивает число, отбрасывая не числовые аргументы. |
|
( COND ( < проверка-1 > ) ( < проверка-2 > < действие-2 > ) (< проверка-3 > < дейст.-31 > < дейст.-32 > < дейст.-33 >)) |
|
| ( IF < условие > < то форма > < иначе форма > ) |
|
( WHEN < условие > < форма-1 > < форма-2 > < форма-3 > ... ) |
|
( UNLESS < условие > < форма-1 > < форма-2 > < форма-3 > ... ) |
car-функция с проверкой:
( cond ( ( listp l ) ( car l ) ) ( t nil ) ) ) |
то же через логические функции:
( listp l ) ( car l ) ) ) |
|
До сих пор в определяемых функциях ввод и вывод результатов осуществлялись в процессе диалога с интерпретатором. Интерпретатор читал вводимое пользователем выражение, вычислял его значение и возвращал его пользователю. Теперь мы рассмотрим специальные функции ввода и вывода Лиспа. |
|
| READ отличается от операторов ввода-вывода других языков пpогpаммиpования, тем что он обрабатывает вводимое выражение целиком, а не одиночные элементы данных. |
( READ ) функция без аргументов. |
|
|
( + 1 2 ) ( + 1 2 ) - значение
( + 1 2 )
3 |
( list ( + arg ( read ) ) ( read ) ) ) |
14 cat ( 22 cat) |
|
| Функция PRINT - это функция с одним аргументом. Она выводит значение аргумента на монитор, а затем возвращает значение аргумента. |
| ( PRINT < arg >) |
( x x ) - ( x x ) - значение |
print ( cdr row ) ) ) ( x x ) - ( o x x ) - значение |
|
| Функции PROGN, PROG1, PROG2 относятся к управляющим структурам, к группе объединяющей последовательные вычисления. |
|
( PROGN < форма-1 > < форма-2 > ...... < форма-n >) ( PROG1 < форма-1 > < форма-2 > ...... < форма-n >) ( PROG2 < форма-1 > < форма-2 > ...... < форма-n >) |
|
( defun < имя функции > < список параметров > < форма1 форма2 .... формаN > ) |
( print ' ( type two number ) ) ( print ( + ( read ) ( read ) ) ) ) |
( type two number ) 3 4 7 7 |