stringtranslate.com

xHarbour

xHarbour — это бесплатный многоплатформенный расширенный компилятор Clipper , предлагающий несколько графических терминалов (GT), включая драйверы консоли, графические интерфейсы и гибридные консоли/GUI. xHarbour обратно совместим с Clipper и поддерживает множество расширений синтаксиса языка, значительно расширенные библиотеки времени выполнения и обширную поддержку третьих сторон.

Как и большинство динамических языков, xHarbour также доступен как язык сценариев (автономное приложение, подключаемая библиотека, движок MS ActiveScript [Windows Script Host, HTML, ASP]), использующий интерпретатор, написанный на языке xHarbour.

Группа новостей xHarbour Usenet comp.lang.xharbour — это активное сообщество для обсуждения вопросов, связанных с xHarbour.

Встроенные типы данных

xHarbour имеет 6 скалярных типов: Nil , String , Date , Logical , Number , Pointer и 4 сложных типа: Array , Object , CodeBlock и Hash . Скаляр содержит одно значение, например строку, число или ссылку на любой другой тип. Массивы представляют собой упорядоченные списки скаляров или комплексных типов, индексированные по номеру, начиная с 1. Хэши или ассоциативные массивы представляют собой неупорядоченные коллекции значений любого типа, индексированные соответствующим ключом, который может иметь любой скалярный или комплексный тип.

Литеральное (статическое) представление скалярных типов:

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

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

Кодовые блоки могут иметь ссылки на переменные процедуры/функции>метода, в котором они были определены. Такие кодовые блоки могут быть возвращены как значение или с помощью аргумента, передаваемого ПО ССЫЛКЕ . В таком случае кодовый блок «переживет» процедуру, в которой он был определен, и любые переменные, на которые он ссылается, будут DETACHED переменной.

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

Кодовые блоки можно оценивать любое количество раз с помощью функции Eval( BlockExp ).

Переменные

Все типы могут быть присвоены именованным переменным. Идентификаторы именованных переменных имеют длину от 1 до 63 символов, начинаются с [AZ|_] и далее состоят из символов [AZ|0-9|_] длиной до 63 символов. Именованные переменные не чувствительны к регистру.

Переменные имеют одну из следующих областей:

LOCAL , STATIC и GLOBAL разрешаются во время компиляции и, таким образом, работают намного быстрее, чем переменные PRIVATE и PUBLIC , которые являются динамическими объектами, доступ к которым осуществляется посредством таблицы символов времени выполнения . По этой же причине переменные LOCAL , STATIC и GLOBAL не доступны компилятору макросов, и любой код макроса, который пытается ссылаться на них, будет генерировать ошибку во время выполнения.

Из-за динамической природы переменных PRIVATE и PUBLIC их можно создавать и уничтожать во время выполнения, к ним можно обращаться и изменять с помощью макросов времени выполнения, а также к ним можно обращаться и изменяться с помощью кодовых блоков, создаваемых на лету.

Структуры управления

Базовые структуры управления включают в себя все стандартные структуры управления dBase и Clipper , а также дополнительные, вдохновленные языками программирования C или Java :

Петли

[DO] WHILE ConditionExp  ... [ПЕТЛЯ] [ВЫХОД]КОНЕЦ[ДЕЛАТЬ]
FOR Var  := InitExp TO EndExp [STEP StepExp ] ... [ПЕТЛЯ] [ВЫХОД]СЛЕДУЮЩИЙ
ДЛЯ КАЖДОГО Var IN CollectionExp  ... [HB_EnumIndex()] [ПЕТЛЯ] [ВЫХОД]СЛЕДУЮЩИЙ

В инструкции FOR выражение присваивания вычисляется перед первой итерацией цикла. Выражение TO оценивается и сравнивается со значением управляющей переменной перед каждой итерацией, и цикл завершается, если его значение превышает числовое значение управляющей переменной. Необязательное выражение STEP оценивается после каждой итерации перед принятием решения о выполнении следующей итерации.

В FOR EACH переменная Var будет иметь значение (скалярное или комплексное) соответствующего элемента в значении коллекции. Выражением коллекции может быть массив (любого типа или комбинации типов), хеш-таблица или тип объекта.

ЕСЛИ утверждения

ЕСЛИ CondExp  ...
[ELSEIF] CondExp  ...[ЕЩЕ] ...КОНЕЦ[ЕСЛИ]

... представляет 0 или более утверждений .

Выражения условия должны иметь ЛОГИЧЕСКОЕ значение .

