import type { SExpr } from '../SExpr';
import type { ILambdaClosure } from '../ILambdaClosure';
import type { IMacroDef } from '../IMacroDef';
import type { Environment, Definitions } from '../EnvironmentTypes';
/**
 * EvalContext manages the evaluation environment including:
 * - Local variable bindings (lexical scope)
 * - Global definitions (def/define)
 * - Macro definitions
 */
export declare class EvalContext {
    /** Environment for variable bindings (lexical scope) */
    private _env;
    /** Global definitions (def/define) */
    private _definitions;
    /**
     * Create a new EvalContext, optionally copying from another context
     */
    constructor(parent?: EvalContext);
    /**
     * Get current environment
     */
    get env(): Environment;
    /**
     * Set entire environment (for scope changes)
     */
    set env(value: Environment);
    /**
     * Get definitions
     */
    get definitions(): Definitions;
    /**
     * Look up a variable in the environment or definitions
     */
    lookup(name: string): unknown;
    /**
     * Check if a variable is defined
     */
    isDefined(name: string): boolean;
    /**
     * Check if a variable is a callable (lambda or macro)
     */
    isCallable(name: string): boolean;
    /**
     * Define a global definition
     */
    define(name: string, value: unknown): void;
    /**
     * Bind a variable in the current environment
     */
    bind(name: string, value: unknown): void;
    /**
     * Create a new scope with additional bindings
     */
    withBindings(bindings: Record<string, unknown>): EvalContext;
    /**
     * Create a child scope (for let, lambda application)
     */
    pushScope(): {
        context: EvalContext;
        restore: () => void;
    };
    /**
     * Check if a value is a lambda closure
     */
    isLambda(value: unknown): value is ILambdaClosure;
    /**
     * Check if a value is a macro definition
     */
    isMacro(value: unknown): value is IMacroDef;
    /**
     * Get a macro definition by name
     */
    getMacro(name: string): IMacroDef | undefined;
    /**
     * Define a macro
     */
    defineMacro(name: string, params: string[], body: SExpr): void;
}
//# sourceMappingURL=Environment.d.ts.map