В.Н. Пильщиков - Язык Плэнер (1156455), страница 21
Текст из файла (страница 21)
Это чотрицавиез образца ра1. Сопоставитель Р(ОН соответствует сопоставляемому с ним выражению тогда и только тогда, когда это выражение не соответствует обраэцу раь Например: [1Я [ИОН [АТОМ]] А] -«() [1Б (<11ЯТ «Н) [НО)Ч А] ( )) (А А В)] -«Т, Н:=2 Отметим, что при любом исходе сопоставления выражения с данным сопоставителем все побочные аффекты этого сопоставления уничтожаются. Действительно, если обраэец рот ле соответствует аналиаируемому выражению, то побочных эффектов нет, а если рот соответствует выражению, тогда сам сопоставитель МОХ сигнализирует о неудаче, поэтому побочные эффекты все равно будут отменены. Например: [1Б [)ЧОН («Х А)] (А В)] -«Т [1Б [1(ОН «Х] А] -«() и в обоих случанх переменная Х не иаменит своего вначения.
Сопоставителэ ЕТ: [ЕТ рот~ ... рагь], РАВЕ, й > 1, Это «конъюнкция» образцов раап сопоставитель ЕТ соответствует анализируемому выражению, только если оно соответствует всем образцам расс. Более точно, сопоставнтель просматривает слева направо свои аргументы-обраэцы н по очереди сопоставляет их с выражением. Если все эти сопоставления удачны, то считается, что сопоставитель соответствует этому выражению. Но если сопоставление какого-'то образца ратг с выражением неудачно, то оставшиеся образцы не рассматриваются, побочные эффекты сопоставления предыдущих аргументов-обраэцов уничтожаются и сопоставление ЕТ с выражением аавершается неудачей.
Примеры: [1Б [ЕТ [1ХТ] [СЕ 0]] 5] -«Т [1Я [ЕТ [1ЛЯТ 3] (А!«Х)] (А В С)] -«Т, Х:=* (В С) [1Б [ЕТ («Х + «У) ([1В] + [ЖОМ]Ц (А + В)] -ч- () [1Я [ЕТ «Х [АВБ,Х]] А] ошибка Отметим, что в предпоследнем примере переменные Х и У не меняют своих вначений, а ошибка в последнем примере выэвана тем, что полученное переменной Х нечисловое эначение А испольэовалось как аргумент функции АВЯ, что эапрещепо правилами яаыка. Наиболее часто сопоставитель ЕТ используется в тех случаях, когда требуется некоторой переменной Х присвоить в качестве эпачения аналиэируемый объект, но только при условии, что этот 99 объект обладает свойством,'которое проверяется некоторым образцом рах Сделать это можно, построив обрааец (ЕТ ра«»Х], который сначала проверяет, обладает ли аналиаируемый объект нужным свойством, а затем, если объект прошел проверку, присваивает его переменной Х.
Например, найти среди алементов списка Е самое левое число и присвоить его переменной Х можно так: [1Б (() [ЕТ [ЕОМ] »Х] ( )) .Ц ' Сопоставитель БАМЕ. Обращение к этому сопоставнтелю имеет следующий вид: [БАМЕ (и«о» ... о„) рвц ... ра«»], РАВЕ, т>~0, )«)>1. Сопоставитель БАМЕ действует аналогично ' сопоставителю ЕТ, но на время своей работы вводит локальные переменные согласно их описали«о (о~ и» ...
о ), что делается так же, как в функции РКОО (см. 1 1.9). Например: [1Я [БАМЕ (Х) [Е(ЯТ 4] (»Х ( ) .Х)] (А В С А)] -~ Т СопОставитель АУТ«[АОТ ра«, ... ра«»], РЯОВК, й ) 1, Это «дизыонпция» образцов уа««. Сопоставитель просматривает слева направо свои аргументы-образцы и по очереди сопоставляет их с анализируемым выражением. Если все эти сопоставления неудачны, то соответствия между сопоставителем и выражением нет.
Если же нашелся образец раап которому соответствует анализируемое выражение, тогда сопоставитель, не рассматривая оставшиеся аргументы, аавершает сво«о работу с удачей. Пример: [1Б [А()Т («Х В) (А «Х) («Х С)] (А С)] -~- Т, Х:=С Рассмотрим иа примере сопоставителя А()Т принцип построения сегментных образцов; такое построение нередко вызывает затруднения у программирующих на планере.
Предположим, что требуется написать образец, которому соответствует пустой сегмент или сегмент иэ одного элемента +. Ясно, что этот образец должен быть сегментным, раз он сопоставляется с сегментами, но вот сообразить сразу, каков конкретно атот образец, наверное, трудно. Выйти из затруднения помогает правило десегментации, согласно которому простой вариант данного образца должен соответствовать пустому списку ( ) или списку (+). Построить же такой простой обрааец легко — зто [АПТ () (+)]. Теперь, возвращаясь к сегментному варианту, получаем искомый образец: (АОТ () (+) г» Примеры использования этого обрааца: [1Я (<А()Т () (+) > А — В) (А — В)] -» Т [1Я (<А()Т () (+)> А — В) (+ А — В)] -ь Т [1Я (<А11Т () (+) > А — В) ( — А — В)] -~- () Таким обрааом, сегментный обрааец сначала следует строить так, как если бы он был простым образцом, который сопоставляется с 1 списками, и лишь затем следует перейти к сегментному варианту, т.
е. ваменить внешние квадратные скобки простого обрааца па угловые (ничего пе мепяя при етом «внутри» обрааца). Сопоставитель %НЕХ, Это условный сопоставитель. Он относится к классу РЯБВК. Обращение к нему имеет следующий вид: [ЪЧНЕХ (Ра«раг д ... рог»,„) ... [Рать ра«„... рогам )), где 5 ~ 1, т«) О. Данный соиоставитель действует так.
Сначала он по очереди сопоставляет анализируемое выражение с образцами ро㫠— первыми элементами своих аргументов (клауа). Если выражение не соответствует ии одному из них, то соответствия между сопоставителем и выражением нет. Если же нашелся обрааец рог«, которому соответствует аналиаируемое выражение, тогда остальные клаувы уже не рассматриваются и действие сопоставителя сводится к последовательному сопоставлению выражения с оставшимися обравцами иа этой ьй клаузы, а точнее, к сопоставлению выражения с образцом [ЕТ расы Ра»ш ...
Рог«ю.] (при и» вЂ”вЂ” О такое сопоставление считается удачным). Например, образец [ЪЧНЕХ ([Ш] А) ([Х()М] [ОЕ 2] [ЬЕ 5]) ([])] иа всех идентификаторов соответствует только идентификатору А, из чисел — только числам от 2 до 5, а из выражений иных типов — чему угодно. В последи«ою группу встроеппых сопоставителей языка входят сопоставители ЫХЕАВ, ЯТАВ, ОХЕ-ОР, РАТ, ВЕ и НАЯ. Сопоставитель ЫХЕАК. Обращение к нему таково: [ЫХЕАВ Ра«Ра«а ...
Ра»ь), РЯСВК, Ь)б. В отличие от всех других встроенных сопоставителей, у етого сопоставителя аргументами могут быть как простые обравцы, так и сегментные. Сопоставителю ЫХЕАВ соответствуют списки с любыми скобками, при атом правила его сопоставления аналогичны правилам сопоставления образца-списка [раг' рог' ...- рог'1 1 2''" » Таким образом, данному сопоставителю соответствует любой список, если такой же список, во в круглых скобках, соответствует указанному образцу-списку. Например: [1Я [11ХЕАВ 1ХВЕХ 1»Х [ЧАВ]] [ОСОТЕ <1ХОЕХ 1 2:А>]] Т, Х:= (1 2) 101 Сопоставитель ЯТАК: [ЯТАВ рог], РЯОВВ.
Данный сопоставитель соответствует любому списку, каждый злемевв которого соответствует образцу рад Более точно, сопоставнтель БТАВ, проверив, что аналивируемое выражение является списком (с любыми скобками), сопоставляет образец рос по очереди с каждым элементом этого списка. Пустым спискам данный сопоставитель соответствует всегда.
Например, образец [ЯТАВ [10]] соответствует любому списку, все элементы которого — идентификаторы, а обравец (БТАК [1О]> соответствует любому сегменту из идентификаторов: [1Б [БТЛН [1О]] (Л В С)] т [1Б [БТАВ [10Ц (Л В 2.4 С)] -«() [1Б ($«Х (БТАВ [1О]>) (1 2 А В)] -«Т, Х:= (1 2) Напомним, что, согласно общему принципу сопоставления, побочные аффекты удачного сопоставиения сохраняются, а в случае неудачи ояи уничтожаются.
Поэтому [1Я [ЯТАВ «Х] (Л В С)] -«Т, Х:= С [ВО [ОНАЯБ16М Х] [1Б [БТАН .Х] (А А)]] -«Т, Х:=А [)>О [13МАЯЯ1ОМ Х] [1Б [ЯТАВ.Х] (А В)Ц -«() (в последнем примере переменная Х остается без значения). Сопоставитель ОНЕ-(УР: [СНЕ-ОР 1], ЯУВВ. Значением аргумента должен быть список. Сопоставитель соответствует анализируемому выражению тогда и только тогда, когда это выражение равно одному иа элементов данного списка. Например: [ОО [БЕТ Х (Л В С)] [1Я [ОНЕ-ОР .Х] О]] -«() [1Я ()«Х (ОНЕ-ОР (+ — )] ( >) (А — В + С)] -«Т, Х:= (А) Сопоставитель РАТ: [РАТ е], БОВИ. Значением аргумента должно быть выражение, которое может выступать в роли простого образца.
РАТ сопоставляет этот образец с анализируемым выражением. Если ато сопоставление удачно, то сопоставитель РАТ соответствует выражению,'неудачно — не соответствует. Данный сопоставитель применяется в тех случаях, когда с анализируемым выражением надо сопоставить обравец, который заранее неизвестен, а является значением какой-нибудь перяменной или строится во время вычисления программы. 102 Пусть, к примеру, значением переменной Х является список (А «У). Тогда [1Б [РАТ .Х) (А В)) -» Т, У:= В В то же время [1Б .Х (А В)) -» . () Действительно, если в первом примере вначение переменной Х рассматривается как обрааец, который с о и оставляется со списком (А В), то во втором примере зто значение просто ар а впиваетсяя, а зти деа списка не равны.
Сопоставнтель ВЕ: [ВЕ е), Б()ВВ. Данный сопоставитель «игнорирует» сопоставляемое с ним выражение и интересуется только значением своего аргумента. Если оно равно (), то сопоставитель не соответствует никакому выражению, а при других значениях аргумента сопоставитель соответствует л«сбоку выражению.
Сопоставптель ВЕ испольауется обычно в тех случаях, когда в процессе сопоставления надо что-то выполнить с помощью функций. Например,при сопоставлении [РБ (( ) [ЕТ [АТОМ) еХ [ВЕ [РЕПА .Х)]) (Р) ((А) (В С) П Е)) -» Т переменной Х будет присвоено аначение П и зтот атом будет выдан на печать. В $1Л6 была. описана встроенная функция ЕХ(Т, с помощью которой можно прекратить выполнение любой объемлинцей процедуры. Там был рассмотрен выход иа функций, здесь же мы рассмотрим выход из сопоставителей. Пусть дано обращение к функции ЕХ1Т: [ЕХ1Т «гя я7) и пусть значением аргумента уя является идентификатор' РК— нмя некоторого сопоставителя, объемлющего данное обращение. Тогда функция ЕХ1Т завершает работу этого сопоставителя; объявляя выполняемое им сопоставление неудачным, если значенизм аргумента е является пустой список (), или удачным, если значение аргумента е отлично от (); В случае «неудачного» выхода все побочные аффекты, имевщие место с начала выполнения сопоставителя, отменяются, при «удачном» же выходе побочные эффекты сохраняются.
Третий аргумент функции ЕХ1Т указывает, из какого по счету объемлющего сопоставителя с именем РУ осуществляется выход. Если етого аргумента нет или если его значение У равно 103 нулю, тогда имеется в виду ближайший объемлющий сопоставитель Р)У, при других вначениях — ()У+1)-й по счету сопоставитель РХ Если среди объемлющих процедур нет.нужного сопоставителя, тогда функция ЕХ1Т осуществляет выход на верхний уровепь программы (см. $116).
С учетом сказанного образец [БАМЕ (Х) [ОУПЕН ([ЛТОМ] [1111М]) (еХ [ВЕ [ЕХ!Т .Х БАМЕЦ ) ] ] выражений из всех атомов соответствует только числам, а из нных типов — чему угодно, кроме пустого списка (). Сопоставитель НАБ. Обращение и ному имеет вид [НАЯ 1лй~ рац ... 1лбь разд], РБОВВ, й рв 1. Этот сопоставитель соответствует только идентификаторам, причем таким, чьи списки свойств удовлетворяют следующему требованию: значения свойств с названиями 1110~ (это значения аргументов 1лА) должны соответствовать образцам разо Более точно сопостаэнтель НЛЯ действует так.-Если анализпруемое выражение — пе идентификатор, сопоставление неудачно. Иначе сопоставптель вычисляет аначеиие 1)УВ, своего аргумента 1ийь находит в списке свойств идентификатора свойство с названием 1Р10, и значение этого свойства (либо пустой список (), если такого свойства нет) сопоставляет с обраацом разз. Если данное сопоставление удачно, то сопоставитель выполнлет аналогичные действия по отношению к следующей паре аргументов — 1ибз и разо и.