__FB_EVAL__

Intrinsic define (macro) performed by the compiler.

Syntax
	__FB_EVAL__( arg )

Parameters
	arg
		argument

Description
	Evaluates the argument (constant-expression) at compile time.

	When the argument evaluation produces a string, __FB_EVAL__ returns a 
	string formatted with a preprocessor operator:
		- a KeyPgOpPpNoescapeNon-Escaped String Literal (of form: $"text"),
		- or an KeyPgOpPpEscapeEscaped String Literal (of form: !"text") if needed.
	For other datatypes produced, simple ProPgLiteralsLiterals (of Integers, Floating 
	Points, Booleans) without prefix/suffix are returned.

	__FB_EVAL__ macro is useful where there is any of the following:
		- non functional expression (i.e. side-effects),
		- needs to be evaluated (i.e. simplified, respecting the operator 
		precedence) before passing it on,
		- used in a place where fbc would not allow an expression.

Example
	#print 1 + 2
	#print __FB_EVAL__( 1 + 2 )
	#print 4 * Atn(1)
	#print __FB_EVAL__( 4 * Atn(1) )

	/' Compiler output:
	1 + 2
	3
	4 * Atn(1)
	3.141592653589793
	'/
	   

	'   In this example, the three '__FB_EVAL__' are absolutely mandatory in this 'assign()' macro.
	'   Even for '__FB_QUOTE__( __FB_EVAL__( expr ) )', because for the case of expr = cos(1/x),
	'   'cos(1/x)' must be properly evaluated before be quoted (after the previous 'assign("x", x+1)'),
	'   otherwise in that case 'cos(1/x+1)' is taken into account (giving 'cos(2)') instead of 'cos(1/(x+1))' (giving 'cos (1/2)')
	'   because the operator precedence is not applied by '__FB_QUOTE__'.

	#macro assign( sym, expr )
	   __FB_UNQUOTE__( __FB_EVAL__( "#undef " + sym ) )
	   __FB_UNQUOTE__( __FB_EVAL__( "#define " + sym + " " + __FB_QUOTE__( __FB_EVAL__( expr ) ) ) )
	#endmacro

	#define x

	assign( "x", 1 )
	Print x

	assign( "x", x+1 )
	Print x

	assign( "x", Cos(1/x) )
	Print x

	assign( "x", "hello" )
	Print x

	assign( "x", x+x )
	Print x

	/' Output:
	 1
	 2
	 0.877582...
	hello
	hellohello
	'/
	   

	See also KeyPgDdfbargextract__FB_ARG_EXTRACT__ example.

Version
	* Since fbc 1.08.0

Differences from QB
	* New to FreeBASIC

See also
	* KeyPgDdfbquote__FB_QUOTE__
	* KeyPgDdfbunquote__FB_UNQUOTE__

