Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лахов.doc
Скачиваний:
1
Добавлен:
15.04.2019
Размер:
380.42 Кб
Скачать

Стандартные функции

Арифметические выражения

ЛИСП является языком функций. Это означает, что каждая конструкция, которая может быть записана на ЛИСПе и которая является функцией в математическом смысле, выполняется в ЛИСПе как функция.

Функции – это вполне общее понятие в языках программирования. Например, если мы хотим использовать математическое выражение sin x , то в алгоритмическом языке мы можем написать SIN (X). В ЛИСПе же мы пишем

(SIN X)

В процедурном языке если мы хотим получить сумму чисел X и Y, мы бы написали X + Y. В ЛИСПе это выглядело бы

(+ X Y)

это происходит из-за того, что, когда мы пишем символ + между двумя константами или переменными мы неявно используем функцию двух переменных. Мы могли бы, если бы захотели, написать FUNCTION PLUS (X, Y) или PROCEDURE plus (x, y), но обычно мы этого не делаем, потому что алгоритмические языки являются алгебраическими языками, в которых четыре наиболее употребляемые функции: сложение, вычитание, умножение деление – обрабатываются специальным образом.

Столь же обычной в языках программирования является возможность использовать функции внутри других функций. Если нам было необходимо найти синус от синуса х, мы могли бы написать SIN (SIN (X)). В ЛИСПе в подобной ситуации мы написали бы

SIN (SIN X))

Аналогично для функции PLUS мы могли бы написать (+ X (+Y Z)).

Если бы это было записано на алгоритмическом языке как PLUS (Х, PLUS (Y,Z)), где PLUS (X, Y) было бы уже определено как X+ Y, результатом, конечно, явилось бы X+Y+Z.

Если мы определяем лисп – функцию

(* X Y),

чтобы выполнить X*Y ,тогда выражения

(+ X (* Y Z))

(+ (* X Y) Z)

означает X+Y*Z и X*Y+Z соответственно.

Ясно, что таким способом мы можем выразить любое арифметическое выражение, включающее в себя операторы + *. Это относится и к скобочной записи выражений. Если, например, мы хотим использовать (A+B) * (C+D), то в ЛИСПе мы записываем

(* (+ A B) (+ C D)).

Аналогично, если большое число величин должно быт сложено или перемножено друг с другом, мы можем выразить все эти величины, как аргументы функций + или * так, выражение

(+ X Y Z)

имеет такой результат, как (+ X (+ Y Z)).

В ЛИСПе существует функция «минус»( - ) она аналогична обычному вычитанию, так,

(- X Y)

даёт результат X-Y.Функция – аналогична так называемому унарному минусу или использованию знака минус для обозначения отрицательной величины; так

(- Х)

даёт в качестве результат – Х.

S-выражения

Использование функций в ЛИСПе имеет как свои достоинства, так и недостатки. Недостатком, конечно, является то, что выражения в ЛИСПе длиннее и имеют большое количество скобок. Несомненно, легче написать

или даже (-B+SQRT (B*B-4*A*C)) / (2*A), чем это же записать в виде (/ (+ (- B) (SQRT (- (* B B) (* 4 A C)))) (* 2 A))

Мы по большей части будем использовать ЛИСП для целей, не связанных с вычитанием алгебраических функций.

Преимуществом функционального способа записи в ЛИСПе является то, что он унифицирует ЛИСП аналогично тому, как понятие множества и функции унифицирует математику. В действительности есть только один род конструкций, который изучают в ЛИСПе. И это – функция. Остальные средства ЛИСПа такие, как определение функций, условные и безусловные передачи управления в программе и т.д., определяются в ЛИСПе путём создания специальных функций.,которые выполняют эти действия.

Выражения в ЛИСПе, такие, как мы уже записывали, известны как S – выражения. В S – выражении существует лишь два типа составляющих его объектов: «элементы», например X и Z, которые мы называем атомы и скобки. Однако ясно, что не каждое выражение, которое содержит атомы и скобки, является S – выражением. Так четыре конструкции

