Шпора (1156622), страница 7
Текст из файла (страница 7)
Вычисление функции начинается с того, что вводятсялокальные переменные, перечисленные в ее первом аргументе. Если vi – идентификатор (имя),вводится локальная переменная с этим именем и без начального значения. Если же vi – пара (idval), то вводится локальная переменная с именем id и начальным значением val (выражение valпри этом не вычисляется). После этого функция последовательно вычисляет остальные своиаргументы – формы ei, которые принято называть операторами. Вычислив последний из них,функция с его значением заканчивает работу, уничтожив при этом свои локальные переменные.Вычисленные значения всех операторов (кроме последнего) нигде не запоминаются,поэтому имеет смысл в качестве таких операторов использовать только функции/операторы спобочным эффектом.
Некоторые из этих функций перечислены ниже.[set v e]Это аналог оператора присваивания. Сначала вычисляются оба аргумента, причем значениемаргумента v должно быть имя переменной, существующей в данный момент. Функцияприсваивает этой переменной новое значение – значение аргумента e. Это же значение являетсязначением функции set, но оно, как правило, не используется.[return e]Это оператор выхода из блока. Функция return может использоваться только внутри функции prog,поскольку она завершает вычисление ближайшей объемлющей блочной функции, объявляя еезначением значение своего аргумента e.[go e]Это оператор перехода.
Отметим, что если в качестве оператора функции prog указанидентификатор, то он трактуется как метка. Значением аргумента функции go должен бытьидентификатор – одна из меток ближайшей объемлющей блочной функции. Функция goполностью завершает выполнение того оператора этой блочной функции, в который она входит(на любом уровне), и передает управление на оператор, следующий за этой меткой.В качестве операторов можно использовать составной оператор: [do e1 e2 … ek] ( k≥1),а также операторы цикла (loop, while, until, for).
Мы рассмотрим только первый вид операторацикла:[loop x l e1 e2 … ek]При выполнении этого оператора вводится параметр цикла x, локализованный внутри loop, затемx поочередно получает в качестве значения очередной элемент списка L (слева направо), ккоторому применяются операторы e1 e2 … ek.Пример: [set L (1 2 3))][prog ((R ( ))) [loop E .L [set R (.E !.R)] .R]]- описанный блок переворачиваетвходной список (значение переменной L), помещая в конец списка R (в начальный моментпустого) элементы L: сначала первый, затем второй, затем третий.
Результатом работы prog будетзначение переменной R на момент завершения цикла – список (3 2 1).КонстантыКак и в Лиспе, константами в Плэнере называются глобальные перемеенные. Они вводятсятак: [cset c v] – константе с именем C присваивается V.Функции ввода-выводаВ Плэнере имеется достаточно богатый набор функций ввода-вывода, включающий:функции для работы с файловой системой; функции ввода и вывода символов, текста, строк;функции установки цвета фона и символов, управления курсором и др.Ниже приводится фрагмент программы, использующей некоторые средства ввода-вывода:[open screen get]файл screen открывается на ввод[active screen get]файл screen переводится в состояние "активный файл ввода"[cset a [read]]клавиатуре)считывается очередное выражение (в данном случае, набираемое на[cset b [rev :a]]и его значение присваивается константе a; пусть это выражение – (N O T).константе b присваивается (T O N).[open ff put]файл с именем ff открывается на вывод[active ff put]файл ff переводится в состояние "активный файл вывода"[print :b]в файл ff "печатается" (записывается) выражение (T O N).Специальные функцииВ Плэнере имеется более десятка т.н.
специальных функций, реализующих взаимодействиес операционной средой, интерпретатором (перехват синтаксических ошибок с целью их анализа впрограмме пользователя), а также преобразование типов. Несколько примеров:[catch e1 e2]Функция вычисляет E1 и, если вычисление закончилось успешно, с этим значением заканчиваетсвою работу. Если же в процессе вычисления возникла ошибка, вычисляется значение второгопараметра.[exit e fn n?]Выход из функции FN со значением E, если параметр n задан, то выход из N+1 динамическивложенных обращений к функции FN.Частный случай – выход на верхний уровень программы: [exit ( ) ( )].[time]Значение функции – время от начала решения задачи.[clock]Дата и астрономическое время.[atl a]Функция преобразует идентификатор A в список составляющих его символов.
Например, [atlPLAN] → (P L A N).Образцы и сопоставителиДля анализа данных в Плэнере наряду с традиционными способами (применение функций дляработы со списками, логических функций, предикатов, блоков) можно использовать:- функцию is, реализующую сопоставление образца с выражением,- сопоставители – особые процедуры (к которым можно обращаться только в образцах),проверяющие те или иные свойства выражения и его соответствие образцу в целом илиотдельному элементу образца.Соответствующие возможности Плэнера мы рассмотрим кратко и в основном на примерах.Образец – выражение, которое используется как шаблон при анализе другого выражения (задаетструктуру и отдельные компоненты этого выражения).Если выражение удовлетворяет требованиям шаблона, то говорят, что оно соответствуетобразцу, если нет, то не соответствует.
В первом случае сопоставление образца с выражениемудачно, во втором – неудачно.Обращение к функции is выглядит так:[is pat e], где pat – образец, e – выражение (сопоставление производится с E – значением e).Алгоритм сопоставления в общем случае сложен, он предполагает возвраты. Важно, что удачноесопоставление может сопровождаться побочными эффектами – переменным, входящим в составобразца могут присваиваться в качестве значений соответствующие фрагменты выражения. Этопозволяет резко сократить запись сложных действий по анализу данных и выделению важных дляработы фрагментов.Примеры (считаем, что используемые переменные описаны вне обращений к is, например, вкаком- то объемлющем блоке):[is (*X .X) (b b)] → T - сопоставление удачно, X (побочный эффект) получает значение bотметим, что при сопоставлении первого элемента образца (*X) спервым элементом выражения (b) переменная X получила значениеb;второй элемент образца (.X) требует, чтобы рассматривалосьтекущеезначение переменной X (префикс точка), т.е.
как раз b; поэтомуудачным будет и сопоставление второго элемента образца совторымэлементом выражения.[is (*X .X) (b (b))] → ( )- сопоставление неудачно;[is (*X !*Y) (1 2 3)] → T- сопоставление удачно; X:= 1, Y:= (2 3)[is (*X *Y) (1 2 3)] → ( )- сопоставление неудачно (образец описывает список длиной два).Обращение к сопоставителю внешне выглядит как обращение к функции.
Однако: значение невырабатывается, проверяется соответствие выражения/подвыражения образцу/элементуобразца, фактические параметры (аргументы) обычно уточняют вид проверки.Пример: [list n] - сопоставитель, соответствующий списку из N элементов[is [list 2] (a b)] → T- сопоставление удачно;[is [list 2] (a b c)] → ( )- сопоставление неудачно;[is (a <list 2> a) (a b b a)] → T- сопоставление удачно (сегмент b b соответствуетсегментномуобращению к сопоставителю list;[is (a [list 2] a) (a (b b) a)] → T- сопоставление удачно.В Плэнере есть около 30 встроенных сопоставителей, в том числе: логические (типа and и or),типа сond, типа prog (вводят локальные переменные).Сопоставитель [ ] соответствует любому выражению, сопоставитель < > - любому сегменту.Некоторые встроенные сопоставителиСопоставители (без параметров): id (идентификатор), num (число), var.
(обращение к переменнойс префиксом "."), var*, var:, var!., var!*, var!:, atomic (атомарное выражение) – проверяют типвыражения.[aut pat1 … patn] – сопоставитель "ИЛИ"; сопоставление с некоторым выражением успешно, есливыражение соответствует одному из указанных образцов.[et pat1 … patn] – сопоставитель "И"; сопоставление с некоторым выражением успешно, есливыражение соответствует каждому из указанных образцов.[when pat1 pat1,1 pat1,2 … pat1,k1) … (patn patn,1 patn,2 … patn,kn)] – "УСЛОВНЫЙ" сопоставитель; есливыражение соответствует образцу pati, то применяется сопоставитель [et pati,1 pati,2 … pati,ki].[star pat] – сопоставитель соответствует списку, каждый элемент (верхнего уровня) которогосоответствует образцу pat.Определение новых сопоставителей[define <имя> (kappa <список параметров> pat)]Пример:[define pal (kappa ( )[aut ( ) [list 1] [same (X) (*X <pal> .X)]])]- рекурсивный сопоставитель pal соответствует любому списку-палиндрому; в нем использованы:логический сопоставитель aut (аналог or), известный нам сопоставитель list, сопоставитель-блокsame (вводящий локальную переменную X).
Сопоставитель pal проверяет (последовательно): неявляется ли выражение пустым списком; списком длиной 1; списком, первый и последнийэлементы которого совпадают, а «середина» удовлетворяет требованиям pal.Плэнерская база данныхБаза данных Плэнера не имеет никакого отношения к базам данных как объектутрадиционного программного обеспечения (реляционным или сетевым, СУБД). Она похожа на т.н.доску объявлений.Плэнерская база данных – это область памяти системы программирования на Плэнере, вкоторой хранятся утверждения.
Утверждение представляет собой произвольный L-список,семантику которого (как и семантику всего наполнения базы данных) определяет пользователь.Рекомендуется использовать базу данных для моделирования динамически меняющейсяпроблемной среды: текущий набор утверждений отражает текущее состояние проблемной среды,запись или вычеркивание утверждений соответствует происходящим в среде изменениям.Динамика базы данных отражает динамику поиска /планирования решения задач.Основные операции над базой данных: запись утверждения, вычеркивание утверждение(по образцу), поиск утверждения (по образцу).Запись[assert asrt with? rec? else?] – функция assert служит для записи явно заданного (в виде L-списка)утверждения asrt в базу данных.