hclang
Version:
Homoiconic C: Programming without a Language
105 lines • 8.29 kB
JavaScript
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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