Next: The foreach
Function, Previous: Functions for Conditionals, Up: Functions for Transforming Text [Contents][Index]
let
FunctionThe let
function provides a means to limit the scope of a
variable. The assignment of the named variables in a let
expression is in effect only within the text provided by the
let
expression, and this assignment doesn’t impact that named
variable in any outer scope.
Additionally, the let
function enables list unpacking by
assigning all unassigned values to the last named variable.
The syntax of the let
function is:
$(let var [var ...],[list],text)
The first two arguments, var and list, are expanded before anything else is done; note that the last argument, text, is not expanded at the same time. Next, each word of the expanded value of list is bound to each of the variable names, var, in turn, with the final variable name being bound to the remainder of the expanded list. In other words, the first word of list is bound to the first variable var, the second word to the second variable var, and so on.
If there are more variable names in var than there are words in list, the remaining var variable names are set to the empty string. If there are fewer vars than words in list then the last var is set to all remaining words in list.
The variables in var are assigned as simply-expanded variables
during the execution of let
. See The Two Flavors
of Variables.
After all variables are thus bound, text is expanded to provide
the result of the let
function.
For example, this macro reverses the order of the words in the list that it is given as its first argument:
reverse = $(let first rest,$1,\ $(if $(rest),$(call reverse,$(rest)) )$(first)) all: ; @echo $(call reverse,d c b a)
will print a b c d
. When first called, let
will expand
$1 to d c b a
. It will then assign first to
d
and assign rest to c b a
. It will then expand
the if-statement, where $(rest)
is not empty so we recursively
invoke the reverse function with the value of rest which
is now c b a
. The recursive invocation of let
assigns
first to c
and rest to b a
. The recursion
continues until let
is called with just a single value,
a
. Here first is a
and rest is empty, so we
do not recurse but simply expand $(first)
to a
and
return, which adds b
, etc.
After the reverse call is complete, the first and
rest variables are no longer set. If variables by those names
existed beforehand, they are not affected by the expansion of the
reverse
macro.
Next: The foreach
Function, Previous: Functions for Conditionals, Up: Functions for Transforming Text [Contents][Index]