\section{Directives: Flow Control}
\label{flowControl}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{\#for}
\label{flowControl.for}

The template:
\begin{verbatim}
#for $i in $range(10)
$i #slurp
#end for
\end{verbatim}

The output:
\begin{verbatim}
0 1 2 3 4 5 6 7 8 9 
\end{verbatim}

The generated code:
\begin{verbatim}
for i in range(10):
    write(filter(i)) # generated from '$i' at line 2, col 1.
    write(' ')
\end{verbatim}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{\#repeat}
\label{flowControl.repeat}

The template:
\begin{verbatim}
#repeat 3
My bonnie lies over the ocean
#end repeat
O, bring back my bonnie to me!
\end{verbatim}

The output:
\begin{verbatim}
My bonnie lies over the ocean
My bonnie lies over the ocean
My bonnie lies over the ocean
O, bring back my bonnie to me!
\end{verbatim}
(OK, so the second line should be ``sea'' instead of ``ocean''.)

The generated code:
\begin{verbatim}
for __i0 in range(3):
    write('My bonnie lies over the ocean\n')
write('O, bring back my bonnie to me!\n')
\end{verbatim}

Note that a new local variable of the form \code{\_\_i\$num} will be
used for each instance of \code{repeat} in order to permit nesting.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{\#while}
\label{flowControl.while}

The template:
\begin{verbatim}
#set $alive = True
#while $alive
I am alive!
#set $alive = False
#end while
\end{verbatim}

The output:
\begin{verbatim}
I am alive!
\end{verbatim}

The generated code:
\begin{verbatim}
alive = True
while alive:
    write('I am alive!\n')
    alive = False
\end{verbatim}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{\#if}
\label{}

The template:
\begin{verbatim}
#set $size = 500
#if $size >= 1500
It's big
#else if $size < 1500 and $size > 0 
It's small
#else
It's not there
#end if
\end{verbatim}

The output:
\begin{verbatim}
It's small
\end{verbatim}

The generated code:
\begin{verbatim}
size = 500
if size >= 1500:
    write("It's big\n")
elif size < 1500 and size > 0:
    write("It's small\n")
else:
    write("It's not there\n")
\end{verbatim}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{\#unless}
\label{flowControl.unless}

The template:
\begin{verbatim}
#set $count = 9
#unless $count + 5 > 15
Count is in range.
#end unless
\end{verbatim}

The output:
\begin{verbatim}
Count is in range.
\end{verbatim}

The generated code:
\begin{verbatim}
        count = 9
        if not (count + 5 > 15):
            write('Count is in range.\n')
\end{verbatim}

{\em Note:} There is a bug in Cheetah 0.9.13.  It's forgetting the
parentheses in the \code{if} expression, which could lead to it calculating
something different than it should.


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{\#break and \#continue}
\label{flowControl.break}

The template:
\begin{verbatim}
#for $i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 'James', 'Joe', 'Snow']
#if $i == 10
  #continue
#end if
#if $i == 'Joe'
  #break
#end if
$i - #slurp
#end for
\end{verbatim}

The output:
\begin{verbatim}
1 - 2 - 3 - 4 - 5 - 6 - 7 - 8 - 9 - 11 - 12 - James - 
\end{verbatim}

The generated code:
\begin{verbatim}
for i in [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 'James', 'Joe', 'Snow']:
    if i == 10:
        write('')
        continue
    if i == 'Joe':
        write('')
        break
    write(filter(i)) # generated from '$i' at line 8, col 1.
    write(' - ')
\end{verbatim}


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{\#pass}
\label{flowControl.pass}

The template:
\begin{verbatim}
Let's check the number.
#set $size = 500
#if $size >= 1500
It's big
#elif $size > 0 
#pass
#else
Invalid entry
#end if
Done checking the number.
\end{verbatim}

The output:
\begin{verbatim}
Let's check the number.
Done checking the number.
\end{verbatim}

The generated code:
\begin{verbatim}
write("Let's check the number.\n")
size = 500
if size >= 1500:
    write("It's big\n")
elif size > 0:
    pass
else:
    write('Invalid entry\n')
write('Done checking the number.\n')
\end{verbatim}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{\#stop}
\label{flowControl.stop}

The template:
\begin{verbatim}
A cat
#if 1
  sat on a mat
  #stop
  watching a rat
#end if
in a flat.
\end{verbatim}

The output:
\begin{verbatim}
A cat
  sat on a mat
\end{verbatim}

The generated code:
\begin{verbatim}
write('A cat\n')
if 1:
    write('  sat on a mat\n')
    if dummyTrans:
        return trans.response().getvalue()
    else:
        return ""
    write('  watching a rat\n')
write('in a flat.\n')
\end{verbatim}

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
\subsection{\#return}
\label{flowControl.return}

The template:
\begin{verbatim}
1
$test[1]
3
#def test
1.5
#if 1
#return '123'
#else
99999
#end if
#end def
\end{verbatim}

The output:
\begin{verbatim}
1
2
3
\end{verbatim}

The generated code:
\begin{verbatim}
    def test(self,
            trans=None,
            dummyTrans=False,
            VFS=valueFromSearchList,
            VFN=valueForName,
            getmtime=getmtime,
            currentTime=time.time):


        """
        Generated from #def test at line 5, col 1.
        """

        if not trans:
            trans = DummyTransaction()
            dummyTrans = True
        write = trans.response().write
        SL = self._searchList
        filter = self._currentFilter
        globalSetVars = self._globalSetVars
        
        ########################################
        ## START - generated method body
        
        write('1.5\n')
        if 1:
            return '123'
        else:
            write('99999\n')
        
        ########################################
        ## END - generated method body
        
        if dummyTrans:
            return trans.response().getvalue()
        else:
            return ""
\end{verbatim}
\begin{verbatim}        
    def respond(self,
            trans=None,
            dummyTrans=False,
            VFS=valueFromSearchList,
            VFN=valueForName,
            getmtime=getmtime,
            currentTime=time.time):


        """
        This is the main method generated by Cheetah
        """

        if not trans:
            trans = DummyTransaction()
            dummyTrans = True
        write = trans.response().write
        SL = self._searchList
        filter = self._currentFilter
        globalSetVars = self._globalSetVars
        
        ########################################
        ## START - generated method body
        
        write('\n1\n')
        write(filter(VFS(SL,"test",1)[1])) # generated from '$test[1]' at line 3, col 1.
        write('\n3\n')
        
        ########################################
        ## END - generated method body
        
        if dummyTrans:
            return trans.response().getvalue()
        else:
            return ""
\end{verbatim}


% Local Variables:
% TeX-master: "devel_guide"
% End:      
