UNPKG

hclang

Version:

Homoiconic C: Programming without a Language

105 lines 8.29 kB
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) { function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); } return new (P || (P = Promise))(function (resolve, reject) { function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } } function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } } function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); } step((generator = generator.apply(thisArg, _arguments || [])).next()); }); }; import chalk from 'chalk'; import { FrameGroup, FrameString } from '../frames.js'; import { version } from '../version.js'; import { EvalPipe } from './eval-pipe.js'; import { Lex } from './lex.js'; import { LexPipe } from './lex-pipe.js'; import { ParsePipe } from './parse-pipe.js'; import { stdin as input, stdout as output } from 'node:process'; import readline from 'node:readline/promises'; export class HCEval { static make_context(env) { const context = {}; Object.entries(env).forEach(([key, value]) => { if (key[0] !== 'n') { context[key] = new FrameString(value || 'undefined'); } }); if (context.DEBUG_ENV) { console.debug('DEBUG_ENV', context); } return context; } static make_pipe(out) { const evaluator = new EvalPipe(out); // evaluate groups into results const parser = new ParsePipe(evaluator, FrameGroup); // parse tokens into groups of expressions const lexer = new LexPipe(parser); // lex characters into tokens return lexer; } static make_prompt(level) { const indent = 2 * (level - 1); const middle = ' '.repeat(indent); return HCEval.EXPECT + middle + HCEval.EXPECT; } constructor(out) { this.out = out; this.pipe = HCEval.make_pipe(this.out); this.lex = this.pipe; } call(input) { if (!input) { return null; } // console.error("HCEval.input", input); const source = new FrameString(input); this.checkInput(input); const result = source.reduce(this.lex); // console.error("HCEval.result", result); this.lex = (result instanceof Lex) ? result : this.pipe; return result; } repl() { return __awaiter(this, void 0, void 0, function* () { console.log(chalk.green('.hc ' + version + ';')); let status = true; while (status) { const input = yield this.getInput(); if (!input) { status = false; break; } this.call(input); } return status; }); } getInput() { return __awaiter(this, void 0, void 0, function* () { let prefix = HCEval.SOURCE; if (this.pipe.level > 0) { prefix = HCEval.make_prompt(this.pipe.level); } const rlp = readline.createInterface({ input, output }); const answer = yield rlp.question(chalk.grey(prefix)); rlp.close(); return answer; }); } checkInput(input) { const head = input.substr(0, 2); const tail = input.substr(2); const value = new FrameString(tail); switch (head) { case HCEval.SOURCE: { this.out.set(HCEval.SOURCE, value); break; } case HCEval.EXPECT: { this.out.set(HCEval.EXPECT, value); break; } } } } HCEval.SOURCE = '; '; HCEval.EXPECT = '# '; //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaGMtZXZhbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9leGVjdXRlL2hjLWV2YWwudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6Ijs7Ozs7Ozs7O0FBQUEsT0FBTyxLQUFLLE1BQU0sT0FBTyxDQUFBO0FBQ3pCLE9BQU8sRUFBa0IsVUFBVSxFQUFFLFdBQVcsRUFBRSxNQUFNLGNBQWMsQ0FBQTtBQUN0RSxPQUFPLEVBQUUsT0FBTyxFQUFFLE1BQU0sZUFBZSxDQUFBO0FBQ3ZDLE9BQU8sRUFBRSxRQUFRLEVBQUUsTUFBTSxnQkFBZ0IsQ0FBQTtBQUN6QyxPQUFPLEVBQUUsR0FBRyxFQUFFLE1BQU0sVUFBVSxDQUFBO0FBQzlCLE9BQU8sRUFBRSxPQUFPLEVBQUUsTUFBTSxlQUFlLENBQUE7QUFDdkMsT0FBTyxFQUFFLFNBQVMsRUFBRSxNQUFNLGlCQUFpQixDQUFBO0FBQzNDLE9BQU8sRUFBRSxLQUFLLElBQUksS0FBSyxFQUFFLE1BQU0sSUFBSSxNQUFNLEVBQUUsTUFBTSxjQUFjLENBQUE7QUFDL0QsT0FBTyxRQUFRLE1BQU0sd0JBQXdCLENBQUE7QUFLN0MsTUFBTSxPQUFPLE1BQU07SUFJVixNQUFNLENBQUMsWUFBWSxDQUFFLEdBQWdCO1FBQzFDLE1BQU0sT0FBTyxHQUFZLEVBQUUsQ0FBQTtRQUMzQixNQUFNLENBQUMsT0FBTyxDQUFDLEdBQUcsQ0FBQyxDQUFDLE9BQU8sQ0FBQyxDQUFDLENBQUMsR0FBRyxFQUFFLEtBQUssQ0FBQyxFQUFFLEVBQUU7WUFDM0MsSUFBSSxHQUFHLENBQUMsQ0FBQyxDQUFDLEtBQUssR0FBRyxFQUFFO2dCQUNsQixPQUFPLENBQUMsR0FBRyxDQUFDLEdBQUcsSUFBSSxXQUFXLENBQUMsS0FBSyxJQUFJLFdBQVcsQ0FBQyxDQUFBO2FBQ3JEO1FBQ0gsQ0FBQyxDQUFDLENBQUE7UUFDRixJQUFJLE9BQU8sQ0FBQyxTQUFTLEVBQUU7WUFDckIsT0FBTyxDQUFDLEtBQUssQ0FBQyxXQUFX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