Из Википедии, свободной энциклопедии
Перейти к навигации Перейти к поиску

xHarbour - это бесплатный мультиплатформенный расширенный компилятор Clipper , предлагающий несколько графических терминалов (GT), включая драйверы консоли, графические интерфейсы и гибридные консоли / графические интерфейсы. 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. Хэши или ассоциативные массивы - это неупорядоченные коллекции значений любого типа, индексируемые их связанным ключом, который может быть любого скалярного или сложного типа.

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

  • Nil: NIL
  • Строка: «привет», «привет», [привет] или E «привет \ n»
  • Дата: ctod ("2005-03-17")
  • Логический: .T., .F.
  • Число: 1, 1.1, -1, 0xFF

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

  • Множество: { "String", 1, { "Nested Array" }, .T., FunctionCall(), @FunctionPointer() }
  • CodeBlock: { |Arg1, ArgN| Arg1 := ArgN + OuterVar + FunctionCall() }
  • Хеш: { "Name" => "John", 1 => "Numeric key", "Name2" => { "Nested" => "Hash" } }

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

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

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

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

Переменные [ править ]

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

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

  • ЛОКАЛЬНЫЙ : виден только внутри подпрограммы, которая его объявила. Значение теряется при выходе из процедуры.
  • СТАТИЧЕСКИЙ : виден только в подпрограмме, которая его объявила. Значение сохраняется для последующих вызовов подпрограммы. Если переменная STATIC объявляется до того, как будет определена какая-либо процедура / функция / метод, она имеет область действия MODULE и видна в любой подпрограмме, определенной в том же исходном файле, она будет поддерживать свою жизнь в течение всего времени существования приложения.
  • GLOBAL Виден внутри любой подпрограммы, определенной в том же исходном модуле, где объявлена ​​переменная GLOBAL, а также любой подпрограммы любого другого исходного модуля, который явно объявляет ее, посредством объявления GLOBAL EXTERNAL . Объявления GLOBAL и GLOBAL EXTERNAL должны быть объявлены до определения любой процедуры / функции / метода.
  • ЧАСТНЫЙ : виден внутри подпрограммы, которая ее объявила, и всех подпрограмм, вызываемых этой подпрограммой.
  • PUBLIC : виден для всех подпрограмм в одном приложении.

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

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

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

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

Петли [ править ]

[DO] ПОКА ConditionExp  ... [ПЕТЛЯ] [ВЫХОД]КОНЕЦ [ДЕЛАТЬ]
FOR Var  : = InitExp TO EndExp [STEP StepExp ] ... [ПЕТЛЯ] [ВЫХОД]СЛЕДУЮЩИЙ
ДЛЯ КАЖДОГО ВАР В CollectionExp  ... [HB_EnumIndex ()] [ПЕТЛЯ] [ВЫХОД]СЛЕДУЮЩИЙ
  • ... представляет собой последовательность одного из нескольких операторов порождены страниц, и квадратный bracketes [] обозначает необязательный синтаксис.
  • HB_EnumIndex () может быть необязательно использован для получения индекса текущей итерации (1 основы).
  • Оператор LOOP перезапускает текущую итерацию структуры включающего цикла, и если включающий цикл является циклом FOR или FOR EACH , он увеличивает итератор, переходя к следующей итерации цикла.
  • Оператор EXIT немедленно завершает выполнение структуры включающего цикла.
  • Оператор NEXT закрывает структуру управления и переходит к следующей итерации структуры цикла.

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

В ДЛЯ КАЖДОЙ , то вар переменная будет иметь значение (скалярное, или сложный) соответствующего элемента в стоимости сбора. Выражение коллекции может быть массивом (любого типа или комбинаций типов), хэш-таблицей или типом объекта.

Операторы IF [ править ]

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

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

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

Операторы DO CASE [ править ]

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

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

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

Операторы SWITCH [ править ]

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

ПЕРЕКЛЮЧАТЕЛЬ SwitchExp CASE LiteralExp  ... [ВЫХОД]
 [CASE LiteralExp ] ... [ВЫХОД] [ДЕФОЛТ] ...КОНЕЦ
  • LiteralExp должно быть выражение разрешимо числовое скомпилированное время и может включать в себя оператор, до тех пор , как такие операторы включают значение статического времени компиляции.
  • EXIT Необязательный оператор является эквивалентом заявления C перерыва , и если они присутствуют, выполнение структуры ПЕРЕКЛЮЧАТЕЛЯ закончится , когда будет достигнуто заявление EXIT, в противном случае он будет продолжать с первым утверждением ниже следующим оператором Case (провалиться).

Операторы BEGIN SEQUENCE [ править ]

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

или же:

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

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

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

ПОПРОБУЙТЕ [CATCH] [НАКОНЕЦ] утверждения [ редактировать ]

ПОПРОБУЙ ... [ПЕРЕРЫВ] [Перерыв ([ Exp ])] [Бросок ([ Exp ])]CATCH [ Var ] ...КОНЕЦ
ПОПРОБУЙ ... [ПЕРЕРЫВ] [Перерыв ([ Exp ])] [Бросок ([ Exp ])]CATCH [ Var ] ...НАКОНЕЦ ...КОНЕЦ

или же:

ПОПРОБУЙ ... [ПЕРЕРЫВ] [Перерыв ([ Exp ])] [Бросок ([ Exp ])]НАКОНЕЦ ...КОНЕЦ

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

Процедуры / функции [ править ]

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

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

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

Изменения переменных аргументов не отражаются в соответствующих переменных, передаваемых вызывающей процедурой / функцией / методом, если они явно не переданы BY REFERENCE с использованием префикса @ .

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

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

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

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

Поддержка базы данных [ править ]

xHarbour расширяет подход к заменяемым драйверам баз данных (RDD) Clipper . Он предлагает несколько 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).

 & SomeId.postfix

является краткой формой & (SomeId + "постфикс").

Пример кода [ править ]

Привет мир! [ редактировать ]

Типичная программа " hello world " будет выглядеть так:

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

Или же:

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

Или же:

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

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

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

ООП [ править ]

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

Сценарии [ править ]

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

  • Автономный интерпретатор : портативный, автономный интерпретатор xBaseScript .
  • ActiveScript : совместимая с Microsoft ActiveScript OLE DLL, которая поддерживает скрипты xHarbour в:
    • Хост сценариев Windows (WSH).
    • Internet Explorer, сценарии на стороне клиента HTML.
    • IIS и любой другой совместимый с ASP сервер.

Внешние ссылки [ править ]

  • Официальный сайт
  • Объектно-ориентированный графический интерфейс гавани (ooHG)
  • FiveWin
  • Xailer