#ifndef __Compiler_h
#define __Compiler_h
#include "SchemeObject.h"
#include "CompiledCode.h"
#include "Symbol.h"
#include "Scope.h"
#include "Error.h"

#define TAIL 1

@interface Compiler: SchemeObject
{
    CompiledCode *code;
    SchemeObject *sexpr;
    Scope *scope;
    Error *err;
}

+ (id) newWithLambda: (SchemeObject *) xp scope: (Scope *) sc;
- (id) initWithLambda: (SchemeObject *) xp scope: (Scope *) sc;
- (SchemeObject*) compile;

- (void) emitExpression: (SchemeObject *) expression flags: (int) fl;
- (void) emitLambda: (SchemeObject *) expression;
- (void) emitConstant: (SchemeObject *) expression;
- (void) emitApply: (SchemeObject *) expression flags: (int) fl;
@end

#endif //__Compiler_h