/* * Vitry, copyright (C) Hans Hoglund 2011 * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. * * See COPYING.txt for details. */ package vitry.runtime; import vitry.runtime.error.BindingError; /** * Environment with convenience methods to lookup attributes related * to evaluation. */ public class Context extends HashEnv<Symbol, Symbol> { static final Symbol DELIMITER = Symbol.intern("delimiter"); static final Symbol SIDE = Symbol.intern("side"); static final Symbol QUOTED = Symbol.intern("quoted"); static final Symbol MUTABLE = Symbol.intern("mutable"); static final Symbol PAR = Symbol.intern("()"); static final Symbol BRA = Symbol.intern("[]"); static final Symbol ANG = Symbol.intern("{}"); static final Symbol LEFT = Symbol.intern("left"); static final Symbol RIGHT = Symbol.intern("right"); static final Symbol TRUE = Symbol.intern("true"); static final Symbol FALSE = Symbol.intern("false"); public Context() { super(); } public Context(Context context) { super(context); } public Context define(Symbol key, Symbol val) throws BindingError { super.define(key, val); return this; } public Context extend() { return new Context(this); } public Context extend(Symbol key, Symbol val) { return extend().define(key, val); } public boolean isLeftSide() { return this.lookup(SIDE) == LEFT; } public boolean isMutable() { return this.lookup(MUTABLE) == TRUE; } public boolean isQuoted() { return this.lookup(QUOTED) == TRUE; } public Symbol getDelimiter() { return this.lookup(DELIMITER); } public boolean shouldLookup() { return !this.isLeftSide() && !this.isQuoted(); } }