{{fbdoc item="title" value="__FB_EVAL__"}}----
Intrinsic define (macro) performed by the compiler.

{{fbdoc item="syntax"}}##
	""__FB_EVAL__( arg )""
##
{{fbdoc item="param"}}
	##//arg//##
		argument

{{fbdoc item="desc"}}
	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.

{{fbdoc item="ex"}}
	{{fbdoc item="filename" value="examples/manual/defines/fbeval.bas"}}%%(freebasic)
#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
'/
	%%
	{{fbdoc item="filename" value="examples/manual/defines/fbeval2.bas"}}%%(freebasic)
'   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.

{{fbdoc item="ver"}}
	- Since fbc 1.08.0

{{fbdoc item="diff"}}
	- New to ""FreeBASIC""

{{fbdoc item="see"}}
	- ##[[KeyPgDdfbquote|__FB_QUOTE__]]##
	- ##[[KeyPgDdfbunquote|__FB_UNQUOTE__]]##

{{fbdoc item="back" value="CatPgDddefines|Intrinsic Defines"}}