к оглавлению

Выражения Clarion

Обзор

Выражение - это математическая, строковая или логическая формула, по которой вычисляется значение. Выражение может стоять справа от знака равенства в операторах присваивания, быть параметром процедуры, индексом массива переменных (размерная переменная) или условием в структурах IF, САSЕ, LООР или ЕXЕСUТЕ. Выражения состоят из констант, переменных и процедур которые возвращают значение, связанных символами логических и/или арифметических или строковых операций.

 

Вычисление выражений

Выражения вычисляются в стандартном алгебраическом порядке операций. Старшинство операций определяется типом операции и скобками. Каждая операция вырабатывает промежуточное (внутреннее) значение, которое затем используется в последующих операциях. Скобки используются для того, чтобы группировать операции в выражении. Выражение вычисляется, начиная с подвыражения в самых вложенных скобках, последовательно к самому внешнему уровню.

Уровни старшинства операций в выражениях от наивысшего к наинизшему и слева направо в каждом уровне:

Уровень 1 () Группировка скобками

Уровень 2 - Унарный минус

Уровень 3 обращение к процедуре Получение возвращаемого значения

Уровень 4 ^ Возведение в степень

Уровень 5 * / % Умножение, деление, деление по модулю

Уровень 6 + - Сложение, вычитание

Уровень 7 & Конкатенация (объединение)

Уровень 8 = <> Логическое сравнение

Уровень 9 AND, NOT, OR Булевы выражения

Результатом выражения может быть числовое, строковое или логическое (истина/ложь) значение. Выражение может вообще не содержать операций, это может быть просто переменная, константа или обращение к процедуре, которая возвращает значение.

 

Операторы

Арифметические операции

Символ арифметической операции объединяет два операнда в арифметическое выражение для вычисления результата. Знаки операций:

+ сложение (A + B означает A плюс B).

- вычитание (A - B означает A минус B)

* умножение (A * B означает A умножить на B)

/ деление (A / B означает A разделить на B)

^ возведение в степень (A ^ B означает A возвести в степень B)

% остаток от деления (А % В означает остаток от деления А на В)

Замечание:

Знак результата Деления Модуля может управляться определением compatible_modulus #PRAGMA. Смотри: SoftVelocity #PRAGMAS.

Существует также “сокращенный” арифметический оператор назначений, который упрощает ваш код. Для подробной информации смотри: Вычисляющие операторы присваивания

 

Операция конкатенации

Операция конкатенации (&) используется для того, чтобы присоединить одну строку или строковую переменную к другой. Длина результата равна сумме длин соединяемых строк. Могут соединяться и числовые константы или переменные со строкой или с другой числовой константой или переменной. Для того, чтобы удалить ненужные пробелы в конце соединяемых строк, используется процедура CLIP.

Пример:

CLIP(FirstName) & ' ' & Initial & '. ' & LastName ! Составить полное имя

'SoftVelocity Corporation' & ', Inc.' ! Соединить две константы

Смотри также: CLIP, Числовые выражения, Правила преобразования данных, FORMAT

 

Логические операции

Логическая операция проверяет два операнда или выражения и вырабатывает условие “истина” или “ложь”. Существует два вида логических операций: условные и булевы. В условных операциях сравниваются два значения или выражения. Символы булевых операций соединяют строковые, числовые или логические выражения, реализуя булеву алгебру. Символы булевых операций могут комбинироваться, образуя составные операции.

Условные операции = равно

< меньше

> больше

Булевы операции NOT булево (логическое) отрицание (НЕ)

~ логическое НЕ

AND конъюнкция (булево И)

OR дизъюнкция (булево ИЛИ)

XOR исключающее ИЛИ

Комбинированные операции <> не равно

~= не равно

NOT = не равно

<= меньше или равно

=< меньше или равно

~> не больше

NOT > не больше

>= больше или равно

=> больше или равно

~< не меньше

NOT < не меньше

Во время логических вычислений любая ненулевая величина и непустая строка означает условие “истина”, а пустая строка или нулевая величина - условие “ложь”.ГЛАВА 4

Пример:

Логическое выражение Результат

A = B Истина, если A = B

A < B Истина, если A меньше B

A > B Истина, если A больше B

A <> B, A ~= B, A NOT= B Истина, если A не равно B

