nsutextbook (1037554), страница 8
Текст из файла (страница 8)
P2 вызывается из P1. Переменные x и y существуют только в P2. Передача их значений в вызывающую программуневозможна.Можно использовать команду New в процедурах. При этом переменные, созданные спомощью команды New отличаются от локальных(private) переменных процедур. Команда New используется только для public-переменных, при этом public-переменная, объявленная с помощью New, существует с момента объявления до оператора Quit процедуры,в которой она была объявлена. Таким образом, можно скрыть public-переменные с темиже именами, которые возможно уже существуют на момент вызова процедуры.Например, имеем код в файле abc.Mac:abcset name="Tom"do MyProc(9,4)write !,"abc name= ", nameMyProc(x,y)[name]{New nameSet name="John"write !,"MyProc name = ",nameDo xyz()Quit}xyz()[name]{ write !,"xyz name = ",name}В данном примере процедуре “xyz” в программе “abc” позволяется видеть значение“John” переменной name, т.к.
name – public-переменная. Вызов команды New для переменной name защитит (скроет) public-переменную с именем “name” и со значением “Tom”,которая уже существует к моменту вызова “MyProc”.В результате вызова программы ^abc будет напечатано:MyProc name = Johnxyz name = Johnabc name= Tom3.3.8. Передача параметровПередача параметров происходит при:• Глобальном или локальном вызове программы• Вызове пользовательской функции• Вызове процедуры.Формы передачи параметров:• По значению33•По ссылке.3.3.10. Передача по значениюПри передаче по значению формальные параметры в начале вызываемой программыподчиняются неявной команде New.
При завершении вызываемой программы выполняется неявная команда Kill. Т.е. формальные параметры существуют только внутри вызываемой программы. Пример:Set a=1, b=2, c=3Do p1(a,b,c) // фактические параметрыwrite…P1(r,s,t)// формальные параметрыSet summ = r+s+tQuitПри вызове подпрограммы список фактических параметров должен точно соответствовать списку формальных параметров. Отдельные фактические параметры могут отсутствовать, однако запятые, обозначающие пропуск параметра должны быть поставлены.3.3.11.
Передача по ссылкеСинтаксис передачи по ссылке – это точка перед именем переменной в списке параметров. Переменная может, в отличие от метода, не существовать. Пример:Kill var// var не существуетDo P1(.var)// вызов с передачей параметра по ссылке…P1(x)// формальный параметр xSet x=0, x(1)=1, x(2), x(3)=3…QuitПосле выхода из подпрограммы P1 в основной программе существуют переменныеvar, var(1), var(2), var(3).При вызове подпрограммы обе формы передачи параметров могут смешиваться:Do ^Summ(a, b, c, .var)3.3.12.
Процедуры, программы, подпрограммы, функции, методы. Отличия и особенностиНаиболее гибкой и мощной формой является пользовательский блок, оформленный ввиде процедуры. Особенности процедур:• Может быть private или public.• Может иметь ноль или более аргументов.• Любые внутренние переменные процедуры являются локальными.• Может изменять внешние переменные или ссылаться на них.• Может возвращать значение любого типа или не возвращать ничего.Для сравнения:•Подпрограмма всегда является public и не может возвращать значение.•Функция всегда является public; требует явного объявления локальных переменных, иначе перекрывает внешние переменные; должна возвращать значение.•По умолчанию, метод является процедурой, которая объявляется как частьопределения класса.•Программа Caché ObjectScript может включать одну или более процедур,подпрограмм, функций, так же и различные их комбинации.34Замечание: ObjectScript также поддерживает особую форму пользовательского кода спомощью механизма макровызовов.3.4.
Оператор косвенности @Оператор косвенности позволяет преобразовать строку символов в программный кодв четырех четко описанных случаях:• Косвенное имя: преобразование в имя (например, переменной).• Косвенный аргумент: преобразование в полный аргумент команды.• Индексная косвенность: преобразование в индексированную переменную.• Косвенный шаблон: преобразование в шаблон при проверке по шаблону.3.4.1.
Косвенное имяСтрока преобразуется в имя переменной или имя программы.Пример:Set pname=”Prog1”do @pname // будет вызвана программа с именем Prog1Set var=”locvar”Set @var=4 // переменной с именем locvar будет присвоено число 43.4.2. Косвенный аргументСтрока преобразуется в аргумент команды, за исключением for, который косвенности не допускает.Пример:Set isetarg=”x=1”, @isetarg // set x=1Set ikill=”(e,f,g)”Kill @ikillSet inew=”(a,b,c)” New @inew3.4.3. Индексная косвенностьСлужит для расширения имен глобальных и локальных переменных. Ее синтаксический признак – дважды встречающийся оператор косвенности. Первый из них преобразуетидущую вслед за ним строку в имя переменной, второй добавляет к полученному именизаданный в скобках индекс (или индексы):Пример:Set x(2, 5,3)=“IndInd”Set feld=”x(2,5)”, d1=3Write @feld@(d1)Будет напечатано:IndIndМы видим расширение ссылки x(2,5) индексом третьего уровня со значением 3.3.4.4.
Косвенный шаблонС помощью косвенного шаблона появляется возможность при сравнении по шаблонурассматривать полный шаблон косвенно. Пример:Set lvmuster=”1.3N”If eingabe ‘?@lvmuster Do error353.5. Работа со строкамиТак как данные в Caché хранятся как строки, то работа со строками имеет большоезначение. COS не является языком строгой типизации, в отличие от большинства известных языков программирования. Все значения данных интерпретируются с соответствии сконтекстом, в котором они используются. При этом имена переменных чувствительны крегистру букв, в то время как команды нет.
Примеры интерпретации данных в соответствии с контекстом приведены ниже.SAMPLES>set x = 4 write x + 26SAMPLES>set x = "5" write x * 210SAMPLES>set x = "fred" write x + 33SAMPLES>set x = "32hut" write x / 48SAMPLES>write +x32SAMPLES>write 5 + 2, ?10, "5" + "2" , ?20, "5 + 2"775+2SAMPLES>3.5.1. Сохранение строк на дискеДля сохранения строки на диске перед именем переменной нужно поставить ^ (циркумфлекс). В этом случае, если удалить все переменные с помощью команды kill, глобальные переменные сохраняются. Пример:SAMPLES>set x = 4SAMPLES>set ^x = "Глобальная переменная"SAMPLES>killSAMPLES>writeSAMPLES>write ^xГлобальная переменнаяДля удаления глобальной переменной введите: SAMPLES > kill ^x.3.5.2. Операторы для строкДля строк определены два оператора:( _ ) – оператор конкатенации, сцепления строк(?) – оператор соответствия шаблону, один из наиболее интересных операторов Cache Object Script.3.5.3.
Оператор соответствия шаблону – ?Оператор ? – используется в логических выражениях и проверяет соответствие строки шаблону. Синтаксис:<Строка> ?<шаблон>Если соответствует, то выражение возвращает 1 (true), если нет то 0 (false).Шаблон состоит из одного или нескольких шаблонов, следующего вида:<кол-во><чего>[<кол-во><чего>]где <кол-во> это фактор повторения шаблона, <чего> – класс символов, которые могут повторяться. В табл.
4 приведены форматы факторов повторения, в табл.5 классы символов.36Таблица 4Форматы факторов повторенияКол-во3(число)ЗначениеШаблон должен повторяться ровно столько раз1.3Шаблон должен повторяться от 1 до 3 раз.3Шаблон должен повторяться самое большее 3 раза3.Шаблон должен повторяться не меньше 3 раз.Шаблон должен повторяться любое число, включая 0Таблица 5Классы символовКодЗначениеКодЗначениеAБуква (в верхнем или нижнемрегистре)CУправляющий символUБуква в верхнем регистреEЛюбой символLБуква в нижнем регистреANP Комбинация кодовNЧисло"abd" Литеральная строкаPПунктуацияПримеры:1.
348?3N – выдаст истину, т.к. строка – это 3 цифры.2. в переменной date находится дата в формате дд.мм.гггг. Следующая строка кодаможет служить проверкой правильности даты:if date?2N1P2N1P4N write “Ввод даты верен”.3. Для даты также может использовать следующий шаблон: 2N1”.”2N1”.”4N.4. 1U.AP – первый символ – прописная буква, остальные любое количество букв изнаков препинания.3.5.4.
Функции для работы со строкамиСо строками работают следующие основные функции:$Length(<строка>,[<разделитель>]) – возвращает длину строки или число подстрокстроки, если указан второй параметр.$Extract(<строка>,<выр2>,<выр3>) – возвращает подстроку из строки, начало и конец которой определяются вторым и третьим аргументом.$Find(<строка>,<подстрока>,<позиция>) – ищет подстроку в строке и возвращаетпозицию символа следующего за подстрокой, третий аргумент задает начальную позициюдля поиска.$Piece(<строка>,<разделитель>,<начало>,<конец>) – рассматривает строку как набор подстрок, разделенных разделителями, возвращает нужную подстроку, находящуюсямежду начальным и конечным разделителями.
Второй аргумент задает номер начальногоразделителя, третий аргумент – задает номер конечного разделителя.$Justify(<строка или числ выражение>,<длина>,<позиция точки>) – выравниваниечисла, которое может быть задано в виде строки заданной длины, с указанием нужногоколичества цифр после точки.Каждая из этих функций имеет альтернативную форму, см. документацию по Caché.Подобно командам функции не чувствительны к регистру букв.37SAMPLES>write $length("Длина этой строки?")18SAMPLES>write $extract("Клад в горах", 8, 12)горах ; извлечь символы с 8 по 12SAMPLES>write $find("Клад в горах", "гор")11SAMPLES>write $piece("кусочек пиццы", " ", 2)пиццыSAMPLES>write $justify(3.1415, 10, 3)3.142Функция $Piece уникальна и требует дополнительного обсуждения.
Эта функция работает со строкой, использующей разделители, например: «22-55-77», где “-“ – разделитель. Она может возвращать пустую строку, если строка находится между двумя разделителями. Сама строка рассматривается как запись, а подстроки как поля этой записи. $Pieceрассматривает передаваемую в виде первого аргумента строку символов как последовательность полей, разделенных разделителем, передаваемым в качестве второго аргумента.В форме с двумя аргументами функция возвращает первое поле:$Piece(<строка>, <разделитель>[, ])Например:SAMPLES>write $piece("кусочек пиццы", " ")кусочекВ форме с тремя аргументами функция возвращает заданное третьим аргументомполе:SAMPLES>write $piece("кусочек пиццы ", "ц", 1)кусочек пиSAMPLES>set street=$piece("Новосибирск^Русская^35^630058", "^", 2)SAMPLES>write streetРусскаяВ форме с четырьмя аргументами – поля в области от аргумента три до аргументачетыре:SAMPLES>write $piece("Новосибирск^Русская^35^630058", "^",2,3)Русская^35Также заметим, что $Length имеет ориентированный на такие строки вариант: онавозвращает число подстрок в такой строке, базирующейся на разделителях.SAMPLES>write $length("Новосибирск^Русская^35^630058", "^")43.5.5.