hclang
Version:
Homoiconic C: Programming without a Language
83 lines • 5.74 kB
JavaScript
import { Frame } from './frame.js';
export const NilContext = {};
export class MetaFrame {
constructor(meta = NilContext, _isNil = false) {
this.meta = meta;
this.up = Frame.missing;
const name = this.constructor.name;
const id = name + '.' + MetaFrame.id_count++;
this.id = '$:' + id;
}
get_here(key, _origin = this) {
const exact = this.meta[key];
if (exact != null) {
return exact;
}
;
return this.match_here(key);
}
get(key, origin = this) {
const result = this.get_here(key, origin);
if (!result.is.missing) {
return result;
}
;
let parent = this.up || Frame.globals;
if (parent.is.missing) {
if (Frame.globals.is.missing) {
return Frame.missing;
}
;
parent = Frame.globals;
}
return parent.get(key, origin);
}
set(key, value) {
if (this.meta === NilContext) {
this.meta = {};
}
this.meta[key] = value;
return this;
}
meta_copy() {
return Object.assign({}, this.meta);
}
meta_keys() {
return Object.keys(this.meta);
}
meta_length() {
return this.meta_keys().length;
}
meta_pairs() {
return Object.entries(this.meta);
}
meta_string() {
return this.meta_pairs().map(([key, value]) => {
if (key === Frame.kOUT) {
return `.${key} ${value.id};`;
}
else {
return `.${key} ${value};`;
}
}).join(' ');
}
match_here(target) {
let result = Frame.missing;
this.meta_pairs().forEach(([key, value]) => {
const isPattern = key.match(/\/(.*)\//);
if (isPattern) {
const pattern = new RegExp(isPattern[1]);
if (pattern.test(target)) {
result = value;
if (result.hasOwnProperty('source')) {
const sourced = result;
sourced.source = target;
}
}
}
});
return result;
}
}
MetaFrame.id_count = 0;
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWV0YS1mcmFtZS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcmFtZXMvbWV0YS1mcmFtZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEVBQUUsS0FBSyxFQUFFLE1BQU0sWUFBWSxDQUFBO0FBT2xDLE1BQU0sQ0FBQyxNQUFNLFVBQVUsR0FBWSxFQUFFLENBQUE7QUFJckMsTUFBTSxPQUFPLFNBQVM7SUFLcEIsWUFBb0IsT0FBTyxVQUFVLEVBQUUsTUFBTSxHQUFHLEtBQUs7UUFBakMsU0FBSSxHQUFKLElBQUksQ0FBYTtRQUg5QixPQUFFLEdBQVUsS0FBSyxDQUFDLE9BQU8sQ0FBQTtRQUk5QixNQUFNLElBQUksR0FBRyxJQUFJLENBQUMsV0FBVyxDQUFDLElBQUksQ0FBQTtRQUNsQyxNQUFNLEVBQUUsR0FBRyxJQUFJLEdBQUcsR0FBRyxHQUFHLFNBQVMsQ0FBQyxRQUFRLEVBQUUsQ0FBQTtRQUM1QyxJQUFJLENBQUMsRUFBRSxHQUFHLElBQUksR0FBRyxFQUFFLENBQUE7SUFDckIsQ0FBQztJQUVNLFFBQVEsQ0FBRSxHQUFXLEVBQUUsVUFBcUIsSUFBSTtRQUNyRCxNQUFNLEtBQUssR0FBRyxJQUFJLENBQUMsSUFBSSxDQUFDLEdBQUcsQ0FBQyxDQUFBO1FBQzVCLElBQUksS0FBSyxJQUFJLElBQUksRUFBRTtZQUNqQixPQUFPLEtBQUssQ0FBQTtTQUNiO1FBQUEsQ0FBQztRQUNGLE9BQU8sSUFBSSxDQUFDLFVBQVUsQ0FBQyxHQUFHLENBQUMsQ0FBQTtJQUM3QixDQUFDO0lBRU0sR0FBRyxDQUFFLEdBQVcsRUFBRSxTQUFvQixJQUFJO1FBQy9DLE1BQU0sTUFBTSxHQUFHLElBQUksQ0FBQyxRQUFRLENBQUMsR0FBRyxFQUFFLE1BQU0sQ0FBQyxDQUFBO1FBQ3pDLElBQUksQ0FBQyxNQUFNLENBQUMsRUFBRSxDQUFDLE9BQU8sRUFBRTtZQUN0QixPQUFPLE1BQU0sQ0FBQTtTQUNkO1FBQUEsQ0FB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