UNPKG

calcium-lang

Version:
58 lines 2.19 kB
import { None } from "../factory"; import { default as Sym } from "../symbol"; import { evaluate, retrieveValue } from "../util"; /** * access the element by an index or a key */ export default class Subscript { /** * * @param referredObj * @param lower could be a single index or key. Otherwise the value from which * a slice starts. * @param upper the value at which a slice ends, if any */ constructor(referredObj, lower, upper) { this.referredObj = referredObj; this.lower = lower; this.upper = upper; } assign(rhs, env) { const ref = evaluate(this.referredObj, env); if (this.upper === undefined) { const rhsValue = evaluate(rhs, env); const index = evaluate(this.lower, env); Reflect.get(ref, Sym.subscript)(index, rhsValue); } else { const rhsValue = retrieveValue(rhs, env); // Proxy cannot be used as a list const l = evaluate(this.lower, env); const u = evaluate(this.upper, env); Reflect.get(ref, Sym.slice)(l, u, rhsValue); } } [Sym.evaluate](env) { const ref = evaluate(this.referredObj, env); if (this.upper === undefined) { const index = evaluate(this.lower, env); return Reflect.get(ref, Sym.subscript)(index); } else { const l = evaluate(this.lower, env); const u = evaluate(this.upper, env); return Reflect.get(ref, Sym.slice)(l, u); } } get [Sym.description]() { if (this.upper === undefined) { return `${Reflect.get(this.referredObj, Sym.description)}[${Reflect.get(this.lower, Sym.description)}]`; } else { // consider the cases such as `a[:-1]` or `a[:]`. const lowerStr = this.lower === None ? "" : Reflect.get(this.lower, Sym.description); const upperStr = this.upper === None ? "" : Reflect.get(this.upper, Sym.description); return `${Reflect.get(this.referredObj, Sym.description)}[${lowerStr}:${upperStr}]`; } } } //# sourceMappingURL=subscript.js.map