Операторы DO CASE

СДЕЛАЙТЕ ДЕЛО CASE CondExp  ... [CASE CondExp ] ... [В ПРОТИВНОМ СЛУЧАЕ] ...КОНЕЦ[ДЕЛО]

Вышеуказанная конструкция логически эквивалентна:

IF CondExp  ...
ELSEIF CondExp  ...
[ELSEIF CondExp ] ...[ЕЩЕ] ...КОНЕЦ[ЕСЛИ]

Операторы SWITCH

xHarbour поддерживает конструкцию SWITCH, основанную на реализации метода switch() на языке C.

SWITCH SwitchExp CASE LiteralExp  ... [ВЫХОД]
 [CASE LiteralExp ] ... [ВЫХОД] [ПО УМОЛЧАНИЮ] ...КОНЕЦ

Операторы BEGIN SEQUENCE

НАЧАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ ... [ПЕРЕРЫВ] [Перерыв([ Опыт ])]ВОССТАНОВИТЬ [ИСПОЛЬЗОВАНИЕ Var ] ...КОНЕЦ[ПОСЛЕДОВАТЕЛЬНОСТЬ]

или:

НАЧАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ ... [ПЕРЕРЫВ] [Перерыв()]КОНЕЦ[ПОСЛЕДОВАТЕЛЬНОСТЬ]

Структура BEGIN SEQUENCE позволяет корректно прерывать любую последовательность, даже при пересечении вложенных процедур/функций. Это означает, что вызываемая процедура/функция может выдать оператор BREAK или выражение Break(), чтобы принудительно развернуть любую вложенную процедуру/функцию вплоть до первой внешней структуры BEGIN SEQUENCE либо после соответствующего оператора END. или предложение RECOVER, если оно присутствует. Оператор Break может опционально передавать выражение любого типа, которое может быть принято оператором RECOVER, чтобы обеспечить дальнейшую обработку восстановления.

canDefaultКроме того , объект ошибки xHarbour поддерживает свойства canRetryи canSubstitute, которые позволяют обработчикам ошибок выполнять некоторые приготовления, а затем запрашивать операцию повтора, возобновления или возвращать значение для замены выражения, вызывающего состояние ошибки.

Операторы TRY [CATCH] [FINALLY]

ПЫТАТЬСЯ ... [ПЕРЕРЫВ] [Перерыв([ Опыт ])] [Бросить([ Опыт ])]ЛОВИТЬ [ Вар ] ...КОНЕЦ
ПЫТАТЬСЯ ... [ПЕРЕРЫВ] [Перерыв([ Опыт ])] [Бросить([ Опыт ])]ЛОВИТЬ [ Вар ] ...ОКОНЧАТЕЛЬНО ...КОНЕЦ

или:

ПЫТАТЬСЯ ... [ПЕРЕРЫВ] [Перерыв([ Опыт ])] [Бросить([ Опыт ])]ОКОНЧАТЕЛЬНО ...КОНЕЦ

Конструкция TRY очень похожа на конструкцию BEGIN SEQUENCE, за исключением того, что она автоматически интегрирует обработку ошибок, так что любая ошибка будет перехвачена и восстановлена ​​с помощью оператора CATCH или в противном случае перенаправлена ​​внешнему обработчику CATCH. Раздел FINALLY гарантированно будет выполнен до выполнения разделов TRY или CATCH прямого потока с помощью RETURN, BREAK или THROW.

Процедуры/функции

