# 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

- VALTYPE()