В.Н. Пильщиков - Язык Плэнер, страница 7
Описание файла
DJVU-файл из архива "В.Н. Пильщиков - Язык Плэнер", который расположен в категории "". Всё это находится в предмете "искусственный интеллект" из 7 семестр, которые можно найти в файловом архиве МГУ им. Ломоносова. Не смотря на прямую связь этого архива с МГУ им. Ломоносова, его также можно найти и в других разделах. .
Просмотр DJVU-файла онлайн
Распознанный текст из DJVU-файла, 7 - страница
Сделать это можно с помощью такого условного выражения: [СОЧВ ([А(»)В [Н()М .Х] [ННМ .У]] [+ .Х Х]) ([ОВ [1В .Х] [10 .У]] (.Х -1- .У)) (Т ( ))] Отметим, что последнюю клаузу — (Т ()) — можно было бы и опустить, поскольку функция СОНЭ, согласно определению, и так выдаст пустой список () в качестве своего аначения, если дза первых условия ока>кутая ложными. [.9. Функция РВОО В языке имеется несколько встроенных функций, вычисление которых напоминает выполнение блоков в язьп»е алгол-60. Такие функции мы будем называть блачкыми функциями, или просто скоками.
Одна из иих, а также сопутствующие ей функции рассматриваются в етом параграфе. ЗЗ 3 и. н. пильщиков Функция РКОО. Обращение к этой блочной функции имеет следующий вид: (РКОО (а, аа ... а ) е» е» ... еь), РБ11ВК, »и ) О, й )~ 1. (РКОО (Х (У А) 2 ()»)»5 (2 .Т>)) ...) будут введены четыре локальные переменные с именами Х, г', 2 п 'т»5, причем Х и'Х не получат начальных значений, У получит начальное аначение А, а %5 — значение (2 .'»'>. После введения локальных переменных функция РКОО переходит к вычислению своего тела: по очереди вычисляются операторы еь Когда будет вычислен последний оператор еы функция закончит свою работу со значением, равным значению оператора еь. При выходе из функции ее локальные переменные уничтожаются.
Отметим, что вычисленное значение любого оператора ее кроме последнего, игнорируется. Поэтому, хотя е, могут быть произвольными простыми формами, в качестве е» имеет смысл испольаовать только идентификаторы, играющие роль меток, и обращения к функциям, которые имеют побочные эффекты. К таким функциям относятсн, например,-встроенные функции БЕТ, 00, КЕТОКР), ВО и СО»10. Функция БЕТ: (БЕТ» е), БПВК. Если аначением второго аргумента может быть то аначением первого аргумента должен быть являющийся именем одной из существующей. переменной, например переменной ближайшегб нибудь другого объемлющего блока.
Значением л»обое выражение, идентификатор 1, в данный момент блока или какого- функции БЕТ явл 34 Первый аргумент — список (а, а, а ) — нааывается описанием локальных переменных блока, а последовательность остальных аргументов — е» е» ... еь — нааывается телом блока. При этом простую форму е» будем называть меткая, если оиа является идентификатором, и оператором в остальных случаях.
Вычисление функции РКОО начинается с обработки описания локальных переменных, в результате чего вводятся в употребление переменные, областью су»цествования которых является тело данного блока. Каждый элемент а» олисапия вводит одну локальную переменную. Если е» вЂ” идентификатор, тогда это — имя переменной, которой не присваивается никакого начального аначения. Иначе а» должен быть 1 списком иа двух алеменгов: идентификатора и любого выражения. Идентификатор определяет имя локальной переменной, а выражение,(оно не вычисляется) — ее начальное аначение. Например, при вычислении блока лается выражение Е, однако главное в этой функции — ее побочный эффеит: переменной с кмеием 1 присваивается новое значение Е. Например, после вычисления [ЯЕТ Х [ВЕЕТ 1 (А В С)]] -» (В С) переменная Х получит значение (В С), а после вычисления [БЕТ [2 (Х У Е Ж)]»5] переменной У будет присвоено значение»5.
Если в первом из этих примеров имя переменной — Х вЂ” аадано явно, то во втором примере имя переменной — У вЂ” было получено в реаультате вычисления. Таким образом, нмя переменной, которой присваивается значение, может быть варанее и неизвестно. Но, отметим, в любом случае значением первого аргумента должно быть просто ими переменной, без каких-либо префиксов.
Функция ЯЕТ, как правило, используется лишь ради своего побочного эффекта. Но иногда используется и вырабатываемое его значение. Например, присвоить переменным Х и У одно и то же эначоние — скажем, текущее значение переменной Š†мож так: [ЯЕТ Х [БЕТ Х .2]]. Функция ЯЕТ относится к классу БОВЕ, поэтому вычисление внешней функции ЯЕТ начинается с вычисления ее аргументов. Вычисление формы Х дает этот же идентификатор Х, а вычисление аргумента [БЕТ У .Е] дает аначенне переменной Х, иоторое внешняя функция ЯЕТ н присваивает переменной Х.
Кроме того, при вычислении внутренней функции ЯЕТ также был побочный эффект; переменная у сменила свое значение на значение переменной Е. Таким образом, сначала х', а затем Х получили одинаковое значение. Значением всего указанного выражения являетея значение переменной Е,ио оно уже не используется. Функция 60: [60 ~], ЯЮВВ. Зта функция осуществляет переход по метке 1. Как уже было сказано, операторы блока выполняются в том порядке, как они записаны.
Функция же 60 позволяет изменить атот порядок выполнения: она передает управление на оператор, следующий эа меткой 1. Например, в блоке [РВ06 '(Х) [60 В] А [ЯЕТ Х 5] В [БЕТ Х 7] ...] первым будет выполнен оператор [60 В], а следующим — оператор [ЯЕТ Х 7]. 35 Как и все функции, функция 00 имеет значение (им является 1). Однако воспользоваться этим значением никогда не удастся, поэтому данная функция вычисляется исключительно ради ее побочного эффекта — перехода по метке. Как.правило, эта метка известна заранее, позтому чаще всего в обращениях к функ.ции метки указываются явно. Но в общем случае метка может быть и вычислена, что можно использовать, например, для органиэации переключателя: [60 [Х (А В С Р)]). Здесь будет осуществлен переход по одной из меток А, В, С илп 0 в зависимости от того, какое текущее аначение имеет переменная Х: 1, 2, 3 или 4.
Отметим, что в плзнерских программах в роли меток могут выступать только те идентификаторы, которые находятся на верхнем уровне блочных функций. Ни в каких других позициях, например внутри условных выражений, идентификаторы не рассматриваются как метки. Поскольку операторами блоков могут быть обращения к любым функциям, в частности к блочным функциям, то возможна .вложенность одних блоков в другие. Все переменные и метки внутреннего блока считаются локалиаованными в нем и недоступными извне. Поатому использовать во внешнем блоке переменные внутреннего блока или осуществлять переход по метке внутреннего блока из внешнего аапрещено. А вот переменные и метки внешнего блока доступны из внутреннего блока. Так, функция ОО сначала просматривает метки ближайшего объемлющего ее блока; если нужная метка здесь есть, то на нее и осуществляется переход.
Но если ее нет, тогда. функция ищет эту метку во внешнем блоке. Аналогична ситуация и с переменными: если нужная переменная не описана во внутреннем блоке, то она берется иа внешгего блока. Функция ВЕТВЕЙ: [ВЕТНВЯ е), З()ВВ. Выше было сказано, что выход иэ блока осуществляется после того, как вычислен его последний оператор (если он, конечно, не привел к переходу по какой-либо метке).
Однако очень часто необходим выход из «середины» блока. В таком случае как раа и применяется функция ВЕТ()ВХ. Ее действие заключается в том, что она полностью аавершает вычисление ближайшей блочной функции и объявляет ее значением выражение Š— значение своего аргумента. Функция РО«[РО е«е« ... е«), РВОВ, з ) 1. Это «составной оператор». Функция по очереди вычисляет свои аргументы. Значение последнего аргумента является аиачезием функции. Например: [ОО [ЗЕТ Х 52] .Х] -~ 52 Фуикция 00 испольвуется в тех случаях, когда по правилам языка в каком-то месте программы должно находиться одно выражение, а по смыслу здесь нужно вычислить несколько выражений.
Сделав эти выражеиия аргументами функции ВО, мы удов,летворим обоим этим требованиям. Отметим, что обращаться к фуккцилм 60 и КЕТОВ)( можпо только внутри блочных функций, в то время как обращения к функциям ЯЕТ и РО допустимы и вне блоков. Кроме рассмотрекиых выше операторов присваивания, перв- хода, выхода и составного, в блоках лужны еще и условные операторы.
В роли такого оператора в языке выступает функция СОКР, поскольку з обращениях к ией можно укааывать любые функции, в частности и функции с побочными эффектами. Например, если мы хотим присвоить переменной Х зиачеиие 2, а перемеииой У вЂ” значение С, когда значением переменной 2 является число, хотим ничего не делать, когда значение 2 †шка, и хотим осуществить переход по метке Ь в остальных случаях, то это можно сделать, вычислив выражение [СОг[В ([К()М .2] [ЯЕТ Х 2] [БЕТ У С]) ([ВСАТ .2]) (Т [60 ЦЦ Таким обрааом, функция СОКР' используется в языке и как условное выражение, пааиачеиие которого — вычислить некоторое звачеиие, и как условиый оператор.
В любом случае функция вырабатывает некоторой значение, просто во втором случае око обычно игнорируется; главиое здесь — побочные эффекты функций, указанных в условном операторе. Отметим, что при яспольаовавии Функции СОг(Р как условного оператора удобна общая форма обращения к этой функции (см. б ЕЗ); если при истинности какого-то условия надо выполнить несколько действий, то в соответствующую клауеу записывается последовательность со. ответствующих операторов (см. первую клаузу в последнем примере); если никаких действий вообще пе надо предпринимать при выполнении условия, тогда в клауэу, кроме условия, ничего ле записывается (см, вторую клаузу в примере). Когда же СОР(Р используется ради вычисления какого-то значения, то, как правило, бессмысленно ааписывать в клаузе несколько выражеиий, поскольку виачекия всех их, кроме последнего, игнорируются.
Потому-то при использоваиии функции СОг(Р как условного выражения в' 37 каждой клаузе обычно указывается только условие и одно выражение. Познакомившись со встроенными функциями, имеющими побочный эффект, мы теперь мсжем рассмотреть пример испольвования функции РК06. Предположим, что вначением переменной Ь является список в круглых скобках, и напишвм функцию РК06, которая «переворачивает> этот список, т. е, переписывает в обратном порядке его влементы.
Переменная Ь является внешней по отношению к данному блоку. [РВ06 (1Л (ВЬ ( ) ) Е) [ЯЕТ РЛ .1] Ь[СОг(Р ([ЕМРТХ .1Л] [КЕТПВР( .КЬ])] [ЯЕТ Е [1 .Ь1]] [ЯЕТ 1Л [ВЕЯТ 1 Л1]] [ЯЕТ В1 (.Е (.К1)] [60 Ь]] В этом блоке вводятся три локальные переменные Ь1, ВЬ и Е, причем ВЬ получает начальное вначение (). Первый оператор блока присваивает список Ь переменной Ь1; это сделано для того, чтобы не портить значение внешней переменной Ь, а наменять только аначение локальной переменной Ь1. Все последующие операторы обраауют цикл, на каждом шаге которого от -спнска Ь1 отщепляется его первый элемент (сам элемент становится значением переменной Е, а «хвост« описка †нов значением переменной Ь1), и этот элемент вставляется в нужном порядке в списке ВЬ, где постепенно накапливается «перевернутый» список.