calcium-lang
Version:
Calcium language interpreter
58 lines • 2.19 kB
JavaScript
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