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