/*
 * Licensed to the Apache Software Foundation (ASF) under one
 * or more contributor license agreements.  See the NOTICE file
 * distributed with this work for additional information
 * regarding copyright ownership.  The ASF licenses this file
 * to you under the Apache License, Version 2.0 (the
 * "License"); you may not use this file except in compliance
 * with the License.  You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing,
 * software distributed under the License is distributed on an
 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
 * KIND, either express or implied.  See the License for the
 * specific language governing permissions and limitations
 * under the License.
 */
<html>
<head>
<title>FreeMarker: Function Test</title>
</head>
<body>

<p>A simple test follows:</p>

<p>Hello, world!</p>

<p>Now perform function tests:</p>


<p>Function is defined, now let's call it:</p>

    <a href="/home.html">
        <img src="/images/home.png" border="0" alt="Home">
    </a>
    Kilroy was here.

<p>Again, but with different parameters:</p>

    <a href="/about.html">
        <img src="/image/about-us.jpeg" border="0" alt="About Us">
    </a>
    Kilroy was here.

   Good.

<p>A recursive function call:</p>


    0
    1
    2
    3

<p>Test "catch-all" macro parameter:</p>


foo=a baz=[]
foo=a baz=[bar=b]
foo=a baz=[bar=b, baz=c]


Hello World! Today is Monday.

</body>
</html>
