stEval (» F:=FieldGet (1)»,». t.»,». t.»)
где stEval – итератор для текущей записи;
«.t. " – блок кода в виде строки;
FieldGet (1) – операция для текущей записи;
asEval (A:=aArray (10), " P1:=x»)
где asEval – итератор массива.
Движок блоков кода
Сами по себе блоки кода – потрясающее достижение в программировании. Продолжение развития этой идеи, блоков кода (тримплетты) и виртуальной машины мы видим и в технологии Java. Блоки кода повсеместно используются в исходном тексте рассматриваемой программы. Это стало стилем программирования и элементом, позволяющим перенести часть исходного кода из компилируемой части программы в базу данных. Блоки кода позволяют строить очень изящные конструкции. Уменьшается объём исходного кода, повышается функциональность и выразительность программного кода.
Блоки кода можно хранить в базе данных в виде строк. С другой стороны, блоки кода можно хранить в массиве в скомпилированном виде, готовом для немедленного использования. Эти и другие свойства блоков кода дают возможность построить очень простой и эффективный движок блоков кода системы IxBase.
Напомним, что представляет собой блок кода. Блок кода – это безымянная функция. Синтаксис этой функции следующий:
{| a1,a2 |.t.}
Хотя функция эта безымянная, ссылку на неё можно присвоить переменной
bC:= {| a1,a2 |.t.}
и выполнить с помощью функции eval ()
Eval (bC)
В эту функцию можно передать параметры, функция с аргументами прмет следующий вид:
Eval (bC, a1,a2)
Список параметров безымянной функции при объявлении располагается между двумя вертикальными линиями:
{|a1,a2|.t.}
Движок блоков кода системы IxBase – это функция DbfRun (cName). В функцию передается имя блока кода, хранящегося в базе данных, который необходимо выполнить. Текст рабочей функции программы IxBase приведен ниже:
*********************************************************
FUNCTION dbfRun (iOrd)
/********************************************************
Синтаксис:
DbfRun (iOrd) —> evalution
Аргументы:
iOrd – имя блока кода, который необходимо выполнить.
Возвращаемое значение:
после выполнения функция возвращает результат выполнения блока кода.
Описание:
Функция системная.
На ее базе сформирован менеджер-интерпретатор блоков кода.
Функция работает с таблицей DBFBLO00.dbf
Если вызываемый вектор не существует в таблице блоков кода, то он будет создан.
Выполнение блоков кода поддерживается стеком, размер которого определен массивом arrDbfRun [].
Откомпилированный блок помещается в массив для повторного использования.
Например:
DBFRUN («ALLUSE00F2») – вызывается на выполнение блок кода с именем «ALLUSE00F2»
Файл: ixBase.prg
Автор: Анатолий Шевелев.
Дата создания: 1993 год.
Дата последнего изменения: 1995 год.
*********************************************************
LOCAL reT:=.t.
LOCAL inT:=aScan (arrDbfRun, {|z| z [1] ==iOrd})
LOCAL ixB
IF inT=0
aDel (arrDbfRun,1)
IF (ixB:=DbfBlo00-> (NaiSpr (iOrd,1,3))) =»»
ixAddVal (ixB, iOrd, SubStr (iOrd,9),ixB:=«*»)
ixB:=» {||.t.}»
ELSEIF ixB=«*»
ixB:=» {||.t.}»
ELSEIF ixB=» {|»
ELSE
ixB:=» {||"+ixB+»}»
ENDIF
arrDbfRun [Int:=Len (arrDbfRun)]:= {iOrd,& (ixB)}
END
BEGIN SEQUENCE
ixO:=iOrd
reT:=eVal (arrDbfRun [inT,2])
RECOVER
eval (& (» {||.t.}»))
errorblock (ErrorBlock ({||.t.}))
END SEQUENCE
RETURN reT
*********************************************************
Таблица для хранения блоков кода
Эта таблица для программы является системной и ключевой. Таблица состоит из трех полей. Первое поле хранит имя фолдера блока кода. Второе – предназначено для спецификаций имени вектора обработки вызова из программы. Третье – содержит сам блок кода.
Конец ознакомительного фрагмента.
Текст предоставлен ООО «ЛитРес».
Прочитайте эту книгу целиком, купив полную легальную версию на ЛитРес.
Безопасно оплатить книгу можно банковской картой Visa, MasterCard, Maestro, со счета мобильного телефона, с платежного терминала, в салоне МТС или Связной, через PayPal, WebMoney, Яндекс.Деньги, QIWI Кошелек, бонусными картами или другим удобным Вам способом.