Next: Redefining built-in functions, Previous: Built-in functions, Up: Built-in functions [Contents][Index]
Several of the built-in functions expect or return a string argument.
Examples include $STRING
(see $STRING
: Expand, then stringize), $UNQUOTE
(see $UNQUOTE
: Remove quotes from string), and $UNSTRING
(see $UNSTRING
: Convert string into characters).
In understanding the operation of those functions, it is important to
understand just what a string means in the FWEB context. As usual,
it is a vector of characters. However, those need not be
delimited by quotes, although they may be. Internally, a string is
represented by the construction sqc...cqs, where s is a special
string delimiter never seen by the user, q is an optional quote
character (either single or double quote depending on the language), and
c is an ordinary character. Whether or not the quotes are present,
the string delimiters inhibit macro expansion.
The difference between $UNQUOTE
and $UNSTRING
can now be
stated as follows. Given a quoted string such as "abc"
(in C),
abc
(and therefore is not very useful).
$UNSTRING
is primarily used internally.
The built-ins $P
(see $P
: The C preprocessor symbol) and $PP
(see $PP
: The C preprocessor symbol), which
both generate the preprocessor character ‘#’, provide a good
illustration of the differences between $UNQUOTE
and
$UNSTRING
. Consider FORTRAN as an example. Essentially,
$P
is defined as ‘$UNQUOTE('#')’, which is internally
s#s. When this single-character string is sent to the output, it is
treated like any other expression and therefore would appear in column 7
or greater even if the construction appeared at the very beginning of
the line. On the other hand, $PP
is (essentially) defined as
‘$UNSTRING('#')’, which is internally the single character #.
Because this character is not a string, the FORTRAN output driver
treats it as a special control character, defined in this case to force
the character into the first column.
Next: Redefining built-in functions, Previous: Built-in functions, Up: Built-in functions [Contents][Index]