В.Н. Пильщиков - Язык Плэнер, страница 11
Описание файла
DJVU-файл из архива "В.Н. Пильщиков - Язык Плэнер", который расположен в категории "". Всё это находится в предмете "искусственный интеллект" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 11 - страница
Эта фужщия обычна применяется в тех случаях, когда нужно получить значение переменной, имя которой аараиее неизвестно, а уанается только во время выполнения программы. В качестве типичного примера приведем определение функции АВО-О1«Е, аналогичной встроенной функции АВВ(: [ВЕР15(Е АОВ-ОХЕ (ЕАМВВА (==) [ЯЕТ .== [+ 1 [ЧАХЛЕ .==]]])] Пусть существует переменная с именем Х и аначением 4.
Тогда в результате вычисления выражения [АВЕлОНЕ )Ь] значение 53 переменной Х увеличится на 1. Действительно, при вычислении этого выражения параметру == функции присвоится идентификатор Х. Тело функции — это обращение к функции БЕТ, которая присваивает переменной Х (этот идентификатор является вначеннем ее первого аргумента) значение своего второго аргумента. При вычислении этого аргумента к 1 добавляется значение выражения [ЧА(Л)Е .==], равное числу 4 в значению переменяой Х, имя которой получилось в реаультате вычисления формы .==.
Таким оаразом, переменной Х будет присвоено число 5, что в требовалось. Почему для обозначения параметра функции АВВ-ОЕЕ выбрав необычный идентификатор ==? Ответ такой. Если бы мы обозначили этот параметр каким-то обычным идентификатором, скажем Х: [ВЕ«)ХЕ АВВ-О(«'Е (ЬАМВВА (Х) [ЯЕТ .Х [+ 1 [ЧА1ЛЕ .Х]]])] то наша функция неправильно бы работала в том случае, когда при обращении к ней указывалась переменная с именем Х.
В самом деле, пусть по-прежнему имеется переменная Х со аначением 4, и пусть мы хотим увеличить зто вначение иа 1, для чего вычисляем [АВВ-О)«(Е Х]. При вычислении етого обращения к функции вводится параметр Х, акачением которого становится идентификатор Х, поэтому при вычислении [ЧАЬЛЕ .Х] .складывается следугощая ситуация: значением формы .Х является идентификатор Х, поэтому ЧАЛОЕ берет значение переменной Х, но какойг У иас сейчас дзе переменные с именем Х; параметр функции АВВ-ОЕЕ и переменная со значением 4.
Поскольку описание параметра «ближе», чем описание переменной, то ЧАЛОЕ берет значение именно параметра, т. е. идентификатор Х. Именно к этому идентификатору будет прибавляться 1, что, естественно, приведет к ошибке. Таким образом, совпадение имени параметра функции АВВ-ОЕЕ с именем переменной, существовавшей до обращения к функции, привело к тому, что зта переменная стала недоступной нз тела функции, поэтому взять или изменить ее значение в теле функции не удастся. Иабавиться от такбго дефекта в определении функции АВВ-0(ЧЕ нельзя (если ее параметр обозначен как ==, тогда функция неприменима.к переменной с именем. =).,Однако выбрав в качестве названия параметра «экзотический» идентификатор ==, которым редко обозначают имена переменных, мы уменьшили вероятность проявления дефекта функции АВВ-ОМЕ. В предыдущей части данного параграфа под'«переменными» понимались «локальные переменные», которые вводятся только 54 на время выполнения какой-то процедуры.
Но в языке имеются и переменные иного сорта — глобальные переменные, которые называются константами. Константы отличаются от локальных переменных тем, что онн существуют с мо»«ента своего появления и до конца вычисления программы и что опи доступны нз любой точки программы. Одно из применений 'констант — зто обозначение каких-либо величин. Например, чтобы каждый раз не выписывать много цифр числа я, можно ввести в программе константу с именем Р1, присвоив ей з качестве значения число ЗЛ41592653, и дальше испольэовать в программе только краткое обозначение Р1. Именно поэтому такие объекты в яаыке и называю»ел константами.
Однако зто ке означает, что раз присвоенное значение констаты больше нельзя изменить. В планере константы могут менять свои значения, и в этом они похожи на локальные переменные. Эта воаможность, а также то, что константы доступны ив любого места программы, обусловливает еще одно назначение констант — служить переменными, череа которые независимые процедуры программы могут обмениваться информацией. Дело в том, что на практике не всегда удобно объединять действия отдельных функций плзнерской прог-раммы в рамки какой-то одной, основной функции.
Однако неаависимые функции.все же должны как-то передавать свои данные друг другу. Именно здесь и удобны константы, которые доступны иэ любой функции и значения которых сохраняются независимо от того, какая функция сейчас вычисляется. Именами констант могут быть только идентификаторы, а зна. чениями — любые выражения. Констант беа значения не существует. Обратиться к константе можно в любой момент и в любом месте программы. При обращении к константе указывается ее имя, перед которым ставится префикс «» или «1:». Обращение с префиксом «:» (например,:Р1) нааывается простым обращением к константе; значением такой формы является текущее значение константы.
Сегментное обращение к константе задается префиксом «Н», а результатом такого обращения является сегмснтированное значение константы. Например, если:С вЂ” (А В <С)), то 1;С вЂ” А В (СЕ Определить константу можно в любой момент и в любой точке программы, после чего она становится доступной во всей,программе, Изменить аначение константы также можно в любой момент к в любом месте.
Оба этих действия выполняет Функция СЯЕТ: 1СЯЕТ 1 «1, ЗОВЕ. Значением первого аргумента должен быть идентификатор 1, а аначением 'второго аргумента может быть любое вьгражеяие Е. Если константы с именем 1 в программе еще нет, тогда функция вводит новую константу с этим именем и значением Е. Если же константа ! уже существовала, то функция присваивает ей новое значение — выражение Е. Таков побочный эффект функции СВЕТ, значением же ее является выражение Е.
Например, после вычисления [СВЕТ Р! ЗЛ4!592653) в программе появится константа с именем Р1 и значением ЗЛ4!592653. Имена констант не должны совпадать с именами процедур (функций, сопоставителей и теорем). Если определяется константа, имя которой совпадает с именем процедуры, то последняя уничтожается. Верно и обратное: определение процедуры (с помощью функции ОЕР1г(Е) уничтожает константу с тем же именем.
С именами же локальных переменных (а также меток) названия констант могут совпадать. Вопрос, к чему происходит обращение — к константе или переменной, легко решается по префиксу, укааанкому в обращен»1»г. Например: [РВОО (Х) [БЕТ Х А) [СВЕТ Х В) (.Х:Х)) — » (А В) В дальнейшем изложении мы оставим за локальными переменными название «переменные», а глобальные переменные будем называть только «константами». 1Л5. Ввод-'вывод Как мы видели в ! !.!3, исходные данные для плэнерскей программы могут быть заданы кап аргументы ее основной функции, а значение этой функции можно рассматривать как результат вычисления всей программы, причем этот результат автоматически выводится на печать.
Однако на практике такой способ задания исходных данных и печати реаультата неудобен, поэтому в нзык встроены процедуры ~ввода-вывода, позволяющие запрашивать данные для программы н, печатать ее результаты в любой нужный момент. Функция ВЕАВ: [ВЕАЩ. Эта функция, не имеющая аргументов, осуществляет ввод информации. Она считывает очередное выражение из числа заданных для ввода и, не вычисляя его, объявляет своим значением.
Например, если для ввода подготовлена следующая последовательность выражений: (А В С) 5.2 [ЕЬЕМ ! .Х) то при вычислении выражений [ЯЕТ Х [БЕАБ]] [ЯЕТ «' ([БЕАР] <КЕАБ>)] переменной Х будет присвоено значение (А В С), а переменной Х вЂ” эначепие (5.2 Е1ЕМ 1 .Х). Фушщия РК1г«Т: [РБ1КТ е], ЯБВБ. Данная функция выводит (например, печатает на АЦПУ) эначеяне своего аргумента. В этом заключается побочный эффект функции, значение же ее совпадает со аначением аргумента.
Например,при вычислении выражения [ВО [ЯЕТ Х (А В)] [ЯЕТ Т [РБ1КТ .Х]]] переменные Х и г получат одно и то же апачение — список (А В), п этот же список будет выведен на печать. Функция РБ1КТ печатает только одно выражение, причем печатает его с новой строки. Нередко же требуется напечатать «в одну строку> сраау несколько выражений. В таких случаях применяется другая функция вывода— Функция МРВ1КТ> [МРБ!КТ е«еа ... е>], Б()ВВ, 1«Ъ1. > Аргументами а«этой функции могут быть как простые, так и Р / сегментные формы.
Функция вычисляет список [е«еа... «а) и объявляет его значение своим реаультатом. Одновременно функция выводит (например, па АЦПУ) аначение этого списка, но беэ внешних круглых скобок. Другими словами, функция печатает эначения своих аргументов «Э одну строку>. Если, к примеру, эпачением переменной ФРАЗА является список (КИСКА ЛЮБИТ МОЛОКО), а юичением переменной СЛОВО— атом КИСКА, то в реаультате вычисления выражения [МРБ1ЫТ В " БФРАЗА " НЕПОНЯТНО: .СЛОВО] получится эпачение (В " КИСКА ЛЮБИТ МОЛОКО НЕПОНЯТНО: КИСКА) и будет напечатано: В " КИСКА ЛЮБИТ МОЛОКО " НЕПОНЯТНО: КИСКА Сделаем замечание относительно вывода вещественных чисел.