TYPE()

Retrieves the type of an expression

Syntax

TYPE( <cExp> ) --> <cRetType>

Arguments

<cExp> must be a character expression.

Returns

<cRetType> a string indicating the type of the passed expression.

<cRetType>Meaning
"A"array
"B"block
"C"string
"D"date
"L"logical
"M"memo
"N"numeric
"O"object
"U"NIL, local, or static variable, or not linked-in function
"UE"syntax error in the expression or invalid arguments
"UI"function with non-reserved name was requested

Description

This function returns a string which represents the data type of the argument. The argument can be any valid Harbour expression. If there is a syntax error in passed expression then "UE" is returned. If there is a call for any non-reserved Harbour function then "UI" is returned (in other words there is no call for passed UDF function during a data type determination - this is Clipper compatible behavior). Additionally if requested user defined function is not linked into executable then "U" is returned.

The data type of expression is checked by invoking a macro compiler and by evaluation of generated code (if there is no syntax errors). This causes that TYPE() cannot determine a type of local or static variables - only symbols visible at runtime can be checked.

Notice the subtle difference between TYPE and VALTYPE functions. VALTYPE() function doesn't call a macro compiler - it simply checks the type of passed argument of any type. TYPE() requires a string argument with a valid Harbour expression - the data type of this expression is returned.
Examples
       ? TYPE( "{ 1, 2 }" )                            //prints "A"
       ? TYPE( "IIF(.T., SUBSTR('TYPE',2,1), .F.)" )   //prints "C"
       ? TYPE( "AT( 'OK', MyUDF())>0" )                //prints "UI"
       ? TYPE( "{ 1, 2 }[ 5 ]" )                       //prints "UE"

       //--------------------------------------------------------

       LOCAL c
       PRIVATE a:="A", b:="B"
       ? TYPE( "a + b + c" )     //prints: "U" ('C' variable is a local one)

       //--------------------------------------------------------

       LOCAL cFilter := SPACE( 60 )
       ACCEPT "Enter filter expression:" TO cFilter
       IF( TYPE( cFilter ) $ "CDLMN" ) )
          // this is a valid expression
          SET FILTER TO &cFilter
       ENDIF

Status

Ready

Compliance


- Incompatibility with Clipper: In the following code:

PRIVATE lCond := 0 ? TYPE( "IIF( lCond, 'true', MyUDF() )" )

Clipper will print "UE" - in Harbour the output will be "UI"

- if "UI" is returned then the syntax of the expression is correct. However invalid arguments can be passed to function/procedure that will cause runtime errors during evaluation of expression.

Files

Library is rtl

See Also