stringtranslate.com

xHarbour

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

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

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

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

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

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

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

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

Codeblocks могут иметь ссылки на переменные метода Procedure/Function>method, в котором он был определен. Такие Codeblocks могут быть возвращены как значение или посредством аргумента, переданного BY REFERENCE , в таком случае Codeblock «переживет» процедуру, в которой он был определен, и любые переменные, на которые он ссылается, будут ОТДЕЛЕННОЙ переменной.

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

Блоки кода можно оценивать любое количество раз с помощью функции 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  ... [ПЕТЛЯ] [ВЫХОД]КОНЕЦ[ДЕЛАТЬ]
ДЛЯ Var  := InitExp TO EndExp [STEP StepExp ] ... [ПЕТЛЯ] [ВЫХОД]СЛЕДУЮЩИЙ
ДЛЯ КАЖДОГО Var В CollectionExp  ... [HB_EnumIndex()] [ПЕТЛЯ] [ВЫХОД]СЛЕДУЮЩИЙ

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

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

IF-заявления

ЕСЛИ УсловиеВыраж  ...
[ELSEIF] УсловиеВыраж  ...[ЕЩЕ] ...КОНЕЦ[ЕСЛИ]

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

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

DO CASE заявления

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

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

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

SWITCH-утверждения

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

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

Операторы BEGIN SEQUENCE

НАЧАТЬ ПОСЛЕДОВАТЕЛЬНОСТЬ ... [ПЕРЕРЫВ] [Break([ Exp ])]ВОССТАНОВИТЬ [ИСПОЛЬЗУЯ Var ] ...КОНЕЦ[ПОСЛЕДОВАТЕЛЬНОСТЬ]

или:

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

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

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

TRY [CATCH] [FINALLY] утверждения

ПЫТАТЬСЯ ... [ПЕРЕРЫВ] [Break([ Exp ])] [Бросить([ Эксп ])]CATCH [ Вар ] ...КОНЕЦ
ПЫТАТЬСЯ ... [ПЕРЕРЫВ] [Break([ Exp ])] [Бросить([ Эксп ])]CATCH [ Вар ] ...ОКОНЧАТЕЛЬНО ...КОНЕЦ

или:

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

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

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

[СТАТИЧЕСКАЯ] ПРОЦЕДУРА SomeProcedureName
[СТАТИЧЕСКАЯ] ПРОЦЕДУРА SomeProcedureName ()[СТАТИЧЕСКАЯ] ПРОЦЕДУРА SomeProcedureName ( Param1 [, ParamsN ] )
ПРОЦЕДУРА ИНИЦИИРОВАНИЯ SomeProcedureName
ВЫХОД ИЗ ПРОЦЕДУРЫ SomeProcedureName
[СТАТИЧЕСКАЯ] ФУНКЦИЯ SomeProcedureName
[СТАТИЧЕСКАЯ] ФУНКЦИЯ SomeProcedureName ()[СТАТИЧЕСКАЯ] ФУНКЦИЯ SomeProcedureName ( Param1 [, ParamsN ] )

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

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

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

PROCEDURE не имеет возвращаемого значения и при использовании в контексте Expression вернет значение NIL .

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

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

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

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

xHarbour расширяет подход Clipper Replaceable Database Drivers (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. Такое скомпилированное выражение может использоваться как ЗНАЧЕНИЕ, т. е. правая сторона присваивания, но такое скомпилированное выражение может использоваться для разрешения ЛЕВОЙ стороны присваивания, т. е. PRIVATE или PUBLIC переменных или ПОЛЯ базы данных.

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

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

Синтаксис:

&( ... )

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

&SomeId

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

&SomeId.постфикс

— это краткая форма &( SomeId + "postfix" ).

Пример кода

Привет, мир!

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

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

Или:

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

Или:

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

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

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

ООП

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

Скриптинг

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

Ссылки

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