[STATIC] ПРОЦЕДУРА SomeProcedureName
[STATIC] ПРОЦЕДУРА SomeProcedureName ()[СТАТИЧЕСКАЯ] ПРОЦЕДУРА SomeProcedureName ( Param1' [, ParamsN ] )
INIT PROCEDURE SomeProcedureName
EXIT PROCEDURE SomeProcedureName
[STATIC] ФУНКЦИЯ SomeProcedureName
[STATIC] ФУНКЦИЯ SomeProcedureName ()[СТАТИЧЕСКАЯ] ФУНКЦИЯ SomeProcedureName ( Param1' [, ParamsN ] )

Процедуры/функции в xHarbour можно указать с помощью ключевых слов PROCEDURE или FUNCTION. Правила именования такие же, как и для переменных (до 63 символов без учета регистра). И процедуры, и функции могут быть уточнены квалификатором области STATIC , чтобы ограничить их использование областью модуля, где он определен.

Необязательные квалификаторы INIT или EXIT обозначают процедуру, которая будет автоматически вызываться непосредственно перед вызовом процедуры запуска приложения или сразу после выхода из приложения соответственно . Параметры, передаваемые в процедуру/функцию, появляются в подпрограмме как локальные переменные и могут принимать любой тип, включая ссылки.

Изменения переменных аргументов не отражаются в соответствующих переменных, передаваемых вызывающей процедурой/функцией/методом, если они не передаются явно ПО ССЫЛКЕ с использованием префикса @ .

PROCEDURE не имеет возвращаемого значения и, если используется в контексте выражения, выдаст значение NIL .

FUNCTION может возвращать любой тип с помощью оператора RETURN в любом месте тела своего определения.

Ниже приведен пример определения процедуры и вызова функции:

х  := Куб( 2 )ФУНКЦИЯ Куб( n ) ВОЗВРАТ n ** 3

Поддержка базы данных

xHarbour расширяет подход сменных драйверов базы данных Clipper (RDD). Он предлагает несколько RDD, таких как DBF, DBFNTX, DBFCDX, DBFDBT и DBFFPT. В xHarbour в одном приложении можно использовать несколько RDD, а новые логические RDD можно определять из комбинации других RDD. Архитектура RDD допускает наследование, так что данный RDD может расширять функциональность других существующих RDD. Сторонние RDD, такие как RDDSQL, RDDSIX, RMDBFCDX, Advantage Database Server и Mediator , служат примером некоторых особенностей архитектуры RDD.

xHarbour также предлагает поддержку ODBC посредством синтаксиса ООП и поддержку ADO посредством OLE.

Макрооператор (компилятор времени выполнения)

Одной из наиболее мощных функций языков xBase является оператор MACRO «&». Реализация оператора макроса в xHarbour позволяет компилировать во время выполнения любое допустимое выражение xHarbour. Такое скомпилированное выражение может использоваться как ЗНАЧЕНИЕ, т. е. правая часть Присвоения, но такое скомпилированное выражение может использоваться для разрешения ЛЕВОЙ стороны присваивания, т. е. ЧАСТНЫХ, или ПУБЛИЧНЫХ переменных, или ПОЛЯ БД.

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

Реализация этой функции в xHarbour настолько полна, что интерпретатор xHarbour, xbScript, активно использует ее для компиляции сценариев xHarbour.

Синтаксис:

&( ... )

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

&НекоторыйИдентификатор

это короткая форма для &( SomeId ).

&SomeId.postfix

— это короткая форма &( SomeId + «постфикс»).

Пример кода

Привет, мир!

Типичная программа « Привет, мир » будет такой:

 ? "Привет, мир!"

Или:

QOut("Привет, мир!")

Или:

Оповещение («Привет, мир!»)

Или, заключенный в явную процедуру:

ПРОЦЕДУРА Главная()  ? "Привет, мир!"ВОЗВРАЩАТЬСЯ

ООП

#include "hbclass.ch" ПРОЦЕДУРА Главная() МЕСТНЫЙ oPerson := Person( "Дэйв") oPerson:Eyes := "Неверно" oЧеловек:Глаза := "Синий" Оповещение( oPerson:Describe() ) ВОЗВРАЩАТЬСЯ
КЛАСС Человек Имя ДАННЫХ INIT "" МЕТОД New() КОНСТРУКТОР ДОСТУП к Eyes INLINE ::pvtEyes ASSIGN Eyes( x ) INLINE IIF( ValType( x ) == 'C' .AND. x IN "Blue,Brown,Green", ::pvtEyes := x, Alert("Недопустимое значение" ) ) // Пример определения метода IN-LINE ВСТРОЕННЫЙ МЕТОД Описать() ЛОКАЛЬНОЕ cОписание ЕСЛИ Пусто(::Имя) cDescription := "У меня пока нет имени." ЕЩЕ cDescription := "Меня зовут: " + ::Имя + ";" КОНДИФ ЕСЛИ ! Пусто(::Глаза) cDescription += "Цвет моих глаз: " + ::Eyes КОНДИФ КОНЕЧНЫЙ МЕТОД ЧАСТНЫЙ: ДАННЫЕ КОНЕЦКЛАСС // Пример обычного определения метода. МЕТОД Новый( cName ) КЛАСС Человек  ::Имя := Имя ВОЗВРАТ Самостоятельно

Сценарии

xHarbour также доступен в качестве интерпретируемого языка в некоторых вариантах скриптовых движков.

Внешние ссылки