#### 14.2.1 Overview ¶

    DEFINE macro_name([argument[/argument]...])
    ...body...
    !ENDDEFINE.

Each argument takes the following form:

    {!arg_name= | !POSITIONAL}
    [!DEFAULT(default)]
    [!NOEXPAND]
    {!TOKENS(count) | !CHAREND('token') | !ENCLOSE('start' | 'end') | !CMDEND}

The following directives may be used within body:

    !OFFEXPAND
    !ONEXPAND

The following functions may be used within the body:

    !BLANKS(count)
    !CONCAT(arg...)
    !EVAL(arg)
    !HEAD(arg)
    !INDEX(haystack, needle)
    !LENGTH(arg)
    !NULL
    !QUOTE(arg)
    !SUBSTR(arg, start[, count])
    !TAIL(arg)
    !UNQUOTE(arg)
    !UPCASE(arg)

The body may also include the following constructs:

    !IF (condition) !THEN true-expansion !ENDIF
    !IF (condition) !THEN true-expansion !ELSE false-expansion !ENDIF

    !DO !var = start !TO end [!BY step]
      body
    !DOEND
    !DO !var !IN (expression)
      body
    !DOEND

    !LET !var = expression