하바루
xHarbourxHarbour는 무료 멀티플랫폼 확장 클리퍼 컴파일러로 콘솔 드라이버, GUI 및 하이브리드 콘솔/GUI를 포함한 여러 그래픽 터미널(GT)을 제공합니다.xHarbour는 Clipper와의 하위 호환성이 있으며 많은 언어 구문 확장, 런타임 라이브러리 확장 및 광범위한 서드파티 지원을 지원합니다.
대부분의 동적 언어와 마찬가지로 xHarbour는 xHarbour 언어로 작성된 인터프리터를 사용하는 스크립트 언어(독립 실행형 애플리케이션, 링크 가능한 라이브러리, MS ActiveScript 엔진 [Windows Script Host, HTML, ASP])로도 사용할 수 있습니다.
xHarbour 유즈넷 뉴스 그룹 comp.lang.xharbour는 xHarbour 관련 질문을 논의하기 위한 활발한 커뮤니티입니다.
내장 데이터형
xHarbour에는 6가지 스칼라 유형이 있습니다.Null, String, Date, Logical, Number, Pointer 및 4가지 복잡한 유형:어레이, 오브젝트, 코드 블록 및 해시.스칼라에는 문자열, 숫자 또는 다른 유형에 대한 참조와 같은 단일 값이 저장됩니다.어레이는 1부터 시작하는 숫자로 색인화된 스칼라 또는 복합 유형의 순서 목록입니다.해시 또는 연관 배열은 연관된 키로 인덱싱된 모든 유형 값의 정렬되지 않은 모음으로, 스칼라 또는 복합 유형일 수 있습니다.
스칼라 타입의 리터럴(스태틱) 표현:
- 없음: NIL
- 문자열: "hello", "hello", [hello] 또는 "hello\n"
- 날짜: ctod ("2005-03-17")
- 논리: .T., .F.
- 번호: 1, 1.1, -1, 0xFF
복합 유형은 리터럴 값으로 표시될 수도 있습니다.
- 어레이:
{ "String", 1, { "Nested Array" }, .T., FunctionCall(), @FunctionPointer() }
- 코드 블록:
{ Arg1, ArgN Arg1 := ArgN + OuterVar + FunctionCall() }
- 해시:
{ "Name" => "John", 1 => "Numeric key", "Name2" => { "Nested" => "Hash" } }
해시는 다른 해시를 포함한 모든 유형을 모든 요소의 키로 사용할 수 있습니다.해시 및 배열에는 네스트 배열을 포함한 모든 멤버의 값 및 해시를 포함할 수 있습니다.
코드 블록에는 정의된 프로시저/함수 > 메서드의 변수에 대한 참조가 있을 수 있습니다.이러한 코드 블록은 값으로 반환되거나 BY REFERENCE에 의해 전달된 인수에 의해 반환될 수 있습니다.이 경우 코드 블록은 정의된 루틴보다 오래 지속되며 코드 블록이 참조하는 변수는 ACTIVELED 변수가 됩니다.
분리된 변수는 해당 변수를 참조하는 코드 블록이 존재하는 한 해당 값을 유지합니다.이러한 값은 동일한 변수에 액세스할 수 있는 다른 모든 코드 블록과 공유됩니다.코드 블록이 포함된 루틴보다 오래 지속되지 않고 정의된 루틴의 수명 내에 평가될 경우, 코드 블록의 평가에 의한 분리 변수에 대한 변경은 상위 루틴으로 반영됩니다.
코드 블록은 Eval(BlockExp) 함수를 사용하여 몇 번이라도 평가할 수 있습니다.
변수
모든 유형을 명명된 변수에 할당할 수 있습니다.이름 있는 변수 식별자는 1 ~63자로, [A-Z _]로 시작하고 최대 63자로 구성됩니다.명명된 변수는 대소문자를 구분하지 않습니다.
변수에는 다음 범위 중 하나가 있습니다.
- 로컬: 선언한 루틴 내에서만 볼 수 있습니다.루틴 종료 시 값이 손실됩니다.
- 정적: 선언한 루틴 내에서만 표시됩니다.값은 루틴의 후속 호출을 위해 유지됩니다.절차/함수/방법이 정의되기 전에 STATIC 변수가 선언되고 모듈 스코프가 있으며 동일한 소스 파일 내에서 정의된 루틴 내에서 볼 수 있는 경우 응용 프로그램 수명 동안 지속 시간이 유지됩니다.
- GLOBAL 변수가 선언된 동일한 소스 모듈에서 정의된 루틴 내에서 GLOBAL EXTERNAL 선언에 의해 명시적으로 선언된 다른 소스 모듈의 루틴 내에서 볼 수 있습니다.절차/기능/방법을 정의하기 전에 GLOBAL 및 GLOBAL EXTERNAL 선언을 모두 선언해야 합니다.
- 프라이빗: 선언한 루틴과 해당 루틴에 의해 호출된 모든 루틴에 표시됩니다.
- PUBLIC: 동일한 응용 프로그램의 모든 루틴에 표시됩니다.
LOCAL, STATIC 및 GLOBAL은 컴파일 시 해결되므로 런타임 기호 테이블을 통해 액세스하는 동적 엔티티인 PRIVATE 변수 및 PUBLIC 변수보다 훨씬 빠릅니다.같은 이유로 LOCAL, STATIC 및 GLOBAL 변수는 매크로 컴파일러에 노출되지 않습니다.이러한 변수를 참조하려고 하는 매크로 코드는 런타임 오류를 생성합니다.
PRIVATE 변수와 PUBLIC 변수의 동적인 특성으로 인해 런타임에 생성 및 파기할 수 있으며 런타임 매크로를 통해 액세스 및 수정할 수 있으며, 즉석에서 생성된 Codeblocks에 의해 액세스 및 수정이 가능합니다.
제어 구조
기본 제어 구조에는 모든 표준 dBase 및 Clipper 제어 구조뿐만 아니라 C 또는 Java 프로그래밍 언어에서 영감을 받은 추가 구조도 포함됩니다.
루프
[DO] WHIT ConditionExp...[루프] [종료] 종료 [DO]
Var : = InitExp to EndExp [STEP StepExp]...[루프] [종료] 다음
각 Var IN CollectionExp에 대해...[HB_EnumIndex()][LOOP] [EXIT] NEXT
- ...는 여러 xHarbour 문의 시퀀스이며, 각 괄호 []는 옵션 구문을 나타냅니다.
- HB_EnumIndex()는 옵션으로 현재 반복 인덱스(1 기반)를 취득하기 위해 사용할 수 있습니다.
- LOUP 문은 폐쇄 루프 구조의 현재 반복을 재시작합니다.폐쇄 루프가 FOR 또는 FOR ROUP인 경우 반복기를 증가시켜 루프의 다음 반복으로 이동합니다.
- EXIT 문은 둘러싸인 루프 구조의 실행을 즉시 종료합니다.
- NEXT 문은 제어 구조를 닫고 루프 구조의 다음 반복으로 이동합니다.
FOR 문에서는 첫 번째 루프 반복 전에 할당식이 평가됩니다.TO 표현식은 각 반복 전에 평가되고 제어 변수의 값과 비교되며, 제어 변수의 숫자 값보다 큰 수치로 평가될 경우 루프가 종료됩니다.옵션의 STEP 식은 반복 후 다음 반복 실행 여부를 결정하기 전에 평가됩니다.
FOR EACH에서 Var 변수는 수집 값에서 각 요소의 값(scalar 또는 complex)을 가집니다.컬렉션 표현식은 배열(모든 유형의 조합), 해시 테이블 또는 개체 유형일 수 있습니다.
IF문
IF CondExp...[ELSEIF] CondExp...[ELSE]...종료[만일]
...는 0 이상의 문을 나타냅니다.
조건식은 논리값으로 평가해야 합니다.
DO Case 스테이트먼트
케이스 조건 확장 실행...[CASE Condition Exp]...[그렇지 않으면]...종료[케이스]
위의 구성은 논리적으로 다음과 같습니다.
IF CondExp...ELSIF 조건 확장...[ELSEIF CondExp]...[ELSE]...종료[만일]
SWITCH 문
xHarbour는 스위치()의 C 구현에서 영감을 얻은 SWITCH 구성을 지원합니다.
SWITCH SwitchExp CASE LiteralExp...[종료]
[CASE Literal Exp]...[종료] [기본값]...끝.
- LiteralExp는 컴파일된 시간 해결 가능한 숫자 표현식이어야 하며 이러한 연산자가 컴파일 시간 정적 값을 포함하는 한 연산자를 포함할 수 있습니다.
- EXIT 옵션의 스테이트먼트는 C 스테이트먼트의 브레이크와 동등합니다.존재하는 경우, EXEC에 의해 SWITCH 구조의 실행은 종료됩니다.IT 스테이트먼트에 도달하지 않으면 다음 CASE 스테이트먼트 아래의 첫 번째 스테이트먼트(폴 스루)로 넘어갑니다.
BEGIN SEQUENCE 문
BEGIN SEQUENCE ... [ BREAK ][ Break ( [ Exp ] ]복구 [Var ]...종료[시퀀스]
또는 다음과 같이 입력합니다.
BEGIN SEQUENCE ... [ BREAK ][ BREAK ( ) ]END [ SEQUENCE ]
BEGIN SEQUENCE 구조에서는 중첩된 프로시저/함수를 교차하는 경우에도 모든 시퀀스를 적절하게 중단할 수 있습니다.즉, 호출된 프로시저/함수는 BREAK 문 또는 BREAK() 식을 발행하여 네스트된 프로시저/함수의 전개를 각각의 END 문 뒤에 있는 첫 번째 외부 BEGIN SEQUENCE 구조체 또는 RECOVER 구(존재하는 경우)로 되돌릴 수 있습니다.Break 문장은 임의로 모든 유형의 식을 전달할 수 있으며, RECOVER 문에서는 추가 복구 처리를 허용하기 위해 이 식을 받아들일 수 있습니다.
또한 xHarbour Error Object는canDefault
,canRetry
그리고.canSubstitute
속성: 에러 핸들러가 몇 가지 준비를 실행한 후 Retry Operation, Resume를 요구하거나 값을 반환하여 에러 상태를 트리거하는 식을 대체할 수 있습니다.
[CATCH] [FINDLY] 스테이트먼트 트라이
트라이... [ BREAK ][ Break ( [ Exp ] ) ][ Through ( [ Exp ]) ][ Var ] ...끝.
트라이... [ BREAK ][ Break ( [ Exp ] ) ][ Through ( [ Exp ]) ][ Var ] ...드디어...끝.
또는 다음과 같이 입력합니다.
트라이... [ BREAK ][ Break ( [ Exp ] ] ][투구( [ Exp ])]드디어...끝.
TRY 구문은 BEGIN SEQUENCE 구조와 매우 유사하지만 오류 처리를 자동으로 통합하여 CATCH 문을 통해 오류를 대행 수신하고 복구하거나 그렇지 않으면 외부 CATCH 핸들러로 전송합니다.FINAL 섹션은 TRY 섹션 또는 CATCH 섹션이 RETURN, BREAK 또는 SLOW를 통해 흐름 제어를 전송하기 전에 반드시 실행됩니다.
순서/기능
[STATIC] 프로시저 SomeProcedureName [STATIC] 프로시저 SomeProcedureName() [STATIC] 프로시저 SomeProcedureName ( Param1' [, ParamSN] )
INIT 프로시저 Some Procedure Name 종료 프로시저 Some Procedure Name
[STATIC] FUNCTION SomeProcedureName [STATIC] FUNCTION SomeProcedureName() [STATIC] FUNCTION SomeProcedureName ( Param1' [, ParamSN] )
xHarbour의 절차/기능은 키워드로 지정할 수 있습니다. PROCEDURE
, 또는FUNCTION
. 명명 규칙은 변수 규칙과 동일합니다(최대 63자까지 대소문자를 구분하지 않음).절차와 기능은 모두 정의된 모듈의 범위로 사용을 제한하기 위해 스코프 한정자 STATIC에 의해 검증될 수 있습니다.
INIT 또는 EXIT 옵션의 한정자는, 애플리케이션 기동 순서를 호출하기 직전 또는 애플리케이션을 종료한 직후에 자동적으로 기동하도록 플래그를 설정합니다.프로시저/함수에 전달된 파라미터는 로컬 변수로 서브루틴에 표시되며 참조를 포함한 모든 유형을 받아들일 수 있습니다.
인수 변수에 대한 변경은 @ 프레픽스를 사용하여 BY REFERENCE를 명시적으로 전달하지 않는 한 호출 절차/함수/메서드에 의해 전달된 각 변수에 반영되지 않습니다.
PROCEDOR에는 반환값이 없습니다.Expression 컨텍스트에서 사용하면 NIL 값이 생성됩니다.
함수는 RETURN 스테이트먼트를 사용하여 정의 본문 중 어디에 있든 모든 유형을 반환할 수 있습니다.
프로시저 정의와 함수 호출의 예를 다음에 나타냅니다.
x : = 큐브 ( 2 ) FUNTION 큐브 ( n ) RETURN N ** 3
데이터베이스 지원
xHarbour는 Clipper Replaceable Database Drivers(RDD) 접근 방식을 확장합니다.DBF, DBFNTX, DBFCDX, DBFDBT 및 DBFFT와 같은 여러 RDD를 제공합니다.xHarbour에서는, 1개의 애플리케이션으로 복수의 RDD 를 사용할 수 있어 다른 RDD 의 조합으로부터 새로운 논리 RDD 를 정의할 수 있습니다.RDD 아키텍처는 상속을 허용하기 때문에 특정 RDD가 다른 기존 RDD의 기능을 확장할 수 있습니다.RDDSQL, RDDIX, RMDBFCDX, Advantage Database Server, Mediator 등의 서드파티제 RDD는 RDD 아키텍처 기능의 일부 예입니다.
xHarbour는 OOP 구문을 통해 ODBC를 지원하고 OLE를 통해 ADO를 지원합니다.
매크로 연산자(런타임 컴파일러)
xBase 언어의 가장 강력한 기능 중 하나는 매크로 연산자 '&'입니다. xHarbour는 매크로 연산자를 구현하여 유효한 xHarbour 식을 런타임 컴파일할 수 있습니다.이러한 컴파일된 표현식은 할당의 오른쪽과 같은 값으로 사용할 수 있지만, 이러한 컴파일된 표현식은 할당의 왼쪽(예: PRIVATE 변수, PUBLIC 변수 또는 Database Field)을 해결하기 위해 사용할 수 있습니다.
또한 매크로 오퍼레이터는 함수 호출, 할당 완료 또는 인수 목록을 컴파일 및 실행할 수 있으며 매크로의 결과는 컴파일된 응용 프로그램에서 위의 컨텍스트 중 하나를 해결하기 위해 사용될 수 있습니다.IOW, 모든 xHarbour 응용 프로그램을 확장하거나 런타임에 수정하여 추가 코드를 요청 시 컴파일 및 실행할 수 있습니다.
이 기능의 xHarbour 실장은 매우 완전하기 때문에 xHarbour 인터프리터인 xbScript는 xHarbour 스크립트를 컴파일하기 위해 많이 사용합니다.
구문:
& ( ... )
식 '...'의 텍스트 값이 컴파일되고 컴파일된 코드 실행에 따른 값이 결과입니다.
& SomeId
는 &(SomeId)의 줄임말입니다.
&SomeId.postfix
는 & ( SomeId + "postfix" )의 줄임말입니다.
코드 예시
안녕, 세상아!
일반적인 "hello world" 프로그램은 다음과 같습니다.
"안녕, 세상아!"
또는 다음 중 하나를 선택합니다.
QOut ("Hello, world!")
또는 다음 중 하나를 선택합니다.
Alert ("Hello, world!")
또는 명시적 절차로 둘러싸인 경우:
프로시저 메인()? "안녕하세요, 월드!" 리턴
OOP
#http "hbclass.ch" PROCEDURE 메인() LOCAl oPerson : = Person ( "Dave" ) oPerson :눈:= "잘못된" o 사람:눈:= "파란색" 경고(oPerson:설명() 리턴
CLASS Person Data Name INIT " MATOR New ( ) CONTROR ACCESS EYES INLINE : : : pvtEEASS EYES ( x ) INLINE IIF ( ValType ( x ) == 'C' 。AND. x IN "Blue, Brown, Green", ::pvtEyes:= x, Alert("Inval value") // IN-LINE 메서드 정의 INLINE Method Description() LOCAL cDescription IF Empty( :: 이름) cDescription := "아직 이름이 없습니다."설명:"C"Eyes ) cDescription += "my eyes' color is: " +: Eyes ENDIF ENDMETHOD PRIVATE: DATA pvtEES ENDCLASS // 일반 방법 정의 샘플.Method New ( cName )클래스 담당자 : 이름 : = cName RETURN Self
스크립트 작성
xHarbour는 또한 몇 가지 스크립트 엔진에서 인터프리터 언어로 사용할 수 있습니다.
- 스탠드아론 인터프리터: 휴대용, 자급식 인터프리터
xBaseScript
. - ActiveScript:Microsoft ActiveScript 호환 OLE DLL. 다음에서 xHarbour 스크립트를 지원합니다.
- Windows Script Host(WSH)
- Internet Explorer, HTML 클라이언트 측 스크립팅
- IIS 및 기타 ASP 준거 서버