From d46f05b2c1b174be9a6b9b3e0acde244ec3853a7 Mon Sep 17 00:00:00 2001 From: DualFroz Date: Mon, 24 Aug 2026 09:00:00 +0200 Subject: [PATCH] feat(env): add lexical environment with frames --- Sources/KiteCore/Environment.swift | 39 ++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) create mode 100644 Sources/KiteCore/Environment.swift diff --git a/Sources/KiteCore/Environment.swift b/Sources/KiteCore/Environment.swift new file mode 100644 index 0000000..9c50a6b --- /dev/null +++ b/Sources/KiteCore/Environment.swift @@ -0,0 +1,39 @@ +public final class Environment { + var vars: [String: Value] + let parent: Environment? + + public init(parent: Environment? = nil) { + self.vars = [:] + self.parent = parent + } + + func define(_ name: String, _ value: Value) { + vars[name] = value + } + + func get(_ name: String) -> Value? { + var env: Environment? = self + while let e = env { + if let v = e.vars[name] { return v } + env = e.parent + } + let base = baseName(name) + if base != name { return get(base) } + return nil + } + + @discardableResult + func set(_ name: String, _ value: Value) -> Bool { + var env: Environment? = self + while let e = env { + if e.vars[name] != nil { + e.vars[name] = value + return true + } + env = e.parent + } + let base = baseName(name) + if base != name { return set(base, value) } + return false + } +}