Get basic REPL loop working
This commit is contained in:
parent
030094045a
commit
aafa74e7bc
@ -47,7 +47,7 @@ class Reader {
|
|||||||
*/
|
*/
|
||||||
class Wordifier {
|
class Wordifier {
|
||||||
constructor(str) {
|
constructor(str) {
|
||||||
this.reader = new Reader(prog);
|
this.reader = new Reader(str);
|
||||||
this.tokens = [];
|
this.tokens = [];
|
||||||
}
|
}
|
||||||
wordify() {
|
wordify() {
|
||||||
@ -623,7 +623,7 @@ class Environment {
|
|||||||
}
|
}
|
||||||
case N.PrintExpr: {
|
case N.PrintExpr: {
|
||||||
const val = this.eval(node.val);
|
const val = this.eval(node.val);
|
||||||
Runtime.print(val);
|
this.runtime.print(val);
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
const prog = `
|
const PROG_DEFAULT = `
|
||||||
DISCOVER HOW TO factorial WITH n
|
DISCOVER HOW TO factorial WITH n
|
||||||
WE SAID
|
WE SAID
|
||||||
WHAT IF n IS ACTUALLY 0
|
WHAT IF n IS ACTUALLY 0
|
||||||
@ -14,24 +14,7 @@ EXPERTS CLAIM result TO BE factorial OF 10
|
|||||||
YOU WON'T WANT TO MISS 'RESULT IS'
|
YOU WON'T WANT TO MISS 'RESULT IS'
|
||||||
YOU WON'T WANT TO MISS result
|
YOU WON'T WANT TO MISS result
|
||||||
|
|
||||||
PLEASE LIKE AND SUBSCRIBE
|
PLEASE LIKE AND SUBSCRIBE`;
|
||||||
`;
|
|
||||||
|
|
||||||
const Runtime = {
|
|
||||||
print(s) {
|
|
||||||
console.log(s.toString());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// main
|
|
||||||
try {
|
|
||||||
const tokens = tokenize(prog);
|
|
||||||
const nodes = new Parser(tokens).parse();
|
|
||||||
const env = new Environment(Runtime);
|
|
||||||
env.run(nodes);
|
|
||||||
} catch (e) {
|
|
||||||
console.error(e);
|
|
||||||
}
|
|
||||||
|
|
||||||
const {
|
const {
|
||||||
Component,
|
Component,
|
||||||
@ -39,18 +22,67 @@ const {
|
|||||||
|
|
||||||
class Editor extends Component {
|
class Editor extends Component {
|
||||||
init() {
|
init() {
|
||||||
this.val = '';
|
this.prog = PROG_DEFAULT;
|
||||||
|
// script appends to it
|
||||||
|
this.output = '';
|
||||||
|
this.errors = '';
|
||||||
|
|
||||||
|
this.handleRun = () => this.eval();
|
||||||
|
this.handleInput = evt => {
|
||||||
|
this.prog = evt.target.value;
|
||||||
|
this.render();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
eval() {
|
||||||
|
this.output = '';
|
||||||
|
try {
|
||||||
|
const tokens = tokenize(this.prog);
|
||||||
|
const nodes = new Parser(tokens).parse();
|
||||||
|
const env = new Environment({
|
||||||
|
print: s => {
|
||||||
|
this.output += s.toString();
|
||||||
|
this.render();
|
||||||
|
},
|
||||||
|
});
|
||||||
|
env.run(nodes);
|
||||||
|
} catch (e) {
|
||||||
|
this.errors = e.toString();
|
||||||
|
}
|
||||||
|
this.render();
|
||||||
}
|
}
|
||||||
compose() {
|
compose() {
|
||||||
|
return jdom`<div class="editor fixed block">
|
||||||
|
<div class="controls">
|
||||||
|
<button class="accent block"
|
||||||
|
onclick=${this.handleRun}>Run!</button>
|
||||||
|
</div>
|
||||||
|
<div class="code">
|
||||||
|
<textarea cols="30" rows="10"
|
||||||
|
value=${this.prog}
|
||||||
|
oninput=${this.handleInput}>
|
||||||
|
</textarea>
|
||||||
|
</div>
|
||||||
|
<div class="result">
|
||||||
|
<div class="output">
|
||||||
|
${this.output.split('\n').map(line => jdom`<code>${line}</code>`)}
|
||||||
|
</div>
|
||||||
|
<div class="errors">
|
||||||
|
${this.errors.split('\n').map(line => jdom`<code>${line}</code>`)}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</div>`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class App extends Component {
|
class App extends Component {
|
||||||
|
init() {
|
||||||
|
this.editor = new Editor();
|
||||||
|
}
|
||||||
compose() {
|
compose() {
|
||||||
return jdom`<main>
|
return jdom`<main>
|
||||||
<h1>Tabloid</h1>
|
<h1>Tabloid</h1>
|
||||||
<p class="subtitle">The Clickbait Headline Programming Language</p>
|
<p class="subtitle">The Clickbait Headline Programming Language</p>
|
||||||
|
${this.editor.node}
|
||||||
</main>`;
|
</main>`;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user