Для полной гармонии и согласованности с операционной системой и оконным режимом работы программы подключена библиотека CT2. Эта библиотека формирует пользовательский интерфейс с использованием окон.
Используется библиотека SIX для работы с индексами типа *.CDX. Этот индекс хорош тем, что очень быстр и создает только один физический файл на диске. Иногда это очень удобно, например, для проектов, где задействовано большое количество таблиц. Каждая таблица – это два файла. Операционная система имеет ограничение на количество открываемых файлов. Для операционной системы ДОС это значение по умолчанию равно 20, то есть одновременно можно открыть двадцать файлов, или десять таблиц.
Для работы с текстовыми файлами используется библиотека NANFOR. Очень часто приходится экспортировать и импортировать данные в текстовом формате. Самым универсальным в этом смысле является текстовый файл. Для такого рода шлюзования необходим удобный инструмент. Идеально, чтобы он напоминал способ работы системы управления таблицами. Все это предоставляют функции библиотеки NANFOR. К текстовому файлу можно обращаться как к таблице, используя аналогичные функции навигации.
В рамках данного проекта организован специальный посредник работы с итераторами таблиц и массивов. Итераторы – это специальные функции, которые выполняют определённый набор операций для каждой записи таблицы. Итераторы в качестве аргументов требуют блоков кода, например:
dbEval ({|| F:=FieldGet (1)}, {||.t.}, {||.t.})
где dbEval – итератор таблицы;
{||.t.} – блок кода;
FieldGet (1) – операция для текущей записи;
aEval (A:=aArray (10), {| i,x | P1:=x})
где aEval – итератор массива.
Однако в системе управления базами данных CLIPPER версии 5.1 вызов блока кода из блока кода недопустим (этот недостаток ликвидирован в системе xHarbour)
eval (eval ({||.t.}))
поэтому необходим посредник, с помощью которого блок кода можно передать в виде строки, например
stEval (» F:=FieldGet (1)»,». t.»,». t.»)
где stEval – итератор для текущей записи;
«.t. " – блок кода в виде строки;
FieldGet (1) – операция для текущей записи;
asEval (A:=aArray (10), " P1:=x»)
где asEval – итератор массива.
Движок блоков кода
Сами по себе блоки кода – потрясающее достижение в программировании. Продолжение развития этой идеи, блоков кода (тримплетты) и виртуальной машины мы видим и в технологии Java. Блоки кода повсеместно используются в исходном тексте рассматриваемой программы. Это стало стилем программирования и элементом, позволяющим перенести часть исходного кода из компилируемой части программы в базу данных. Блоки кода позволяют строить очень изящные конструкции. Уменьшается объём исходного кода, повышается функциональность и выразительность программного кода.