В.Н. Пильщиков - Язык Плэнер (1156455), страница 20
Текст из файла (страница 20)
Удачным является и сопоставление [1Я (А <А()Т (+) (+ «Х +) > С) (А + В + С)] так как второму элементу обравца-списка ставится в соответствие сегмент + В + и при' этом сопоставление обрааца [А()Т (+)' (+ «Х +)] со списком (+ В +) удачно; аначением переменной Х становится атом В. В то же время сопоставление [1Я (А <А()Т вЂ” +> В) (А + В)] неудачно. Действительно, образец <А()Т вЂ” +> здесь сопоставляется с сегментом из одного, элемента +, а это сопоставление неудачно, поскольку неудачно сопоставление обраэца [А()Т вЂ” +] со списком (+). Неудачным является и сопоставление [1Я (<АТОМ> 1»Х) (А В С)], так как образцу [АТОМ] ие соответствует никакой список и, следовательно, обраэцу <АТОМ> не соответствует ни один сегмент.
Как и функции, сопоставители делятся на встроенные и оиределяемые. Правила вычисления встроенных сопоставителей заранее 'известны в языке, поэтому их не надо определять, а можно прямо обращаться к ним. Эти сопоставители осуществляют проверку простейших свойств и задают основные способы объединения обраацов. На баае встроенных сопоставителей и других обраацов можно определять новые сопоставители, описывая в виде них шобые желаемые правила анализа данных.
В следующем параграфе рассматриваются встроенные сопоставители язына, а в $2.7 будут описаны правила определения новых сопоставителей. 2.6. Встроенные сопоставнтелн — идентификаторы, — целые числа, — вещественные числа, — любые числа, — шкалы, — атомы, —:-переменные, †.-переменные, — «-переменные, — простые обращения к переменным, в 1КТ ВЕАЕ НБМ ЯСАКЕ ЛТОМ ЧАВ: ЧАВ. ЧАВ« ЧАРР 95 Как и встроенные функции, встроенные сопоставители делятся на два класса — ЯПВВ и ГЯПВВ.
К классу ЯСВК относится сопоставители, все аргументы которых выэываготся по аначению. Следовательно, аргументы таких сопоставителей должны быть простыми формами, а выполнение соноставителей иачииаетсн только после того, как вычислены значения всех их аргументов. Остальные встроенные сопоставнтелн относятся к классу РЯУВВ.
Их аргументами, как правило, являются простые обраацы, а они, естественно, не вычисляются. При описании каждого встроенного сопоставителя мы будем указывать его класс, вид простого обращения к нему и правило сопоставления при таком обращении. Использоваться будут те же 'обозначения, что и при описании встроенных функций. Символом рог будут обозначаться только простые образцы. Первая группа встроенных сопоставителей, которые мы рассмотрим,— это сопоставители, проверяющие тип сопоставляемых с ними выражений. Ниже перечислены те из них, которые проверяют типы атомарных выражений; слева указаны названия этих сопоставителей, а справа — тип тех выражений, которым и только которым они соответствуют.
Все эти сопоставители не имеют аргументов. ЧАВ!: 1:-переменные, ЧАВ!., 1,-переменные, ЧАВ!» — !»-переменные, ЧАНЯ .. сегментные обращения к переменным, ЧАК любые обращения к переменным, АТОМ1С вЂ” атомарные выражения. Примеры: [[Б [АТОМ1С] ()] — () [1Б ([ЧАВР] [НВМ)) [!)(?ОТЕ (:Р1 3.!4)]] -» Т [1Я (А (П» С) (А В С)Д -» () Следующие четыре сопоставителя относятся к кла»осу РБПВК и проверяют типы списковых выражений: [ЫЯТ раз?] — 1 списки (с круглыми слобками), [ЫЯТР рас?] — Р-списки (с квадратными скобками), [ЫЯТЯ раэ?] — Я-списки (с угловыми скобками), [ЫЯТК р»П] — любые списки.
Все эти сопоставители действуют аналогично, поэтому огра- ничимся описанием правила сопоставления только для сопоста- вителя ЫБТ. Если при обращении к етому сопоставителю не задан аргумент, то сопоставитель соответствует любому 1 списку. Если же -аргумент задан, то сопоставитель соответствует только тем 1 спискам, длина которых сответствует обраацу раа Таким обра- зом, проверив, что с ним сопоставляется 1 список, сопостазитель определяет его длину и полученное число сопоставляет с раз. Если это сопоставление удачно, то считается, что сопоставитель ЫБТ соответствует аналиаируемому списку, неудачно — не аоот- ветствует.
Примеры: [1Я [ЫЯТЯ) ДЗОТЕ (А В>]) -~- Т [1Я [ЫЯТК 3) (А (В С))] -» () [1Я [ЫБТ»Х] (А (В С))] -» Т, Х:=2 [1Я (А (ЫБТ 0> В) (А В)] -~. Т [13 (А <ЫЯТР> Е) (А В С П Е)) -» () Неудача сопоставлении в последнем примере обусловлена тем, что сопоставление образца (ЫЯТР> с сегментом В С В, согласно правилу десегмеитации, сводится к сопоставлению образца [Е1ЯТР] с 1 списком (В С П), а оно неудачно. (Напомним, что сегменты всегда ааключаются в к р у гл ы е скобки.) Имена перечисленных вмше, а также ряда других встроенных сопоставителей совпадают с именами встроенных функций.
Естественно, возникает вопрос: что имеется в виду — функция или сопоставитель, когда в программе встречается обращение к про- цедуре, скажем, с именем АТОМ? Ответ такой. Если данное обращение указано а том месте, где могут находиться только формы, то оно рассматривается как обращение к функции (образцы не являются формами, их )«слазя вычислить). Позтому выражение [ЯЕТ Х [АТОМ .У)) законно, а выражение [БЕТ Х [АТОМ)) оши бочно (у функции АТОМ должен быть один аргумент). В образцах же предпочтение отдается сопоставителям: если в том месте, где должен находиться образец, встретилось обращение к процедуре, которая может быть как функцией, так и сапоставителем, то оно рассматривается как обращение к сопоставителю.
Поэтому выражения [1Я [АТОМ) .Х) и [1Б ([АТОМ) В) (А В)) ваконны, а выражения [1Б [АТОМ .Х) Т) и [1Я ([АТОМ А) В) (А В)) ошибочны, так как у соиоставителя АТОМ не должно быть аргументов. Таким обравом, в позиции обравца нельзя обращаться к функции, имя которой совпадает с именем сопоставителя. (Отметим, что одноименными могут быть только встроенные процедуры.
Определение же новой процедуры с именем, которое имела другая, встроенная или определяемая, процедура, приводит, как известно, к уничтожению последней.) Обращедие к следующему встроенному сопоставителю «вынадаетэ из общего синтаксиса обращений к процедурам: [) Этот пустой Р-список воспринимается в языке как обращение к сопоставателю, которому соответствует любое выражение. Такой образец испольауется тогда, когда надо указать, что в соответ- . ствующей повиции аналиаируемого списка должен находиться какой-то один элемент, а какой именно — не играет роли. Например, проверить, является ли значение переменной Х 1 списком иа четырех элементов, первый из которых — атом А, третий— атом С, а два других — любые, можно так: [1Я (А [) С [)) .Х) Сегментное обращение к этому беаымяиному сопоставителю записывается в виде пустого Я-опнска: < >.
Этому образцу соответствует любой сегмент. Поэтому [1Я (вХ ( > .Х) (А В В А)) -~ Т, Х: = А [1Б (< > [ВЕАЦ < >) (А 5 В С 2.4)) -~ Т В отличие от обрааца [), образец < > используется тогда, когда надо указать, что в соответствующем месте анализируемого списка может находиться л ю б о е количество злементов, в том числе и ни одного. Поэтому [1Я (Л [)) (А)) -~. (), по [1Я (А < >) (А)) — Т [1Я (А [)) (А В)) -~. Т и [1Я (А < >) (А В)) -~.
Т [1Б (А [)) (А В С)) -ь (), но [1Я (А < >) (А В С)) -ь Т 7 Н. Н, Пильщиков Отметим также разницу между образцами [] и еХ и образцами < ) и !еХ. Каждый образец первой пары соответствует любому одному выражению, а каждый образец второй пары — любому сегменту. Однако при сопоставлении образцов [] и < г иет побочных эффектов, в то время как при сопоставлении образцов еХ и !еХ переменной Х присваивается некоторое значение. Поэтому образцы «Х и !»Х применяются тогда, когда нам надо не только указать, что в соответствующем месте анализируемого выражения должно что-то находиться, но и надо это ечто-то» выделить, присвоить переменной. Если же это ччто-тоз нас не интересует, то лучше использовать образцы [] и < ). Например, если мы хотим узнать только одно — есть ли среди элементов списка В хотя бы один подсписок (с любыми скобками) из трех элементов, то это лучше сделать с помощью сопоставления [18 (< > [ЫЯтв 8] < Р) .Ц, а ке сопоставления [18 (1еХ [1ДЯТВ 8] 1еХ) .Ц, поскольку в последнем случае приходится вводить лишшою вспомогательную переменную Х.
Следующая группа встроенных сопоставителей — это так называемые арифкетическиа оопоставители. Они относятся к классу ЯПВЕ. Сначала они проверяют, является ли числом сопоставляемое с ними выражение Е. Если нет, оопоставлеиие неудачно. Иначе это число сравнивается со значением их аргумента — с числом № Если проверяемое отношение (ниже оно указано справа) выполняется, тогда сопоставление удачно, не выполияется - неудачно. [Ьт ] — Е ~ )77 [ЬЕ в] — Е(Ж7 [ОТ и! — Е ) №7 [ОЕ и] — Е > !72 Примеры: [18 [ЬТ 4] А] -в () [1Я [ЬТ 4) 2.8] -~- Т [1Я [ВТ 5.2] 7] -~ () [18 [11ЯТ [СЕ 2]] (А В)] -+. Т Третья группа встроенных сопоставителей — зто логические сопоставители. Сопоставитель Р(ОЕП [МОХ рог], РЯ()ВВ.