Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Пт Янв 16, 2015 11:48  '#include |
|
Полезность: Нет оценки
|
Добрый день.
В секции Клиент-скрипта можно использовать такую конструкцию (сравнительно недавно для себя открыл её):
'#include ::[RUNTIME].[LIB_555]
Вопрос: в ЦФТ-шной доке эта фича где-то описана?
Хочется узнать, что в Клиент-скрипте еще возможно использовать:
-макросы подстановки, например, как в pl+ '&'
-исполняемые макросы |
|
 |
wolfio Участник - экстремал
Вступление в Клуб: 22.10.2012
|
Пт Май 08, 2015 10:56   |
|
Полезность: Нет оценки
|
Полагаю, речь об этом:
2. Семантика.
2.1. Реализована поддержка расширенного набора inline-команд условной компиляции
через специальный формат строки-комментария. Команда условной компиляции
идентифицируется знаком '#' в первой позиции текста комментария. Реализован
следующий набор команд:
#DEFINE id {/USUAL SUBSTITUTE PROCESS EXECUTE/} {QUOTE} {text}
определение переменной условной компиляции или макроса (если задан text) с
именем id, при этом текст макроса text может также содержать другие макросы,
в т.ч. и исполняемые. Тип макроса также может быть определен сразу после его
имени (если тип макроса не указан, тогда используется опция USUAL, т.е. простой
макрос), а также может быть указана опция заключения результата макроса в кавычки
(ключевые слова quote, quotes).
#UNDEF id
удаление переменной условной компиляции и макроса с именем id.
#INCLUDE {[} id {]} { /. ::/ {[} id {]} }
импорт макро-определений и переменных условной компиляции другой операции в текущую
операцию. Если указан только один id, то он воспринимается как короткое имя операции
в том же типе, что и импортирующая операция, если заданы оба id, тогда первый
воcпринимается как ID класса, а второй как короткое имя импортируемой операции.
#IFDEF id
включает в результирующий текст для обработки компилятором следующий за оператором
текст вплоть до одной из команд #ELSIF,#ELSE,#ENDIF в случае, если существует макрос
или переменная условной компиляции с именем id.
#IFNDEF id
включает в результирующий текст для обработки компилятором следующий за оператором
текст вплоть до одной из команд #ELSIF,#ELSE,#ENDIF в случае, если не существует
как макрос, так и переменная условной компиляции с именем id.
#IF expression
включает в результирующий текст для обработки компилятором следующий за оператором
текст вплоть до одной из команд #ELSIF,#ELSE,#ENDIF в случае, если значение
логического выражения expression, вычисляемое на этапе компиляции, будет равно
true.
#ELSIF expression
включает в результирующий текст для обработки компилятором следующий за оператором
текст вплоть до одной из команд #ELSIF,#ELSE,#ENDIF в случае, если значение
логического выражения expression, вычисляемое на этапе компиляции, будет равно
true и при этом ни одно из предшествующих условий (#IF,#IFDEF,#IFNDEF,#ELSIF)
не выполнилось.
#ELSE
включает в результирующий текст для обработки компилятором следующий за оператором
текст вплоть до команды #ENDIF в случае, если ни одно из предшествующих условий
(#IF,#IFDEF,#IFNDEF,#ELSIF) не выполнилось.
#ENDIF
Операторы #IF,#IFDEF,#IFNDEF должны обязательно завершаться командой #ENDIF, они могут
содержать несколько #ELSIF блоков и команду #ELSE, которая если задана, то должна
предшествовать только #ENDIF. Т.е. структура операторов условной компиляции #IF,#IFDEF,
#IFNDEF аналогична структуре исполняемого оператора IF в PL/Plus. Операторы могут быть
вложены друг в друга по правилу скобок #IF,#IFDEF,#IFNDEF - #ENDIF.
Логическое выражение expression может содержать (в порядке убывания приоритета конструкций):
- конструкции макроподстановок в стандартном формате (&ID);
- конструкция exists(id) (аналог конструкции defined в C++), которая возвращает
TRUE, если макрос или переменная условной компиляции с именем id определена,
FALSE в противном случае;
- имена (идентификаторы) макросов и переменных условной компиляции, на место которых
в текст выражения вставляется строковая константа с содержимым тела макроса или
логическая константа TRUE, соответственно;
- вызовы стандартных функций (пакета STANDARD, например, LTRIM, RTRIM);
- вызовы функций пакетов ТЯ с указанием префикса пакета (например, LIB.IS_PARENT);
- пользовательских библиотечных функций (с использованием синтаксиса полного разыменования
[class]::[lib_name].func_name);
- любые агрегирующие конструкции логических выражений (операторы OR, AND, IN, LIKE, NOT,
IS NULL, IS NOT NULL, операторы сравнения, арифметические операторы и конкатенацию с последующим
сравнением).
ПРИМЕЧАНИЕ:
1. В отличие от операторов pragma, inline-команды могут использоваться в любом
месте текста PL/Plus независимо от синтаксических структур языка.
2. В отличие от операторов pragma, inline-команды управляют формируемым текстом
операции и выполняются один раз на этапе разбора исходного текста, тогда как
операторы pragma выполняются 2 раза - сначала при семантическом разборе, затем при
формировании результирующего текста (это различие имеет значение при одновременном
использовании однотипных inline-команд и соответствующих прагм).
3. При определении тела макроса (text в #DEFINE) могут использоваться другие макросы,
причем в результирующий текст определяемого макроса вставляются их значения.
4. В телах исполняемых макросов (PROCESS,EXECUTE) конструкции обращения к библиотечным
функциям в полном формате ([class]::[lib_name].func_name) автоматически заменяются
на соответствующие обращения к именам PL/SQL пакетов, содержащих эти функции.
Пример:
pragma macro(ddd,'UTILS.HASH_VALUE([1])',execute);
pragma macro(eee,&ddd(user),substitute,quotes);
pragma macro(xxx,'[1]+[2]',execute);
/*# define fff*/ -- определяем переменную условной компиляции fff
pragma if_def(fff) -- true при первом проходе, т.к. определена предыдущим оператором,
-- false при втором проходе, т.е. последующий текст не будет включен в
-- результирующий
--# define fff usual &xxx(1,3) = rtrim('5''','''')
-- определение макроса с именем fff
s:=
/*# if &fff and exists(xxx) or not [user]::[checker2](stdlib.userid,null,3,4,5)=123 */
'2'
/*#else*/
--#ifndef bbb
'3'
--#elsif not exists(bbb) and not exists(ccc)
'4'
--#elsif not exists(ddd)
'5'
--#else
'6'
--#endif
/*#endif*/
pragma end_if
/*#undef fff*/ -- удаление макроса и переменной условной компиляции с именем fff |
|
 |
Alex294 Участник со стажем
Вступление в Клуб: 02.06.2013
|
Пт Май 08, 2015 11:31  Re: '#include |
|
Полезность: Нет оценки
|
Damir пишет: | Вопрос: в ЦФТ-шной доке эта фича где-то описана?
|
В annex4.chm в разделе "Создание клиент-скрипта" |
|
 |
Damir Участник - экстремал
Вступление в Клуб: 29.03.2013
|
Пн Май 11, 2015 01:32   |
|
Полезность: Нет оценки
|
Ваще мимо! вопрос был про Клиент-скрипт. |
|
 |
|
|
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете голосовать в опросах
|
|