$ is a ``smart variable prefix''. When Cheetah sees $, it
determines both the variable's position and whether it's a searchList value or
a non-searchList value, and generates the appropriate Python code.
In top-level position, the $ is required. Otherwise there's
nothing to distinguish the variable from ordinary text, and the variable name
is output verbatim.
In expression position, the $ is required if the value comes from
the searchList or a ``#set global'' variable, recommended for
local/global/builtin variables, and not necessary for the special
constants None, True and False. This works because
Cheetah generates a function call for a searchList placeholder, but a bare
variable name for a local/global/builtin variable.
In LVALUE position, the $ is recommended. Cheetah knows where
an LVALUE is expected, so it can handle your variable name whether it has
$ or not.
EXCEPTION: Do not use the $ prefix for intermediate variables in
a Python list comprehensions. This is a limitation of Cheetah's parser; it
can't tell which variables in a list comprehension are the intermediate
variables, so you have to help it. For example:
#set $theRange = [x ** 2 for x in $range(10)]
$theRange is a regular #set variable. $range is a
Python built-in function. But x is a scratch variable internal to
the list comprehension: if you type $x, Cheetah will miscompile
it.