diff --git a/ownlang-core/src/main/java/com/annimon/ownlang/lib/ScopeHandler.java b/ownlang-core/src/main/java/com/annimon/ownlang/lib/ScopeHandler.java index 9571d50..8913fc7 100644 --- a/ownlang-core/src/main/java/com/annimon/ownlang/lib/ScopeHandler.java +++ b/ownlang-core/src/main/java/com/annimon/ownlang/lib/ScopeHandler.java @@ -76,12 +76,19 @@ public final class ScopeHandler { public static boolean isVariableOrConstantExists(String name) { + if (rootScope().containsConstant(name)) { + return true; + } synchronized (lock) { return findScope(name).isFound; } } public static Value getVariableOrConstant(String name) { + Value constant = rootScope().getConstant(name); + if (constant != null) { + return constant; + } synchronized (lock) { final ScopeFindData scopeData = findScope(name); if (scopeData.isFound) { diff --git a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/MatchExpression.java b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/MatchExpression.java index 2a5e43d..8af6163 100644 --- a/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/MatchExpression.java +++ b/ownlang-parser/src/main/java/com/annimon/ownlang/parser/ast/MatchExpression.java @@ -44,13 +44,12 @@ public final class MatchExpression extends InterruptableNode implements Expressi return evalResult(p.result); } } else { - ScopeHandler.defineVariableInCurrentScope(pattern.variable, value); - if (optMatches(p)) { - final Value result = evalResult(p.result); - ScopeHandler.removeVariable(pattern.variable); - return result; + try (final var ignored = ScopeHandler.closeableScope()) { + ScopeHandler.defineVariableInCurrentScope(pattern.variable, value); + if (optMatches(p)) { + return evalResult(p.result); + } } - ScopeHandler.removeVariable(pattern.variable); } } if ((value.type() == Types.ARRAY) && (p instanceof ListPattern pattern)) {