(+ Х (+ Y Z)

(-R S )))

) + ) + Y Z ((

(+ 4 2)) (+ (+ 5 6)

Сформированы неправильно. Первые две не являются S – выражениями, потому что их скобки не сбалансированы; в первой слишком много левых скобок, в то время как во второй слишком много правых скобок. Третья конструкция начинается с правой скобки, и таким образом, даже несмотря на баланс скобок, она не закончена. Ошибку в последней приведенной конструкции обнаружить, однако не так легко. Она имеет три левые скобки и три правые скобки, но тем не менее ясно, что это бессмыслица. Если мы посмотрим на символы

(+4 2)

в начале этой конструкции, то сами по себе они являются S – выражениями. Однако за ними следует правая скобка, и из-за этого результат неправленый.

Основываясь на этих наблюдениях, мы можем определить S – выражение следующим образом: S – выражение составляется из атомов , (которые могут быть константами или переменными) и скобок таким образом, что если мы представим себе счётчик, установленный в начале в нуль, и будем увеличивать его на единицу при движении слева направо каждый раз, когда встречается левая скобка, и уменьшать на единицу каждый раз, когда встречается правая скобка, то его конечное значение будет нуль, все промежуточные строго положительными.

Мы должны упомянуть об ещё одном очень важном символе в S – выражении - пробеле. В алгоритмическом языке пробелы игнорируются, но в ЛИСПе это не так. Пробел здесь употребляется, когда необходимо отделить аргументы.

(+ X Y)

Как и обычно, в языках программирования вместо единичного пробела всегда может быть использовано несколько пробелов. По желанию пробел может быть опущен перед или после левой или после правой скобки; так , обе конструкции.

(* (A B)C(+ D E) (+ F G)) и (* (+ A B) C (+ D E) (+ F G))

законы и эквиваленты друг другу.

Атомы

Константы и переменные в S – выражении, как мы уже видели, называются атомами. Первоначальное значение слова «атом» - это «тот, который не может быть дальше разделён», но именно в этом смысле «атом» употребляется в ЛИСПе. (Греческие корни а - не и том – часть).

При записи переменных придерживаются обычных правил для идентификаторов. Имя переменной должно начинаться с буквы и должно состоять только из букв или цифр. Но есть одно принципиальное отличие: тогда как в других языках обычно существует верхний предел числа символов, которые может содержать атом, в большинстве ЛИСП – систем такого ограничения нет. Любая строка букв и цифр, начинающаяся с буквы может служить именем атома и может трактоваться как переменная.

В ЛИСПе существуют некоторые специальные зарезервированные идентификаторы. Большинство ЛИСП – систем позволяет вам использовать какое-либо специальное слово как переменную, но предупреждают о возможных непредсказуемых последствиях. В частности, идентификаторы Т и NIL не следует использовать как имена переменных. Т – означают “true” – истина и NIL “false” – ложь, соответственно, и осуществляют почти ту же функцию, что и true и false в алгоритмическом языке. NIL имеет множество применений одно из которых – подстановка вместо F.

Константы в разных ЛИСП – системах подчиняются различным правилам. Большинство ЛИСП – систем понимают как целые, так и действительные константы. Целые иногда могут быть заданы как в восьмеричной или двоичной форме, так и в десятичной форме.

Переменная в ЛИСПе может иметь значения, так же как в алгоритмическом языке. Один из способов приписывания значения переменной – использование функции SETQ, которая действует в каком-то смысле аналогично оператором присвоения. Записывая (SETQ Х 5)

мы в Х устанавливаем 5. Это будет аналогично предложению Х: = 5 в алгоритмическом языке. Первый аргумент является переменной, которая присваивается, второй аргумент – величиной, которая туда помещается. Как правило, этот второй аргумент может быть сколь угодно сложном. Так,

(SETQ Х (+ Y 1)

присвоит Х значение Y+1. это аналогично Х = Y+1 в алгоритмическом языке.