calcium-lang
Version:
Calcium language interpreter
57 lines • 2.14 kB
JavaScript
import { default as Sym } from "../symbol";
import { evaluate } from "../util";
import { createInt } from ".";
import { AttributeNotFound, TupleIsImmutable } from "../error";
import Slice from "../runtime/slice";
export default function createTuple(...values) {
let tuple = values;
const self = new Proxy({}, {
get(target, property, receiver) {
if (property === Sym.evaluate)
return (env) => {
tuple = tuple.map((v) => evaluate(v, env));
return self;
};
else if (property === Sym.value)
return tuple;
else if (property === Sym.class)
return "tuple";
else if (property === Sym.description) {
return `(${tuple
.map((v) => {
if (Reflect.get(v, Sym.class) === "str") {
return `'${Reflect.get(v, Sym.description)}'`;
}
else {
return Reflect.get(v, Sym.description);
}
})
.join(", ")})`;
}
else if (property === Sym.iter) {
}
else if (property === Sym.len)
return createInt(tuple.length);
else if (property === Sym.slice)
return (lower, upper) => {
const slice = new Slice(tuple);
return createTuple(...slice.get(lower, upper));
};
else if (property === Sym.subscript)
return (index, value) => {
let idx = Reflect.get(index, Sym.value);
if (idx < 0)
idx += tuple.length;
if (value !== undefined) {
throw new TupleIsImmutable();
}
else {
return tuple[idx];
}
};
throw new AttributeNotFound(property.toString());
},
});
return self;
}
//# sourceMappingURL=tuple.js.map