##function
Description
This macro preprocessor function evaluates an ObjectScript function at compile time. It has the form
##function(content)
where content is an ObjectScript function and can be user-defined. ##function replaces ##function(content) with the returned value from the function.
The following example returns the value from an ObjectScript function:
#define alphalen ##function($LENGTH("abcdefghijklmnopqrstuvwxyz"))
WRITE $$$alphalen
In the following example, suppose there is a user-defined function in the GetCurrentTime.mac file:
Tag1()
KILL ^x
SET ^x = """" _ $Horolog _ """"
QUIT ^x
It is then possible to invoke this code in a separate routine, called ShowTimeStamps.mac, as follows:
Tag2
#define CompiletimeTimeStamp ##function($$Tag1^GetCurrentTime())
#define RuntimeTimeStamp $$Tag1^GetCurrentTime()
SET x=$$$CompiletimeTimeStamp
WRITE x,!
SET y=$$$RuntimeTimeStamp
WRITE y,!
The output of this at the Terminal is something like:
USER>d ^ShowTimeStamps
64797,43570
"64797,53807"
USER>
where the first line of output is the value of $Horolog at compile time and the second line is the value of $Horolog at runtime. (The first line of output is not quoted and the second line is quoted because x substitutes a quoted string for its value, so there are no quotes displayed in the Terminal, while y prints the quoted string directly to the Terminal.)
It is the responsibility of the application programmer to make sure that the return value of the ##function call makes both semantic and syntactic sense, given the context of the call.
##function Nesting
InterSystems IRIS supports nesting within a ##function. ##function can nest the following macro functions: ##BeginLit...##EndLit, ##function, ##lit, ##quote, ##expression, ##SafeExpression, ##stripq, and ##unique, ##this