Operator Scope of Action:
Operator First Added:
This function allows execution of code without the need for a return value. This lets an action be set within an attribute, and perform that action as part of a rule or agent action.
For example, the Rule
action('$Color= "bright red"');
will set the note's primary colour ($Color).
Note that that in its simplest form, an action() call is a quote-enclosed string. As action codes tend to use double-quoted strings, it may often be necessary to use single quotes for the outer enclosure, as in the example above.
The action function returns nothing (actually an empty string), so there is no requirement for a left-side attribute to accept any output. By comparison, the related eval(expression) function evaluates an expression and returns a value. Whereas eval() is designed to return an output, action() performs an action such as an assignment.
An action() call can be used with a
do(macro) call to create a form of function as macros allow input parameters (its arguments): see do().
The action() call is particularly useful during export where it is desirable to run some action code in the context of the template during template rendering (evaluation).
Calling stamp code via action()
If a stamp's code is long/complex it can be convenient to store it in a code note. Thus if a code note 'Test-stamp' held the action code
$Colour="red";, then a stamp with the code:
when run would result in the stamped note(s) turning red. The example is trivial but shows the technique. Note the offset reference in the stamp to the code note is case sensitive and should use a unique $Name (or else cite the full $Path to the code note). Local attribute references, i.e. $Color or $ChildCount, are bound to the note being stamped: it is not possible to reference values in the code note using a designator.
On-the-fly Attribute references using action()
Occasionally it is necessary to make at attribute value reference from a a variable. $MyString refers to the value of attribute MyString. But what if the attribute name is itself the value if a variable in the current code? Here action() solves the problem. For instance, if vAnAttr holds as its vale the name of an attribute, e.g. "SomeAttribute" then the following does not work:
$MyString = "$" + vAnAttr; WRONG
as $MyString is not set to the value of $SomeAttr. Instead use action():
$MyString = action("$" + vAnAttr); CORRECT
To build a series of $-prefixed attribute references in a loop, use action() instead of eval(), as described in more detail here.