// Copyright (c) 1996-2002 Brian D. Carlstrom

package bdc.scheme.expression;

import bdc.scheme.Environment;
import bdc.scheme.Scheme;
import bdc.scheme.SchemeException;
import bdc.scheme.Stack;
import bdc.scheme.Writer;
import bdc.scheme.compiler.CompileTimeEnvironment;
import bdc.util.FastStringBuffer;
import bdc.util.Fmt;

public class Begin extends Expression
{
    Expression[] expressions;

    public Begin (ExpressionArray expressions)
    {
        expressions.trim();
        this.expressions = expressions.array();
    }

    public Object eval (Environment environment, Stack stack)
      throws SchemeException
    {
        try {
            Object result = Scheme.Unspecified;
            for (int i = 0; i < expressions.length; i++)
                result = expressions[i].eval(environment, stack);
            return result;
        }
        catch (SchemeException se) {
            backTrace(se);
            return Scheme.NotReached;
        }
    }

    /**
        Fixup sub-expressions and return
    */
    public Expression fixupVariables (CompileTimeEnvironment environment)
    {
        fixupVariables(expressions, environment);
        return this;
    }

    public static void fixupVariables (Expression[]           expressions,
                                       CompileTimeEnvironment environment)
    {
        for (int i = 0; i < expressions.length; i++) {
            expressions[i] = expressions[i].fixupVariables(environment);
        }
    }

    static String backtrace (Expression[] expressions)
    {
        FastStringBuffer result = new FastStringBuffer(1024);
        for (int i = 0; i < expressions.length; i++) {
            result.append(Writer.write(expressions[i]));
            if (i+1 < expressions.length) {
                result.append(' ');
            }
        }
        return result.toString();
    }

    public String toString ()
    {
        return Fmt.S("(begin %s)", backtrace(expressions));
    }
}

