UNPKG

hclang

Version:

Homoiconic C: Programming without a Language

104 lines 7.56 kB
import { FrameAtom } from './frame-atom.js'; import { NilContext } from './meta-frame.js'; export class FrameBlob extends FrameAtom { static fix_source(source) { if (source === '') { return '0' + FrameBlob.BLOB_PREFIX[16] + '0'; } if (source[0] !== '0') { return '0' + source; } return source; } static find_base(source) { const prefix = source.substr(1, 1); const keys = Object.keys(FrameBlob.BLOB_PREFIX); const base = keys.find((k) => FrameBlob.BLOB_PREFIX[parseInt(k, 10)] === prefix); return parseInt(base || '10', 10); } static count_bits(source, base) { const digits = source.substr(2); const length = digits.length; const entropy = Math.log2(base); const bits = length * entropy; return BigInt(bits); } constructor(source) { super(NilContext); source = FrameBlob.fix_source(source); this.data = BigInt(source); this.base = FrameBlob.find_base(source); this.n_bits = FrameBlob.count_bits(source, this.base); } called_by(context, parameter) { if (context instanceof FrameBlob) { const left_operand = context; const result = left_operand.append(this); return result; } return super.called_by(context, parameter); } string_start() { return FrameBlob.BLOB_START; } ; string_prefix() { const sigil = FrameBlob.BLOB_PREFIX[this.base]; return '0' + sigil; } ; canInclude(char) { const regex = FrameBlob.BLOB_DIGITS[64]; // accept everything, to start return regex.test(char); } toString() { const dataString = this.toData().toString(this.base); const pad = this.n_chars() - dataString.length; const digits = '0'.repeat(pad) + dataString; return this.string_prefix() + digits + this.string_suffix(); } toData() { return this.data; } append(right_operand) { const left = BigInt(right_operand.exalt(this)); this.data = left + right_operand.data; this.n_bits = this.n_bits + right_operand.n_bits; return this; } ; exalt(left_operand) { const result = left_operand.shift_left(this.n_bits); return result; } ; shift_left(n_bits) { const bigint_result = this.data << n_bits; return bigint_result; } ; n_chars() { const entropy = Math.log2(this.base); const bits = Number(this.n_bits); const chars = bits / entropy; return Math.ceil(chars); } ; } FrameBlob.BLOB_START = '0'; FrameBlob.BLOB_DIGITS = { 2: /[01]/, 8: /[0-7]/, 16: /[0-9a-fA-F]/, 32: /[0-9a-hj-np-z]/, 64: /[0-9a-zA-Z+/=]/ }; FrameBlob.BLOB_PREFIX = { 2: 'b', 8: 'o', 16: 'x', 32: 't', 64: 's' // 6 }; ; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZnJhbWUtYmxvYi5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9mcmFtZXMvZnJhbWUtYmxvYi50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFFQSxPQUFPLEVBQUUsU0FBUyxFQUFFLE1BQU0saUJBQWlCLENBQUE7QUFDM0MsT0FBTyxFQUFFLFVBQVUsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBVzVDLE1BQU0sT0FBTyxTQUFVLFNBQVEsU0FBUztJQWtCL0IsTUFBTSxDQUFDLFVBQVUsQ0FBRSxNQUFjO1FBQ3RDLElBQUksTUFBTSxLQUFLLEVBQUUsRUFBRTtZQUNqQixPQUFPLEdBQUcsR0FBRyxTQUFTLENBQUMsV0FBVyxDQUFDLEVBQUUsQ0FBQyxHQUFHLEdBQUcsQ0FBQTtTQUM3QztRQUNELElBQUksTUFBTSxDQUFDLENBQUMsQ0FBQyxLQUFLLEdBQUcsRUFBRTtZQUNyQixPQUFPLEdBQUcsR0FBRyxNQUFNLENBQUE7U0FDcEI7UUFDRCxPQUFPLE1BQU0sQ0FBQTtJQUNmLENBQUM7SUFFTSxNQUFNLENBQUMsU0FBUyxDQUFFLE1BQWM7UUFDckMsTUFBTSxNQUFNLEdBQUcsTUFBTSxDQUFDLE1BQU0sQ0FBQyxDQUFDLEVBQUUsQ0FBQyxDQUFDLENBQUE7UUFDbEMsTUFBTSxJQUFJLEdBQUcsTUFBTSxDQUFDLElBQUksQ0FBQyxTQUFTLENBQUMsV0FBVyxDQUFDLENBQUE7UUFDL0MsTUFBTSxJQUFJLEdBQUcsSUFBSSxDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsRUFBRSxFQUFFLENBQUMsU0FBUyxDQUFDLFdBQVcsQ0FBQyxRQUFRLENBQUMsQ0FBQyxFQUFFLEVBQUUsQ0FBQyxDQUFDLEtBQUssTUFBTSxDQUFDLENBQUE7UUFDaEYsT0FBTyxRQUFRLENBQUMsSUFBSSxJQUFJLElBQUksRUFBRSxFQUFFLENBQUMsQ0FBQTtJQUNuQyxDQUFDO0lBRU0sTUFBTSxDQUFDLFVBQVUsQ0FBRSxNQUFjLEVBQUUsSUFBWTtRQUNw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