// How to memoize a function.  Also tests "static"
using namespace oadl;

proc main()
{
    "fib(36) = ",
        proc(n)
        {
            static factDict = nil;
            if (factDict == nil) {
                factDict = new Dict(0);
            }
            if (n < 2) {
                return n;
            }
            else if (factDict[n] != nil) {
                return factDict[n];
            }
            else {
               var result;
               result = (proc)(n-1) + (proc)(n-2);
               factDict = factDict.reshape(factDict.length()+1);
               factDict[n] = result;
               return result;
            }
        }
        (36),
        "\n";
}