A ~< B, A >= B, A NOT< B Истина, если A не меньше B

A ~> B, A <= B, A NOT> B Истина, если A не больше B

~A, NOT A Истина, если A нуль или пустая строка

A AND B Истина, если A истинно и B истинно

A OR B Истина, если или A истинно, или B истинно, либо оба истинны

A XOR B Истина, если или A истинно, или B истинно, но не оба одновременно

 

Константы

Числовые константы

Числовые константы представляют собой постоянные числовые значения. Константы могут встречаться в объявлении данных, выражениях, в качестве параметров процедур или атрибутов. Числовая константа может представляться в десятичном (по основанию 10 - по умолчанию), двоичном (по основанию 2), восьмеричном (по основанию 8), шестнадцатеричном (по основанию 16) и экспоненциальном форматах. В числовых константах недопустимы символы форматирования, такие как знак доллара или запятая; лидирующие знаки "плюс" или "минус" допустимы.

Десятичные (по основанию 10) числовые константы могут иметь впереди минус (как признак отрицательного числа), целую часть и необязательные десятичную точку с дробной частью числа. Двоичные (по основанию 2) числовые константы могут содержать необязательный знак минус спереди, символы цифр 0 и 1 и символ B или b (латинские) в конце. Восьмеричные числовые константы (по основанию 8) могут содержать необязательный знак минус спереди, символы цифр от 0 до 7 и символ O или o (латинские) в конце. Шестнадцатеричные (по основанию 16) числовые константы могут содержать необязательный знак минус спереди, символы цифр от 0 до 9, латинские буквы от A до F (представляющие циффры от 10 до 15) и символ H или h (латинские) в конце. Если первой значащей цифрой (самым левым символом) в шестнадцатеричной константе является цифра от A до F, то перед ней надо поставить незначащий ноль.

Пример:

-924 ! Десятичные константы

76.346

+76.346

1011b ! Двоичные константы

-1000110B

3403o ! Восьмеричные константы

-7041312O

-1FFBh ! Шестнадцатеричные константы

0CD1F74FH

 

Строковые константы

Строковые константы представляют собой строку символов, заключенную в одинарные кавычки (апострофы). Максимальная длина строковой константы равна 255-ти символам. Символы, которые нельзя ввести с клавиатуры, можно вставить в строку, заключая в угловые скобки (< >) их коды ASCII. Коды ASCII могут представляться десятичными или шестнадцатеричными числовыми константами.

