nsutextbook (1037554), страница 7
Текст из файла (страница 7)
Они применяются для построения макробиблиотек ичерез директиву Include – отсюда и их название – могут быть использованы в макропрограммах.4.Объектный код (.OBJ) – это промежуточный код, компилируется в объектный код.Это происходит автоматически при сохранении отредактированной программы. Вовремя выполнения используется только объектный код. Фирмы разработчики тиражируют свои приложения большей частью в объектном коде.Диалог сохранения также позволяет задать расширение RTN, которое не являетсяреальным расширением для программ.
Это просто способ показать все программы сразубез дублирования.27Текст программы набирается в Caché Studio. Проверка выполнения производится вCaché Terminal.В случае ошибки выдается имя метки+ смещение, где произошла ошибка. Например:SAMPLES>do ^badroutine<UNDEFINED>start+3^badroutineSAMPLES 2do>quitSAMPLES>Строка программы может иметь метку в начале, называемую тегом, код команды икомментарий, но все эти элементы являются необязательными. Все эти элементы отделяются друг от друга табуляцией или пробелами. Например:end quit ; конец3.3.2. Основные структуры программы CachéПрограмма в Caché состоит из индивидуальных блоков, создаваемых и редактируемых как исходный код. Программа состоит из подпрограмм, процедур и функций.Имя программы – определяется именем MAC-файла, в котором она хранится, этолюбая комбинация буквенно-цифровых символов ASCII, имя не должно начинаться сцифры.
При сохранении программы в файле ее имя не должно содержать символы: _(подчерк), - (минус), ; (точка с запятой). Имя, включающее эти символы, не является верным.Вызов программы:Do ^RoutineNameПервой строкой программы может быть оператор с меткой (тегом), метка может сопровождаться списком входных параметров, заключенных в круглые скобки.Программа – это контейнер для подпрограмм, методов, процедур и функций.
Программы, имена которых начинаются с %(процента), считаются библиотечными программами.Строение программной строки[метка] [код команды] [комментарий]В программах в основном используются процедурные блоки, которые заключены вфигурные скобки и поэтому могут располагаться на нескольких строках, а также командные конструкции условного выполнения программы, в которых исполняемый программный код также заключен в фигурные скобки.3.3.3.
Общая структура подпрограммыПодпрограмма это именованный блок кода внутри программы, состоит из входнойметки, отдельных программных строк, содержащих коды, и заключительной командыQuit. Она может содержать параметры и никогда не возвращает значение. Синтаксис подпрограммы:Label ([param [= default]])// комментарий// кодQuit// заметьте, что Quit не имеет параметровГде, Label – имя подпрограммы, param – это параметры подпрограммы, default – значения по умолчанию.Вызов из этой же программы возможен с параметрами, при этом можно задать значения по умолчанию.Do Label[(param)]Cинтаксис вызова подпрограммы из другой программы:Do Label^Routine[(param)]28Где Routine – программа, которая находится в файле Routine.Mac, Label – подпрограммапрограммы Routine, param – список параметров.Пример 1.
Программа, находящаяся в файле routine.Mac имеет вид:set x=1,y=2do minim(x,y) // вызов из этой же программыwrite !,"x=",x," y=",yquitminim(a=0,b=0) // подпрограммаif (a>b){ set mn=b }else{ set mn=a}write !,"min=",mnquitВызов подпрограммы minim из этой же программы:do minim(x,y)Вызов подпрограммы minim из внешней программы:do minim^routine(9,2)Возможен вызов без параметров, в этом случае используются значения параметровпо умолчанию:do minim^routine()Если циркумфлекс(^) при вызове отсутствует, например Do minim(x,y), это означает,что метку следует искать в текущей программе.Можно также использовать синтаксис вызова: метка + смещение, и таким образомвойти в N-ую строку программы. Пример: Do minim+3^routine – вход в программу черезвторую строку кода. Такую возможность можно использовать при тестировании.3.3.4. Встроенные функцииВ Caché имеется набор предопределенных (встроенных) функций, которые можноиспользовать для различных целей.
Встроенные функции могут использоваться в любыхвыражениях. Вызов функции заменяется ее значением, вычисляемым в зависимости отаргументов. Функции в Caché являются рекурсивными, т.е. могут содержать в виде аргументов самих себя. Имена встроенных функций начинаются со знака $. Вызов имеет следующий синтаксис:$Function(Arg1, Arg2, …).Имена функций пишутся строчными или прописными буквами.
В табл.3 приведенсписок наиболее часто используемых встроенных функций.Таблица 3Классификация встроенных функцийКласс функцийТипичные представителиОбщие функции$Ascii, $CASE, $Char, $Random, $Select, $Stack,$Text, $ViewОперации с переменны$Data, $Get, $Order, $Name, $Query, $QSubscript,ми и базой данных$QLengthОбработка строк$Extract, $Find, $Length, $Piece, $Reverse, $TranslateФорматирование чисел$FNumber, $Justify, $Inumber, $NUMBERОбработка списков$List, $ListBuild, $ListData, $ListFind, $ListGet,29Обработка транзакцийМатематические функцииДата, времяОбщие функции$ListLength$Increment$ZABS, $ZEXP, $ZLN, $ZSIN$ZDate, $ZDateTime, $ZDateH, ZTime, ZtimeH$ZWAscii, $ZWChar, $ZF,$ZHex, $ZLAscii, $ZLChar,$ZSEArch, $ZSEEKСтроковые функции$ZCONVert, $ZCyc, $ZSTRIPОбработка битовых строк$ZBitAND, $ZbitCount, $ZbooleanБолее подробная информация о встроенных функциях содержится в документациипо Caché.3.3.5.
Пользовательские функцииНаряду со встроенными функциями, пользователю предоставляется возможность писать свои функции. По способу построения и использования в выражениях функция оченьпохожа на подпрограмму, отличие заключается в том, что функция может возвращать значение. Если код функции заключить в фигурные скобки, то функция будет трактоватьсякак процедура. Синтаксис:ИмяФункции (СписокПараметров)<код>Quit <выражение>Функция может использоваться в выражениях т.к.
возвращает значение.Вызов функции из этой же программы:Set <Переменная>=$$<ИмяФункции>(Список Параметров)Do <ИмяФункции>(СписокПараметров)Вызов функции с помощью Do ничем не отличается от вызова подпрограммы.Внешний вызов из другой программы выглядит следующим образом.Функцию можно вызвать оператором Do, если не требуется возвращаемое функциейзначение, в этом случае вызов ничем не отчается от вызова подпрограммы:Do <Имя Функции>^<Имя Программы>(СписокПерем)Если требуется возвращаемое значение:Set <Перем>=$$<Функция>^<Программа>(СписокПерем)Пример 1. Функция, которая возвращает случайное число в некотором диапазоне вфайле FRnd.Mac:set a=200,b=100set r=$$Rnd(a,b) // вызов из той же программыwrite !,"r=",rQuitRnd(m,n) // функцияQuit $Random(m-n)+1+mВызов функции из другой программы:set r=$$Rnd^FRnd(200,100)Пример 2.
Программа func1.Mac содержит функцию minim:set x=6,y=2set mn=$$minim(x,y) // вызов из этой же программыwrite !,"x=",x," y=",y,”min=”,mn30quitminim(a,b) // функцияwrite "minim"if (a>b){ quit b }else{ quit a}quitВызов функции из внешней программы:Set m=$$minim^func1(9,2)3.3.6. ПроцедурыПроцедура именует набор операторов языка ObjectScript, для того, чтобы этот наборможно было вызвать из любого места программы, возможно несколько раз, возможно сразными параметрами.
Этот набор операторов заключается в фигурные скобки {}. Формаописания:<имя>(СписокФормальныхПараметров)[<СписокОбщедоступныхПараметров>]<Доступ>{ <тело процедуры>[Quit <значение>]}СписокФормальныхПараметров – локальные параметры процедуры, доступны только внутри процедуры, в вызываемых ею процедурах не видны.СписокОбщедоступныхПараметров – необязателен. Общедоступные параметрыдоступны во всех процедурах, которые данная процедура вызывает и в тех, которые вызывают данную процедуру.
Для определения public-переменных их список помещается вквадратных скобках за именем процедуры и списком ее локальных параметров.Доступ – задает доступность процедуры: private или public. Private (по умолчанию) –означает, что процедура доступна только внутри данной программы, public – процедурадоступна для внешних программ.Задание параметра:(<имя параметра>)[=<Значение по умолчанию>]Вызов процедуры из этой же программы:Do Proc(<список параметров>)Вызов процедуры из внешних программ:Do Proc^Routine(<список параметров>)// не возвращает значениеГде Proc – имя процедуры, Routine – имя программы.Пример 1: Файл proc2.Mac содержит следующий код:set c=1,d=3do MyProc(1,2)// внутренний вызов процедурыquitMyProc(X,Y)[A,B] Public{ write "X+Y=", X+Y, !set A=1,B=4write "A+B=", A+B, !}Вызов процедуры из той же программы:31Do MyProc(1,2)Вызов процедуры из другой программы:Do MyProc^proc2(1,2)Пример 2.
Программа proc2.Mac, содержит вызов процедуры MyProc. ПроцедураMyProc в свою очередь вызывает процедуру abc, которой передаются локальные параметры x, y и глобальные параметры a, b:set c=1,d=3do MyProc(1,2)// процедура MyProcMyProc(X,Y)[A,B] Public{ write "X+Y=", X+Y, !set A=1,B=4do abc(X,Y) // вызов процедуры abc из MyProcwrite "A=", A, " B= ", B, !}// Процедура abc, вызываемая из MyProcabc(n,m)[A,B]{ set n=9,m=5write "a=",A,"b=",B}3.3.7. Область действия локальных переменныхВсе однажды созданные переменные программ, подпрограмм и функций видны повсюду, даже после завершения программы, и доступ к ним ограничивается программистом, если он к этому стремится.В примере 1 п.3.3.3. переменные x и y, созданные в программе routine.Mac, сохраняются также в подпрограмме minim, более того, они сохраняются после выполнения программы.
Это может быть нежелательно. Часто необходимо ограничить доступ к некоторым переменным до уровня конкретных подпрограмм или процедур.В Caché имеется ряд возможностей для «очистки» локальных переменных:1. С помощью команды Kill в конце программы, но перед заключительной командой Quit для удаления переменных после выхода из программы.2. Использование команды New для задания списка локальных переменных дляпрограммы или подпрограммы, которые из нее вызываются.3.
Передача параметров по значению.4. Определение public и private переменных в процедурах, рассматривая их какинкапсулированные блоки в подпрограмме.3.3.8. Команда NewКоманда New задает список переменных, локальных для данной программы и всехвызываемых из нее подпрограмм. При выходе из программы такие переменные неявноудаляются. Синтаксис:New [( Список переменных)]New – без аргументов изолирует все переменные, ее следует применять осторожно.Пример:New a,b // изолирует две переменные a и bПример:P1// первая строка программы32New aSet a=1 Do P2WriteQuitP2// первая строка подпрограммыNew x, ySet x=a, y=3QuitВ этом примере переменная a существует в P1 и P2, т.к.