Tag Archives: Assignment
Expression Terms
Assignment :
The act of copying a new value into a variable. In Clipper language this is done with the simple assignment operators (=) and (:=), or the compound operators (+=, -=, *=, **=).
Binary Operator :
An operator that operates on two operands. For example, the addition operator.
See Also: Operator
Character Functions :
Those functions that act upon individual characters or strings of ASCII characters in the performance of their tasks.
See Also: ASCII, Function, String
Concatenate :
To combine two groups of character data together by placing them in a sequence to form a new string of characters.
See Also: Data Type
Condition :
A logical expression that determines whether an operation will take place. With database commands, a logical expression that determines what records are included in an operation. Conditions are specified as arguments of the FOR or WHILE clause.
Conversion Functions :
Generally referring to a category of functions whose purpose is to change one data type to another (e.g., to change a number or a date to a character string).
Date Functions :
Functions that operate on date values (as opposed to character, numeric or other values).
See Also: Function
Decrement :
To decrease a value by a fixed amount, usually one. In Clipper, the decrement operator (–) can be used to decrement a numeric value in a variable.
See Also: Assignment Increment
Destination :
The variable or array element to receive data in an assignment.
See Also: Assignment
Evaluate :
To execute part of a program in order to produce a value. For an expression, to execute the program code associated with the expression and return the resulting value. For the macro operator, to compile the macro string, execute the resulting program code, and return the resulting value.
See also : Expression
Expression :
A combination of constants, identifiers, operators, and functions that yield a single value when evaluated.
Increment :
To increase a value by a fixed amount, usually one. In Clipper language the increment operator (++) can be used to increment a numeric value in a variable.
List :
A list of expressions, field names, or filenames, separated by commas specified generally as command, procedure, or function arguments. Code blocks can also execute a list of expressions.
Macro :
In Clipper language, an operation that allows source code to be compiled and executed at runtime. In Clipper language, the macro symbol (&) does not perform text substitution unless embedded within a character string. Instead, it is generally treated as a unary operator that operates on a character string. The text in the character string is compiled on the fly using a special runtime compiler. The resulting code is then executed, and the value obtained is returned as the result of the macro operation.
See Also: Code Block, Unary Operator
Operand :
A value that is operated on by an operator, or the term in an expression that specifies such a value. For example, in the expression x + 5, x and 5 are operands.
See Also: Operator
Operator :
A symbol that identifies a basic operation. For example, the multiplication operator (*) denotes that two values are to be multiplied. Operators are categorized as either unary or binary, depending on whether they require one or two operands, respectively.
See Also: Binary Operator, Operand, Unary Operator
Precedence :
The stature of an operator in the hierarchy that determines the order in which expressions are evaluated. For example, the expression 5 + 2 * 3 is interpreted as 5 + (2 * 3) because the multiply operator (*) has a higher precedence than the addition operator (+).
See Also: Expression
Recursion :
The calling of a procedure by a statement in that same procedure. When a procedure calls itself it is said to recurse. A recursive call causes a new activation of the procedure. If the source code for the procedure includes a declaration of local variables, a new set of local variables is created for each activation. A private variable created by the procedure is associated with the activation in which it is created, and is visible in that activation and any lower-level activations, unless obscured by a private variable created in a lower-level activation.
See Also: Activation, Function, Private Variable, Procedure
Shortcutting :
A compiler optimization that causes expressions to be evaluated only to the extent required to determine their outcome. For example, in the expression f() .OR. g() function g need not be executed if function f returns true (.T.). Clipper language performs shortcutting on all logical operators (.OR. .AND. .NOT.).
Truncate :
To remove insignificant information from the end of an item of data. With numerics, to ignore any part of the number that falls outside of the specified precision.
Unary Operator :
An operator that operates on a single operand. For example, the .NOT. operator.
See Also: Binary Operator, Operator
What is Harbour ?
Harbour is a modern computer programming language. It is a Clipper-compatible compiler which is cross-platform, running on many operating systems (DOS, Microsoft Windows, Linux, Unix variants, several BSD descendants, Mac OS X, MINIX 3, Windows CE, Pocket PC, Symbian, iPhone, QNX, VxWorks, OS/2/eComStation, BeOS/Haiku, AIX) using the same source code and databases.
Although it is a powerful general-purpose programming language, it was primarily used to create database/business programs. Harbour have been actively maintained looking for diversity keeping backward-compatible with Clipper style. It has undergone many changes and revisions and regain widely popularity amongst programmers in 1980s and 1990s
The open source Harbour license is similar to the GNU General Public License, with an exception supporting proprietary applications, so proprietary applications can be produced with Harbour and distributed..
Paradigm(s) | multi-paradigm: imperative, functional,object-oriented, reflective |
Appeared in | 1999 |
Designed by | Antonio Linares |
Developer | Viktor Szakáts and community |
Stable release | 3.0.0 (17 July 2011) |
Preview release | 3.1.x available from SVN |
Typing discipline | optionally duck, dynamic, safe, partially strong |
Dialects | Clipper, Xbase ++, Flagship, FoxPro, xHarbour |
Influenced by | dBase, Clipper |
Influenced | xHarbour |
OS | Cross-platform |
License | Open source GPL Compatible |
Usual filename extensions | .prg, .ch, .hbs, .dbf |
Website | http://www.harbour-project.org/ |
History
The idea of a free software Clipper compiler has been floating around for a long time and the subject has often cropped up in discussion on comp.lang.clipper. Antonio Linares founded the Harbour project and the implementation was started.
Sailing the Clipper ship to a Harbour port. Clipper is a type of ship. Harbour is a synonym to port (where ship docks) Harbour is out port to the Clipper language.
On 2009 Harbour had a huge make over on its design promoted mainly by Viktor Szakáts and Przemyslaw Czerpak
Database support
Harbour extends the Clipper Replaceable Database Drivers (RDD) approach. It offers multiple RDDs such as DBF, DBFNTX, DBFCDX, DBFDBT and DBFFPT. In Harbour multiple RDDs can be used in a single application, and new logical RDDs can be defined from combination of other RDDs. The RDD architecture allows for inheritance, so that a given RDD may extend the functionality of other existing RDD(s). Third-party RDDs, like RDDSQL, RDDSIX, RMDBFCDX, Advantage Database Server, and Mediator exemplify some of the RDD architecture features. DBFNTX implementation has almost same functionality of DBFCDX and RDDSIX. NETIO and LetoDB provide remote access over TCP protocol Harbour also offers ODBC support by means of an OOP syntax, and ADO support by means of OLE. MySQL, PostgreSQL, SQLite, Firebird, Oracle are examples of databases which Harbour can connect.
xBase technologies often is confused with a RDBMS software. Although this is true, xBase is more than a simple database system as the same time xBase languages using purely DBF can not provide full concept of a real RDBMS
Programming philosophy
Unlike Java which is intended to be write once, run anywhere, Harbour aims to be write once, compile anywhere. As the same compiler is available for all of the above operating systems, there is no need for recoding to produce identical products for different platforms, except when operating system dependent features are used. Cross-compiling is supported with MinGW32. Under Microsoft Windows, Harbour is more stable but less well-documented than Clipper, but has multi-platform capability and is more transparent, customizable and can run from a USB flash drive.
Under Linux and Windows Mobile, Clipper source code can be compiled with Harbour with very little adaptation. Most software originally written to run on Xbase ++, Flagship, FoxPro, xHarbour and others dialects can be compiled with Harbor with some adaptation. As 2010 many efforts have been made to turn the transition from other xBase dialects easier.
Harbour can use the following C compilers, amongothers: GCC, MinGW, Clang, ICC, Microsoft Visual C++ (6.0+), Borland C++, Watcom C, Pelles C and Sun Studio.
Harbour can make use of multiple Graphic Terminal emulations, including console drivers, and Hybrid Console/GUIs, such as GTWvt, and GTWvg.
Harbour supports external GUIs, free (e.g. HWGui, MiniGUI and Qt) and commercial (e.g. FiveWin, Xailer). HBQt is a library provinding bindings to Qt. HBIDE application included in official distribution and SVN repository is a sample of HBQt potencial.
Harbour is 100% Clipper-compatible and supports many language syntax extensions including greatly extended run-time libraries such as OLE, Blat, OpenSSL, FreeImage,GD, TIP, Tpathy, PCRE, HbZip (zlib and bzip2), cURL, Cairo, its own implementation of CA-Tools and NanFor libraries and many others. Harbour has an active development community and extensive third party support.
Any xBase language provides a very productive way to build business and data intensive applications. Harbour is not an exception.
Macro Operator (runtime compiler)
One of the most powerful features of xBase languages is the Macro Operator ‘&’. Harbour’s implementation of the Macro Operator allows for runtime compilation of any valid Harbour expression. Such a compiled expression may be used as a VALUE, i.e. the right side of an assignment (rvalue), but more interestingly, such a compiled expression may be used to resolve the left side (lvalue) of an assignment, i.e. PRIVATE, or PUBLIC variables, or a database FIELD.
Additionally, the Macro Operator may compile and execute function calls, complete assignments, or even list of arguments, and the result of the macro may be used to resolve any of the above contexts in the compiled application. In other words, any Harbour application may be extended and modified at runtime to compile and execute additional code on-demand.
Latest Macro compiler can compile any valid Harbour code including code to pre-process before compile.
Syntax:
&( ... )
The text value of the expression ‘…’ will be compiled, and the value resulting from the execution of the compiled code is the result.
&SomeId
is the short form for &( SomeId ).
&SomeId.postfix
is the short form of &( SomeId + “postfix” ).
Object Oriented Programming
Programming in an OOP style is a broader issue than a specific library or a specific interface, but OOP programming is something many Clipper programmers have come to expect. CA-Clipper 5.2 and especially 5.3 added a number of base classes, and a matching OOP syntax. Libraries such as Class(y), Fivewin, Clip4Win, and TopClass provide additional OOP functionality.
Harbour has OOP extensions with full support for classes including inheritance, based on Class(y) syntax. OOP syntax in Harbour is very similar to that of earlier Clipper class libraries so it should be possible to maintain legacy Clipper code with minimal changes.
Syntax and semantics
Harbour as every xBase language is case insensitive and can optionally accept keywords written just by first four characters
Built-in data types
Harbour has 6 scalar types : Nil, String, Date, Logical, Number, Pointer, and 4 complex types: Array, Object, CodeBlock, and Hash. A scalar holds a single value, such as a string, number, or reference to any other type. Arrays are ordered lists of scalars or complex types, indexed by number, starting at 1. Hashes, or associative arrays, are unordered collections of any type values indexed by their associated key, which may be of any scalar or complex type.
Literal (static) representation of scalar types:
- Nil: NIL
- String: “hello”, ‘hello’, [hello]
- Date: 0d20100405
- Logical: .T., .F.
- Number: 1, 1.1, −1, 0xFF
Complex Types may also be represent as literal values:
- Array: { “String””, 1, { “Nested Array” }, .T., FunctionCall(), @FunctionPointer() }
- CodeBlock: { |Arg1, ArgN| Arg1 := ArgN + OuterVar + FunctionCall() }
- Hash: { “Name” => “John”, 1 => “Numeric key”, { “Nested” => “Hash” } }
Hashes may use any type including other Hashes as the Key for any element. Hashes and Arrays may contain any type as the Value of any member, including nesting arrays, and Hashes.
Codeblocks may have references to Variables of the Procedure/Function>method in which it was defined. Such Codeblocks may be returned as a value, or by means of an argument passed BY REFERENCE, in such case the Codeblock will “outlive” the routine in which it was defined, and any variables it references, will be a DETACHED variable.
Detached variables will maintain their value for as long as a Codeblock referencing them still exists. Such values will be shared with any other Codeblock which may have access to those same variables. If the Codeblock did not outlive its containing routine, and will be evaluated within the lifetime of the routine in which it is defined, changes to its Detached Variables(s) by means of its evaluation, will be reflected back at its parent routine.
Codeblocks can be evaluated any number of times, by means of the Eval( BlockExp ) function.
Variables
All types can be assigned to named variables. Named variable identifiers are 1 to 63 characters long, start with [A-Z|_] and further consist of the characters [A-Z|0–9|_] up to a maximum of 63 characters. Named variables are not case sensitive.
Variables have one of the following scopes:
- LOCAL: Visible only within the routine which declared it. Value is lost upon exit of the routine.
- STATIC: Visible only within the routine which declared it. Value is preserved for subsequent invocations of the routine. If a STATIC variable is declared before any Procedure/Function/Method is defined, it has a MODULE scope, and is visible within any routine defined within that same source file, it will maintain its life for the duration of the application lifetime.
- PRIVATE: Visible within the routine which declared it, and all routines called by that routine.
- PUBLIC: Visible by all routines in the same application.
LOCAL and STATIC are resolved at compile time, and thus are much faster than PRIVATE and PUBLIC variables which are dynamic entities accessed by means of a runtime Symbol table. For this same reason, LOCAL and STATIC variables are not exposed to the Macro compiler, and any macro code which attempts to reference them will generate a runtime error.
Due to the dynamic nature of PRIVATE and PUBLIC variables, they can be created and destroyed at runtime, can be accessed and modified by means of runtime macros, and can be accessed and modified by Codeblocks created on the fly.
Control structures
The basic control structures include all of the standard dBase, and Clipper control structures as well as additional ones inspired by the C or Java programming languages:
Loops
[DO] WHILE ConditionExp ... [LOOP] [EXIT] END[DO] FOR Var := InitExp TO EndExp [STEP StepExp] ... [LOOP] [EXIT] NEXT FOR EACH Var IN CollectionExp ... [HB_EnumIndex()] [LOOP] [EXIT] NEXT
- The … is a sequence of one of more Harbour statements, and square bracketes [] denote optional syntax.
- The HB_EnumIndex() may be optionally used to retrieve the current iteration index (1 based).
- The LOOP statement restarts the current iteration of the enclosing loop structure, and if the enclosing loop is a FOR or FOR EACH loop, it increases the iterator, moving to the next iteration of the loop.
- The EXIT statement immediately terminates execution of the enclosing loop structure.
- The NEXT statement closes the control structure and moves to the next iteration of loop structure.
In the FOR statement, the assignment expression is evaluated prior to the first loop iteration. The TO expression is evaluated and compared against the value of the control variable, prior to each iteration, and the loop is terminated if it evaluates to a numeric value greater than the numeric value of the control variable. The optional STEP expression is evaluated after each iteration, prior to deciding whether to perform the next iteration.
In FOR EACH, the Var variable will have the value (scalar, or complex) of the respective element in the collection value. The collection expression, may be an Array (of any type or combinations of types), an Hash Table, or an Object type.
IF statements
IF CondExp ... [ELSEIF] CondExp ... [ELSE] ... END[IF]
… represents 0 or more statement(s). The condition expression(s) has to evaluate to a LOGICAL value.
SWITCH statements
Harbour supports a SWITCH construct inspired by the C implementation of switch().
SWITCH SwitchExp CASE LiteralExp ... [EXIT] [CASE LiteralExp] ... [EXIT] [DEFAULT] ... END
- The LiteralExp must be a compiled time resolvable numeric expression, and may involve operators, as long as such operators involve compile time static value.
- The EXIT optional statement is the equivalent of the C statement break, and if present, execution of the SWITCH structure will end when the EXIT statement is reached, otherwise it will continue with the first statement below the next CASE statement (fall through).
BEGIN SEQUENCE statements
BEGIN SEQUENCE ... [BREAK] [Break([Exp])] RECOVER [USING Var] ... END[SEQUENCE]
or:
BEGIN SEQUENCE ... [BREAK] [Break()] END[SEQUENCE]
The BEGIN SEQUENCE structure allows for a well behaved abortion of any sequence, even when crossing nested procedures/functions. This means that a called procedure/function, may issue a BREAK statement, or a Break() expression, to force unfolding of any nested procedure/functions, all the way back to the first outer BEGIN SEQUENCE structure, either after its respective END statement, or a RECOVER clause if present. The Break statement may optionally pass any type of expression, which may be accepted by the RECOVER statement to allow further recovery handing.
Additionally the Harbour Error Object supports canDefault, canRetry and canSubstitute properties, which allows error handlers to perform some preparations, and then request a Retry Operation, a Resume, or return a Value to replace the expression triggering the error condition.
Alternatively TRY [CATCH] [FINALLY] statements are available on xHB library working like the SEQUENCE construct.
Procedures/Functions
[STATIC] PROCEDURE SomeProcedureName [STATIC] PROCEDURE SomeProcedureName() [STATIC] PROCEDURE SomeProcedureName( Param1' [, ParamsN] ) INIT PROCEDURE SomeProcedureName EXIT PROCEDURE SomeProcedureName [STATIC] FUNCTION SomeProcedureName [STATIC] FUNCTION SomeProcedureName() [STATIC] FUNCTION SomeProcedureName( Param1' [, ParamsN] )
Procedures/Functions in Harbour can be specified with the keywords PROCEDURE
, or FUNCTION
. Naming rules are same as those for Variables (up to 63 characters non case sensitive). Both Procedures and Functions may be qualified by the scope qualifier STATIC to restrict their usage to the scope of the module where defined.
The INIT or EXIT optional qualifiers, will flag the procedure to be automatically invoked just before calling the application startup procedure, or just after quitting the application, respectively. Parameters passed to a procedure/function appear in the subroutine as local variables, and may accept any type, including references.
Changes to argument variables are not reflected in respective variables passed by the calling procedure/function/method unless explicitly passed BY REFERENCE using the@ prefix.
PROCEDURE have no return value, and if used in an Expression context will produce a NIL value.
FUNCTION may return any type by means of the RETURN statement, anywhere in the body of its definition.
An example procedure definition and a function call follows:
x := Cube( 2 ) FUNCTION Cube( n ) RETURN n ** 3
Sample code The typical “hello world” program would be:
? "Hello, world!"
Or:
QOut( "Hello, world!" )
Or:
Alert( "Hello, world!" )
Or, enclosed in an explicit procedure:
PROCEDURE Main() ? "Hello, world!" RETURN
OOP examples
#include "hbclass.ch" PROCEDURE Main() LOCAL oPerson := Person( "Dave" ) oPerson:Eyes := "Invalid" oPerson:Eyes := "Blue" Alert( oPerson:Describe() ) RETURN CLASS Person DATA Name INIT "" METHOD New() CONSTRUCTOR ACCESS Eyes INLINE ::pvtEyes ASSIGN Eyes( x ) INLINE IIF( ValType( x ) == 'C' .AND. ; x IN "Blue,Brown,Green", ::pvtEyes := x,; Alert( "Invalid value" ) ) // Sample of IN-LINE Method definition INLINE METHOD Describe() LOCAL cDescription IF Empty( ::Name ) cDescription := "I have no name yet." ELSE cDescription := "My name is: " + ::Name + ";" ENDIF IF ! Empty( ::Eyes ) cDescription += "my eyes' color is: " + ::Eyes ENDIF ENDMETHOD PRIVATE: DATA pvtEyes ENDCLASS // Sample of normal Method definition. METHOD New( cName ) CLASS Person ::Name := cName RETURN Self
Tools
- HBMK2 – Powerful build tool like make
- HBDoc2 and HBExtern – Creates documentation for Harbour
- HPPP – Pre-processor, a powerful tool which avoids typical problems found on C language pre-processor
- HBFormat – Formats source code written on Harbour or another dialect according defined rules
- HBi18n – Tools to localizing text on applications
- HBRun – Shell interpreter for Harbour. Macro compiling allows to run any valid Harbour code as it’s being compiled
- HBIDE – Integrated Development Environment to help Harbour development and various xBase dialects
All tools are multiplatform.
Development
Today Habour development is leading by Viktor Szakáts with huge collaborations and leading many components of core and contribs by Przemysław Czerpak. HBIDE and some components, specially HBQt, are developed by Pritpal Bedi. Others members send minor changes to the Sourceforge SVN repository. As 2010 Harbour development is keeping vibrant activity
Popularity
Although there is no way to measure popularity of Harbour or xBase, the TIOBE Programming Community Index As of June 2006 ranked Microsoft Visual FoxPro, a high profile dialect of xBase, on 12th position on programming languages popularity ranking. FoxPro/xBase ranked on 25th position As of August 2010. As of September 2010, the Clipper Usenet newsgroupscomp.lang.clipper is still active. As of August 2010 Harbour figured on 16th position on weekly downloads in compiler category and 132th position on global rank.
xHarbour comparison
xHarbour is a fork of the earlier Harbour project. xHarbour takes a more aggressive approach to implementing new features in the language, while Harbour is more conservative in its approach, aiming first of all for an exact replication of Clipper behaviour and then implementing new features and extensions as a secondary consideration. It should also be noted that Harbour is supported on a wide variety of operating systems while xHarbour only really supports MS Windows and Linux 32-bit.
The Harbour developers have attempted to document all hidden behaviour in the Clipper language and test Harbour-compiled code alongside the same code compiled with Clipper to maintain compatibility.
The Harbour developers explicitly reject extensions to the language where those extensions would break Clipper compatibility. These rejections were soften recently since the new Harbour architecture allow extensions out of the core compiler.
A detailed comparison between extensions implemented in Harbour and xHarbour can be found in SVN repository of the project on SourceForge.
As of 2009–2010, Harbour has seen a huge increase in its adoption while xHarbour decline as can be seen on his mailing list
See also
- Flagship compiler by multisoft
- Visual FoxPro
- Visual Objects
- XBase ++
References
- ^ Harbour license
- ^ LetoDB
- ^ Official Harbour page
- ^ http://sourceforge.net/projects/harbour-project/
- ^ TIOBE Programming Community Index
- ^ SourceForge
- ^ About xHarbour
- ^ xhb-diff.txt
- ^ Harbour developers’ mailing list statistics
- ^ xHarbour developers’ mailing list statistics
- ^ ohloh.net Activity comparison
External links
- Harbour project official site
- The Oasis Clipper, FoxPro and Xbase ++ community repository
- HBIDE
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ Note : This post borrowed by curtesy of Vikipedia from here : http://en.wikipedia.org/wiki/Harbour_(software)