Появление в строковой константе левой угловой скобки (<) подразумевает наличие соответствующей правой скобки. Поэтому для того, чтобы включить в строку символ угловой скобки, его необходимо ввести подряд дважды. Аналогично нужно ввести два апострофа подряд, чтобы в строку был включен апостроф. Константа, состоящая всего из двух апострофов (или с пробелами между ними) представляет пустую строку). Последовательное повторение одного и того же символа в строке может указываться коэффициентом повторения. Коэффициент повторения указывается в фигурных скобках { } следом за символом, который должен повторяться. Для того, чтобы включить левую фигурную скобку ({) в качестве части строковой константы, требуется ввести две левые фигурные скобки подряд ({{).

Амперсанд (&) всегда имеет значение в символьных константах. Однако, в зависимости от места, он может интерпретироваться как подчеркивание для горячей клавиши (например для объекта PROMPT) .В таком случае вы должны выделить начало и конец действия амперсанда набором двойного амперсанда (&&).

Пример:

'string constant' ! Строковая константа

'It''s a girl!' ! Вложенный апостроф

'<27,15>' ! Десятичные коды ASCII

'A << B' ! Добавление левой угловой скобки, A < B

'*{20}' ! Двадцать звездочек, запись с коэффициентом повторения

'' ! Пустая строка

 

Типы выражений

Числовые выражения

Числовые выражения могут использоваться в качестве параметров процедур, как условие в структурах IF, САSЕ, LООР или ЕXЕСUТЕ, а также в правой части операторов присваивания, в которых слева стоит числовая переменная. Числовые выражения могут содержать операцию конкатенации, но в них не должно быть никаких логических операций. Использованные в числовом выражении строковые константы и переменные преобразуются в промежуточное числовое значение. Если в выражении используется операция конкатенации, то она выполняется над строковыми промежуточными значениями, а результат преобразуется в число.

Пример:

Count + 1 ! Добавить 1 к переменной Count

(1 - N * N) / R ! Вычесть из 1 произведение N на N затем разделить на R

305 & 7854555 ! Соединить код региона с номером телефона

Смотри также: Правила преобразования данных

 

Строковые выражения

Строковые выражения могут использоваться в качестве параметров процедур или атрибутов, либо в правой части операторов присваивания, если в левой части стоит строковая переменная. Строковым выражением может быть отдельная строка или числовая переменная, или сложное сочетание подвыражений, процедур и операций.

Пример:

StringVar STRING(30)

Name STRING(10)

Weight STRING(3)

Phone LONG

CODE

! Конкатенация константы и переменной

StringVar = 'Address:' & Cus:Address

! Конкатенация констант и значения, возвращаемого функцией FORMAT

StringVar = 'Phone:' & ' 305-' & FORMAT(Phone,@P###-####P)

! Конкатенация константы и переменной

StringVar = Weight & 'lbs.'

Смотри также: CLIP, Конкатенация, Правила преобразования данных, FORMAT

 

Логические выражения

В логических выражениях в управляющих структурах IF, LОOP UNTIL и LОOP WHILE происходит оценка логических условий “истина/ложь”. На основе окончательного результата выражения (истина или ложь) определяется дальнейшая последовательность выполнения программы. Логические выражения оцениваются слева направо. Правый операнд в операциях AND, OR или XOR оценивается только в том случае, когда он может повлиять на результат. Для того, чтобы избежать неоднозначности и управлять последовательностью оценки операндов, следует использовать скобки. Уровни старшинства логических операций:

Уровень 1 условные операции

Уровень 2 ~, NOT

Уровень 3 AND

Уровень 4 OR, XOR

Пример:

LOOP UNTIL KEYBOARD() ! Истинно, когда пользователь нажимает клавишу

! операторы

END

IF A = B THEN RETURN. ! Выйти, если A = B.

LOOP WHILE ~ Done# ! Цикл пока “ложь” (DONE# = 0)

! операторы

END

IF A >= B OR (C > B AND E = D) THEN RETURN.

!Истина если a >= b, также истина если

c > b и e = d.

!Вторая часть выражения

!(после OR) вычисляется только если

!первая часть не истина.

 

Выражения свойств

[цель] [$] [объект] { свойство [,элемент] }

цель Метка структуры APPLICATION, WINDOW, REPORT, VIEW или FILE, метка BLOB, одна из встроенных переменных: TARGET, PRINTER или SYSTEM. Если опущено, принимается TARGET.

$ Обязательный разделитель, когда указаны и цель и объект. Опускается, если или цель или объект опущен.

объект Номер поля или метка соответствия поля на которую воздействует структура цели (APPLICATION, WINDOW или REPORT). Если объект опущен, должен быть указан параметр цель. Объект должен быть опущен, если в качестве цели указан FILE, BLOB или встроенные переменные PRINTER или SYSTEM.

свойство Численная константа, метка соответствия или переменная, которая указывает какое свойство (атрибут) изменяется. Это может быть строка указывающая на свойство OCX или OLE контейнера.

элемент Числовая константа или переменная указывающая, какой элемент изменяется (для свойств в массиве).

Синтаксис выражения свойств позволяет получить доступ ко всем атрибутам (свойствам) структур APPLICATION, WINDOW или REPORT, или к любому объекту внутри этих структур. Чтобы указать атрибут структуры APPLICATION, WINDOW, REPORT, VIEW или FILE ( а не их компонента), опустите параметр объект в выражении свойства. Чтобы указать объект в текущем окне, опустите параметр цель в выражении свойства.

Структуры данных REPORT по умолчанию никогда не выступают в качестве цели. Поэтому, чтобы изменить какое-либо свойство в этой структуре надо: либо использовать SETTARGET указывая в качестве цели REPORT, либо явно указывать метку структуры REPORT как цель перед изменением любого свойства структуры или объекта, который он содержит.

Выражения свойств могут применяться в операторах языка Clarion в любом месте, где это допустимо, или как источник или назначение в простых операторах присваивания. Они не могут использоваться в таких операциях присваивания как +=, *= и т.д. Присвоение нового значения свойству происходит путем использования простого оператора присваивания, когда свойство выступает в качестве назначения, а новое значение в качестве источника. Определение текущего значения свойства происходит путем простого присваивания, когда свойство выступает в качестве источника, а получаемое значение в качестве назначения. Выражение свойства может также использоваться как исполняемый оператор (без операции присваивания) когда выражение свойства является методом вызова для объектов OLE или OCX.

В процессе исполнения все свойства трактуются как символьные данные; компилятор автоматически выполняет любые возможные конвертации типов данных. Любое свойство без параметров является двоичным (переключаемым). Двоичные свойства либо “присутствуют” либо “опущены” и возвращают ‘1’, если присутствуют и ‘’ (null), если опущены. Изменение двоичного свойства в ‘’ (null), ‘0’ или любую нечисловую строку считается “опущенным”. Изменение в любое другое значение, считается “присутствующим”.

Большинство свойств могут быть как проверяемыми (читаемыми) либо изменяемыми (записываемыми). Однако некоторые свойства могут быть “только для чтения” и не могут быть изменены. Присвоение такому свойству значения никак на него не повлияет. Другие свойства являются “только для записи” и при прочтении не имеют смысла. Некоторые свойства являются массивами и включают в себя множественные значения. Для адресации к соответвующим элементам массива свойства в синтаксисе используются запятые (а не угловые скобки) в качестве разделителей между свойствами и номерами элементов.

Встроенные переменные

В библиотеке исполняемой системы Clarion for Windows есть три встроенные переменные: TARGET, PRINTER и SYSTEM. Они используются в синтаксических конструкциях присвоения значений свойствам только для идентификации свойства, которому присваивается значение.

TARGET обычно указывает окно, которое в данный момент имеет фокус ввода. К тому же, оно может указывать на окно в другом исполняемом процессе или на печатаемый в данный момент документ, позволяя изменять значения свойств объектов окна в другом исполняемом процессе, или динамически изменять объекты документа при печати. Для изменения значения переменной TARGET используется процедура SETTARGET и SYSTEM {PROP:Target}.

PRINTER ссылается только на свойства относящиеся к принтеру, используемые следующим открываемым документом (и всеми последующими отчетами).

SYSTEM представляет собой встроенную переменную, которая указывает глобальные свойства, используемые всем приложением вцелом. Существует несколько особых необявляемых свойств, которые использует переменную SYSTEM для установки или опроса глобальных относительно приложения свойств.

Пример:

MainWin APPLICATION('My Application'),SYSTEM,MAX,ICON('MyIcon.ICO'),STATUS,RESIZE

MENUBAR

MENU('File'),USE(?FileMenu)

ITEM('Open...'),USE(?OpenFile)

ITEM('Close'),USE(?CloseFile),DISABLE

ITEM('E&xit'),USE(?MainExit)

END

MENU('Help'),USE(?HelpMenu)

ITEM('Contents'),USE(?HelpContents),STD(STD:HelpIndex)

ITEM('Search for Help On...'),USE(?HelpSearch),STD(STD:HelpSearch)

ITEM('How to Use Help'),USE(?HelpOnHelp),STD(STD:HelpOnHelp)

ITEM('About MyApp...'),USE(?HelpAbout)

END

END

TOOLBAR

BUTTON('Open'),USE(?OpenButton),ICON(ICON:Open)

END

END

CODE

OPEN(MainWin)

MainWin{PROP:Text} = 'A New Title' !Изменить заголовок окна

?OpenButton{PROP:ICON} = ICON:Asterisk !Изменить иконку кнопки

?OpenButton{PROP:AT,1} = 5 !Изменить абсциссу кнопки

?OpenButton{PROP:AT,2} = 5 !Изменить ординату кнопки

IF MainWin$?HelpContents{PROP:STD} <> STD:HelpIndex

MainWin$?HelpContents{PROP:STD} = STD:HelpIndex

END

MainWin{PROP:MAXIMIZE} = 1 !Расширить в полный экран

ACCEPT

CASE ACCEPTED() !какой объект выбран?

OF ?OpenFile !Открыть... выбор меню

OROF ?OpenButton !Кнопка открытия на панеле инструментов

START(OpenFileProc) !Начать новый исполняемый процесс

OF ?MainExit !Выход из меню выбора

OROF ?MainExitButton !Кнопка выхода на панеле инструментов

BREAK !Прервать цикл ACCEPT

OF ?HelpAbout !О программе... выбор меню

HelpAboutProc !Вызвать процедуру информации о приложении

END

END

CLOSE(MainWin) !Закрыть приложение

RETURN

Смотри также: SETTARGET, Динамические свойства

 

Вычисление динамических выражений

В Clarion есть возможность вычисления выражений на языке Clarion, динамически создаваемых во время выполнения. То есть в Clarion-программе возможно создание выражений “на ходу”. Также возможно позволить пользователю ввести выражение для вычисления.

Выражение представляет собой математическую или логическую формулу, в результате вычисления которой получается значение. Оно не является законченным оператором языка Clarion. Выражение может содержать только константы, переменные или обращения к процедурам, которые возвращают значение, соединенные символами логических и/или арифметических операций. Выражение может использоваться в правой части оператора присваивания, в качестве параметра процедуры, в качестве индекса массива ( размерные переменные) или в качестве условий в структурах IF, CASE, LOOP или EXECUTE.

В качестве компонент строки динамического выражения можно использовать любые переменные Clarion-программы и большинство встроенных функций. Кроме того, в строке динамического выражения можно использовать написанные пользователем функции, которые отвечают конкретным определенным правилам, описанным в разделе, посвященном оператору BIND.

Во время выполнения программы в строке динамического выражения можно использовать все стандартные синтаксические правила конструирования выражений. Включая ггруппировку скобками и все арифметические и логические операции и операции над строками. Динамические выражения вычисляются точно так же как любые другие выражения в языке Clarion и к ним применимы все стандартные правила старшинства операций, описанные в разделе Вычисление выражений (см. стр. 3).

Создание строки динамического выражения предполагает три этапа:

Как только выражение вычислено, его результат используется как если бы он был получен любым написанным вручную в программе выражением. Например, строка динамического выражения могла бы представлять фильтрующее выражение для исключения отдельных записей при просмотре или печати базы данных (выражение FILTER структуры VIEW подразумевает строку динамического выражения).

Смотри также: BIND, EVALUATE, POPBIND, PUSHBIND, UNBIND

 

BIND (объявить переменную для динамического выражения)

BIND( | имя,переменная | )

| имя,процедура |

| группа |

BIND Идентифицирует переменные, которые могут использоваться в динамических выражениях.

имя Строковая константа, содержащая идентификатор, используемый в динамическом выражении. Может совпадать с меткой переменной или процедуры.

переменная Метка любой переменной (включая поля в структурах FILE, GROUP и QUEUE) или передаваемого параметра. Если это массив, то только одномерный.

процедура Метка оператора PROCEDURE языка Clarion, которая возвращает значение типа STRING, REAL или LONG. Если процедуре передается параметры, то они должны быть строковыми параметрами-значениями (передаваемыми значением, а не адресом) и не могут быть опущены.

группа Метка структуры GROUP, RECORD или QUEUE, объявленной с атрибутом BINDABLE.

Оператор BIND объявляет логическое имя, используемое для идентификации в строке динамического выражения переменной или написанной пользователем процедуры. До того, как переменную или пользовательскую процедуру можно было использовать в строке динамического выражения в процедуре EVALUATE или в атрибуте FILTER структуры VIEW, ее нужно идентифицировать с помощью оператора BIND.

BIND (имя,переменная)

Указанное имя используется в выражении в качестве метки переменной.

BIND(имя,процедура)

Указанное имя используется в выражении в качестве метки процедуры.

BIND(группа)

Объявляет, что все переменные в данной структуре GROUP, RECORD или QUEUE (с атрибутом BINDABLE) можно использовать в динамическом выражении. В качестве логического имени в динамическом выражении используется значение атрибута NAME. Если атрибут NAME отсутствует, то используется имя переменной с префиксом.

Для структур GROUP, RECORD или QUEUE, объявленных с атрибутом BINDABLE, в исполняемом модуле для имен всех элементов данных этих структур дополнительно выделяется память. Таким образом программа становится больше и использует больше памяти чем обычно. Кроме того, большое число переменных, которые можно использовать в динамических выражениях, замедляет работу процедуры EVALUATE. Поэтому форму BIND(группа) следует использовать, только если большая часть переменных, составляющих структуру, используется в динамических выражениях.

Пример:

PROGRAM

MAP

AllCapsFunc(STRING),STRING ! Процедура на языке Clarion

END

Header FILE,DRIVER('Clarion'),PRE(Hea),BINDABLE ! Объявление структуры файла

OrderKey KEY(Hea:OrderNumber)

Record RECORD

OrderNumber LONG

ShipToName STRING(20)

END

END

StringVar STRING(20)

CODE

BIND('ShipName',Hea:ShipToName)

BIND('SomeFunc',AllCapsFunc)

BIND('StringVar',StringVar)

StringVar = 'SMITH'

CASE EVALUATE('StringVar = SomeFunc(ShipName)')

OF ''

IF ERRORCODE()

MESSAGE('Error ' & ERRORCODE() & ' -- ' & ERROR())

ELSE

MESSAGE('Unkown error evaluating expression')

END

OF '0'

DO NonSmithProcess

OF '1'

DO SmithProcess

END

AllCapsFunc PROCEDURE(PassedString)

CODE

RETURN(UPPER(PassedString))

Смотри также: UNBIND, BINDEXPRESSION, EVALUATE, PUSHBIND, POPBIND, FILTER

 

BINDEXPRESSION(объявляет динамическое выражение)

BINDEXPRESSION(| имя,выражение | )

BINDEXPRESSION Указывает переменную используемую в динамическом выражении.

имя Строковая константа включающая идентификатор, используемый в динамическом выражении.

выражение Математическая формула, включающая допустимую комбинацию переменных, функций операторов и констант.

Оператор BINDEXPRESSION объявляет логическое имя идентификатора, используемого для идентификации динамически используемого строкового выражения.

Оператор EVALUATE должен выполнить грамматический разбор выражения каждый раз, когда вызывается. Если какое-то выражение вычисляется часто, то это вызовет задержку во времени. Если некоторые выражение оценивается часто, это может затрачивать много времени.

BINDEXPRESSION выполняет грамматический разбор выражение только однажды и результат будет сохранен под именем ранее вычисленного выражения. Позже, это выражение может быть использовано в EVALUATE как одиночное, или как часть другого выражения в EVALUATE, или в другом BINDEXPRESSION.

Пример:

BIND('Var', Var)

BINDEXPRESSION('Power2', 'Var * Var')

...

Var = 10

P2 = EVALUATE ('Power2')

...

BINDEXPRESSION ('Circle', '3.14159 * Power2')

BINDEXPRESSION('color:red',color:red)

MESSAGE('color:red = ' & color:red & '|Eval(color:red)=' &|

evaluate('color:red') ) !показывает тот же номер дважды

BINDEXPRESSION('Match:Soundex',Match:Soundex)

FILTER('MATCH(Cus:Name,NameWanted,Match:Soundex)')

Смотри также: BIND, EVALUATE

 

EVALUATE (получить результат динамичекого выражения)

EVALUATE(выражение)

EVALUATE Вычислить динамическое выражение.

выражение Строковая константа или переменная содержащая выражение для вычисления.

Процедура EVALUATE возвращает результат вычисления динамического выражения в виде значения типа STRING. Если выражение синтаксически не верно с точки зрения языка Clarion, то возвращается пустая строка, а процедура ERRORCODE возвращает код ошибки. Логическое выражение возвращает строку, содержащую или ноль ('0') или один ('1'), тогда как арифметическое выражение возвращает фактический результат выражения (в строке). Большое число переменных, связанных с логическими именами для использования в динамических выражениях, замедляет работу процедуры EVALUATE. Поэтому форму BIND(группа) следует использовать, только если большая часть переменных, составляющих структуру, действительно используется в динамических выражениях. А все неиспользуемые в данный момент в динамических выражениях переменные и пользовательские функции следует освободить оператором UNBIND. Теперь во время работы программы и в шаблонах в выражениях, вычисляемых оператором EVALUATE могут быть использованы операторы PATH(), SHORTPATH() и LONGPATH().

Синтаксис уточнения имени полей (точечный синтаксис) не может использоваться в выражениях. Переменные не могут связываться оператором BIND используя стандартные правила префиксов.

Возвращаемый тип данных: STRING

Сообщения об ошибках:

1010 – Неверное выражение

1011 – Переменная не найдена

1012 – Несовпадение

1015 – Некоторые параметры встроенных функций, используемых в выражении, опущены

Смотри также: POPBIND

Пример:

MAP

AllCapsFunc PROCEDURE(STRING),STRING ! Процедура на языке Clarion

END

Header FILE,DRIVER('Clarion'),PRE(Hea),BINDABLE !Объявление структуры файла

OrderKey KEY(Hea:OrderNumber)

Record RECORD

OrderNumber LONG

ShipToName STRING(20)

END

END

StringVar STRING(20)

CODE

BIND('ShipName',Hea:ShipToName)

BIND('SomeFunc',AllCapsFunc)

BIND('StringVar',StringVar)

StringVar = 'SMITH'

CASE EVALUATE('StringVar = SomeFunc(ShipName)')

OF ''

IF ERRORCODE()

MESSAGE('Error ' & ERRORCODE() & ' -- ' & ERROR())

END

OF '0'

DO NonSmithProcess

OF '1'

DO SmithProcess

END

AllCapsFunc PROCEDURE(PassedString)

CODE

RETURN(UPPER(PassedString))

Смотри также: BIND, UNBIND, PUSHBIND, POPBIND, FILTER

 

POPBIND (восстановить пространство имен динамических выражений)

POPBIND

Оператор POPBIND восстанавливает пространство имен предыдущего оператора BIND для ранее использованных в динамических выражениях процедур и переменных. Таким образом восстанавливаются рамки предыдущих операторов BIND.

Пример:

SomeProc PROCEDURE

OrderNumber LONG

Item LONG

Quantity SHORT

CODE

BIND('OrderNumber',OrderNumber)

BIND('Item',Item)

BIND('Quantity',Quantity)

AnotherProc ! Обратиться к другой процедуре

UNBIND('OrderNumber',OrderNumber)

UNBIND('Item',Item)

UNBIND('Quantity',Quantity)

AnotherProc PROCEDURE

OrderNumber LONG

Item LONG

Quantity SHORT

CODE

PUSHBIND ! Создать новое пространство имен для BIND

BIND('OrderNumber',OrderNumber) ! Указать перем-е с теми же именами в новом пространстве

BIND('Item',Item)

BIND('Quantity',Quantity)

!Do some Processing

UNBIND('OrderNumber')

UNBIND('Item')

UNBIND('Quantity')

POPBIND ! Восстановить старое пространство имен для BIND

Смотри также: PUSHBIND, EVALUATE

 

PUSHBIND (очистить пространство имен динамических выражений)

PUSHBIND( [ флаг ] )

PUSHBIND Создает новые границы для подмножества операторов BIND.

флаг Целая константа или переменная, содержащая ноль (0) или единицу (1). Если значение равно 0, пространство имен оператора BIND очищается для всех переменных и процедур, ранее определенных. Если единице - все переменные и процедуры предварительно ограничиваются. Если значение опущено - флаг устанавливается в ноль.

Оператор PUSHBIND создает новые границы для подмножества операторов BIND. Эти границы устанавливаюся с последующим оператором POPBIND. Эти новые BIND-имена для тех же самых переменных (с тем же именем) не конфликтуют с использованием этих имен в предыдущем пространстве имен.

Пример:

SomeProc PROCEDURE

OrderNumber LONG

Item LONG

Quantity SHORT

CODE

BIND('OrderNumber',OrderNumber)

BIND('Item',Item)

BIND('Quantity',Quantity)

AnotherProc ! Обратиться к другой процедуре

UNBIND('OrderNumber',OrderNumber)

UNBIND('Item',Item)

UNBIND('Quantity',Quantity)

AnotherProc PROCEDURE

OrderNumber LONG

Item LONG

Quantity SHORT

CODE

PUSHBIND ! Создать новое пространство имен для BIND

BIND('OrderNumber',OrderNumber) ! Указать Bind-переменные в новой области

BIND('Item',Item)

BIND('Quantity',Quantity)

!Do some Processing

UNBIND('OrderNumber')

UNBIND('Item')

UNBIND('Quantity')

POPBIND ! Восстановить предыдущее пространство имен для BIND

Смотри также: POPBIND, EVALUATE

 

UNBIND (освободить логическое имя)

UNBIND( [имя] )

UNBIND Освобождает переменные от использования в динамических выражениях.

имя Строковая константа, которая указывает идентификатор использованный вычислителем динамических выражений. Если параметр опущен, то все переменные, использовавшиеся в динамических выражениях, освобождаются.

Оператор UNBIND освобождает логические имена, ранее связанные с переменными оператором BIND. Большое число переменных, которые можно использовать в динамических выражениях, замедляет работу процедуры EVALUATE. Поэтому все неиспользуемые в данный момент в динамических выражениях переменные и пользовательские функции следует освободить оператором UNBIND.

Пример:

PROGRAM

MAP

AllCapsFunc(STRING),STRING ! Пользовательская процедура на Clarion

END

Header FILE,DRIVER('Clarion'),PRE(Hea) ! Объявить структуру файла заголовков

AcctKey KEY(Hea:AcctNumber)

OrderKey KEY(Hea:OrderNumber)

Record RECORD

AcctNumber LONG

OrderNumber LONG

ShipToName STRING(20)

ShipToAddr STRING(20)

ShipToCity STRING(20)

ShipToState STRING(20)

ShipToZip STRING(20)

END

END

Detail FILE,DRIVER('Clarion'),PRE(Dtl),BINDABLE ! RECORD, используемая в динамич.выражениях

OrderKey KEY(Dtl:OrderNumber)

Record RECORD

OrderNumber LONG

Item LONG

Quantity SHORT

END

END

CODE

BIND('ShipName',Hea:ShipToName)

BIND(Dtl:Record)

BIND('SomeFunc',AllCapsFunc)

UNBIND('ShipName') ! Освободить переменную

UNBIND('SomeFunc') ! Освободить пользовательскую процедуру на Clarion

UNBIND ! Освободить все переменные

AllCapsFunc PROCEDURE(PassedString)

CODE

RETURN(UPPER(PassedString))

Смотри также: BIND, EVALUATE, PUSHBIND, POPBIND

к оглавлению

Знаете ли Вы, что декомпозиция программы - это создание модулей, которые в свою очередь представляют собой небольшие программы, взаимодействующие друг с другом по хорошо определенным и простым правилам.

НОВОСТИ ФОРУМА

Форум Рыцари теории эфира


Рыцари теории эфира
 10.11.2021 - 12:37: ПЕРСОНАЛИИ - Personalias -> WHO IS WHO - КТО ЕСТЬ КТО - Карим_Хайдаров.
10.11.2021 - 12:36: СОВЕСТЬ - Conscience -> РАСЧЕЛОВЕЧИВАНИЕ ЧЕЛОВЕКА. КОМУ ЭТО НАДО? - Карим_Хайдаров.
10.11.2021 - 12:36: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от д.м.н. Александра Алексеевича Редько - Карим_Хайдаров.
10.11.2021 - 12:35: ЭКОЛОГИЯ - Ecology -> Биологическая безопасность населения - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> Проблема государственного терроризма - Карим_Хайдаров.
10.11.2021 - 12:34: ВОЙНА, ПОЛИТИКА И НАУКА - War, Politics and Science -> ПРАВОСУДИЯ.НЕТ - Карим_Хайдаров.
10.11.2021 - 12:34: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вадима Глогера, США - Карим_Хайдаров.
10.11.2021 - 09:18: НОВЫЕ ТЕХНОЛОГИИ - New Technologies -> Волновая генетика Петра Гаряева, 5G-контроль и управление - Карим_Хайдаров.
10.11.2021 - 09:18: ЭКОЛОГИЯ - Ecology -> ЭКОЛОГИЯ ДЛЯ ВСЕХ - Карим_Хайдаров.
10.11.2021 - 09:16: ЭКОЛОГИЯ - Ecology -> ПРОБЛЕМЫ МЕДИЦИНЫ - Карим_Хайдаров.
10.11.2021 - 09:15: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Екатерины Коваленко - Карим_Хайдаров.
10.11.2021 - 09:13: ВОСПИТАНИЕ, ПРОСВЕЩЕНИЕ, ОБРАЗОВАНИЕ - Upbringing, Inlightening, Education -> Просвещение от Вильгельма Варкентина - Карим_Хайдаров.
Bourabai Research - Технологии XXI века Bourabai Research Institution