Skip to content

Commit

Permalink
more cleanup
Browse files Browse the repository at this point in the history
  • Loading branch information
Emmanuel Schanzer committed Sep 16, 2022
1 parent 7cf13a4 commit da81f2e
Show file tree
Hide file tree
Showing 17 changed files with 165 additions and 201 deletions.
15 changes: 13 additions & 2 deletions example/example-page.css
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,7 @@ body {
}

.container .col {
width: 50%;
width: 33%;
padding: 10px;
}

Expand All @@ -20,4 +20,15 @@ body {

.CodeMirror {
box-shadow: 3px 4px 21px -4px rgba(0,0,0,0.75);
}
}


#fullscreenButton {
position: absolute;
bottom: 0;
left: 50%;
transform: translate(-50%, 0px);
}
#output { position: relative; }
main { text-align: center; }
main .error { background: red; padding: 10px; font-family: courier; line-height: 5ex; }
146 changes: 18 additions & 128 deletions example/example.js
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import prettyJS from 'pretty-js'

import { compile } from '../src/wescheme'

import Evaluator from '../src/runtime/mzscheme-vm/evaluator'
import { Runner } from '../src/runtime/mzscheme-vm/evaluator'
import loadProject from '../src/runtime/loadProject'

require('./example.css')
Expand All @@ -22,18 +22,19 @@ var cm2 = CodeMirror.fromTextArea(
)
cm.on('change', function() {
try {
cm2.setValue(prettyJS(compile("TEST PROGRAM", cm.getValue(), true).bytecode.toString()))
const bytecode = prettyJS(compile(cm.getValue(), true).bytecode.toString());
cm2.setValue(bytecode)
} catch (e) {
cm2.setValue("Compilation Error (see console for details)")
if (e instanceof Error) {
throw e
}
cm2.setValue(e)
}
})


cm2.on('change', function() {
try { init(); }
if(cm2.getValue().includes("Compilation Error")) return;
try { runBytecode(); }
catch (e) { throw e; }
});

Expand All @@ -42,130 +43,19 @@ cm.setValue('(triangle 200 "solid" "turquoise")')
///////////////////////////////////////////////////////////////////////////////
// imported from WeScheme war-src/js/run.js

function init(publicId) {

var Runner = function(outputDOMContainer) {
var that = this;
this.outputDOMContainer = outputDOMContainer;
this.evaluator = new Evaluator({
write: function(thing) { that.addToInteractions(thing); },
});
this.evaluator.setImageProxy("/imageProxy");
this.evaluator.setRootLibraryPath("/js/mzscheme-vm/collects");

this.runCompiledCode = function(compiledCode, permStringArray) {
var that = this;
var onSuccessRun = function() { };
var onFailRun = function(exn) { that.renderErrorAsDomNode(exn); };
this.evaluator.executeCompiledProgram((0,eval)('(' + compiledCode + ')'),
onSuccessRun,
onFailRun);
};

this.runSourceCode = function(title, sourceCode, permStringArray) {
var that = this;
var onSuccessRun = function() { console.log('success')};
var onFailRun = function(exn) { that.renderErrorAsDomNode(exn); };
this.evaluator.executeProgram(title, sourceCode, onSuccessRun, onFailRun);
};

this.addToInteractions = function(interactionVal) {

// Returns if x is a dom node.
function isDomNode(x) {
return (x.nodeType != undefined);
}
// Returns if x is a node that should be printed
// Printable Nodes are CANVAS elements, OR non-empty SPANs
function isPrintableNode(x){
return x.nodeName === "CANVAS" || x.childNodes.length > 0;
}

if(!isPrintableNode(interactionVal)){ return;} // make sure there are no other topLevelEvaluationNodes in the outputDOMContainer
while(this.outputDOMContainer.firstChild){
this.outputDOMContainer.removeChild(this.outputDOMContainer.firstChild);
}
if (isDomNode(interactionVal)) {
interactionVal.style.display="inline-block";
interactionVal.classList.add("replOutput"); // simulate the editor REPL, so CSS spacing will kick in
this.outputDOMContainer.append(interactionVal);
} else {
var newArea = document.createElement("div");
newArea.style.width='100%';
newArea.text(interactionVal);
newArea.style.display="inline-block";
this.outputDOMContainer.append(newArea);
}
this.outputDOMContainer.scrollTop = this.outputDOMContainer.scrollHeight;
};

// renderErrorAsDomNode: exception -> element
// Given an exception, produces error dom node to be displayed.
this.renderErrorAsDomNode = function(err) {
var msg = this.evaluator.getMessageFromExn(err);

var dom = document.createElement('div');
dom['class'] = 'moby-error';

var msgDom = document.createElement('div');
msgDom['class'] = 'moby-error:message';
msgDom.appendChild(document.createTextNode(msg));
dom.appendChild(msgDom);

var stacktrace = this.evaluator.getTraceFromExn(err);
for (var i = 0; i < stacktrace.length; i++) {
dom.appendChild(document.createTextNode("at: line " + stacktrace[i].line +
", column " + stacktrace[i].column));
}
return dom;
};
};

function runBytecode(publicId) {
var inter = document.getElementById('interactions');
var runner = new Runner(document.getElementById('interactions'));
var afterLoad = function(aProgram) {

var title = "Test Program", // aProgram.getTitle(),
sourceCode = cm.getValue(), // aProgram.getSourceCode(),
programCode = null, // Set it to null, so that the client-side compiler is invoked.
permissions = null, // aProgram.getPermissions(),
notes = null; // aProgram.getNotes();

var j = document.getElementById('interactions'),
b = document.getElementsByTagName("body")[0];

var toggleFullscreen = function() {
// obtain the element being added
var elem;
if (j.querySelectorAll("canvas").length == 1) { elem = j.querySelectorAll("canvas")[0]; }
else { elem = j[0]; }

// get fullscreen access
if(!document.fullscreenElement) elem.requestFullscreen( Element.ALLOW_KEYBOARD_INPUT );
else document.exitFullscreen();
};
var input = document.createElement("input");
input.type = "button";
input.value = "Run Fullscreen";
input.style = "margin-top: 20px; display: block; margin-left: auto; margin-right: auto";
input.onclick = toggleFullscreen;
b.appendChild(input);

var appendFinishedMsg = function() {
var inter = document.getElementById('interactions');
var finished = document.createElement('span');
finished.id = "finished";
finished.innerHTML = "The program has finished running, but only included definitions (which do not produce any output).";
if(inter.children.length == 0) {
inter.appendChild(finished);
}
};

if (programCode) {
runner.runCompiledCode(programCode, permissions);
} else {
runner.runSourceCode("TEST PROGRAM", sourceCode, permissions);
var reportIfNoOutput = function() {
if(inter.children.length == 0) {
inter.innerHTML = "The program has finished running, but only included definitions (which do not produce any output).";
}
appendFinishedMsg();
};
afterLoad();
try {
runner.runSourceCode(null, cm.getValue(), null); // pass null for permissions and title
} catch(e) {
inter.innerHTML = "<span class='error'>" + e.toString() + "</span>";
} finally {
reportIfNoOutput();
}
}
14 changes: 8 additions & 6 deletions example/index.html
Original file line number Diff line number Diff line change
@@ -1,19 +1,21 @@
<html>
<body>
<h1>wescheme-js</h1>
<h1>WeScheme as a Node Module</h1>
<div class="container">
<div class="col">
<div id="sourcecode" class="col">
<p>Write scheme code here...</p>
<textarea id="code"></textarea>
</div>
<div class="col">
<p>And get compiled javascript here!</p>
<div id="bytecode" class="col">
<p>get compiled bytecode here...</p>
<textarea id="code2"></textarea>
</div>
<div class="col">
<p>And see executed output here!</p>
<div id="output" class="col">
<p>and see output here!</p>
<main id="interactions" role="log" aria-live="assertive"></main>
</div>
</div>

<script src="build/example.js"></script>
</body>
</html>
2 changes: 1 addition & 1 deletion src/compiler.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ import {
} from './structures';
var compiler = require('./compiler');
var jsnums = require('./runtime/js-numbers');
var types = require('./runtime/types');
import types from './runtime/types';

/*
SOMEDAY...but probably never
Expand Down
4 changes: 1 addition & 3 deletions src/lex.js
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
var compiler = require('./structures');
var types = require('./runtime/types');
import types from './runtime/types';
var jsnums = require('./runtime/js-numbers');

/*
Expand Down Expand Up @@ -1026,8 +1026,6 @@ export var lex = function(str, strSource, debug) {
var end = new Date().getTime();
if (debug) {
console.log("Lexed in " + (Math.floor(end - start)) + "ms");
console.log(sexp);
console.log(sexpToString(sexp));
}
return sexp;
};
2 changes: 1 addition & 1 deletion src/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@ import {
throwError,
keywords
} from './structures';
var types = require('./runtime/types');
import types from './runtime/types';
var compiler = require('./compiler');
/*
Expand Down
4 changes: 2 additions & 2 deletions src/runtime/control.js
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
// Control structures

var sys = require('sys');
var types = require('./types');
var types = require('./types').default
import primitive from './primitive'
var types = require('./types');
import state from './state'

var DEBUG_ON = false;

Expand Down
3 changes: 2 additions & 1 deletion src/runtime/helpers.js
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import types from './types'

//////////////////////////////////////////////////////////////

Expand Down Expand Up @@ -622,4 +623,4 @@ var helpers = {};
})();

/////////////////////////////////////////////////////////////////
export default helpers;
export default helpers;
13 changes: 5 additions & 8 deletions src/runtime/interpret.js
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@

// For node.js.
var sys = require('sys');
var types = require('./types');
var types = require('./types').default
import primitive from './primitive'
import loader from './loader';
var assert = require('assert');
import control from './control'
var state = require('./state');
import helpers from './helpers'
var state = require('./state').default;

var DEBUG_ON = false;

Expand Down Expand Up @@ -143,30 +144,25 @@ var run = function(aState, onSuccessK, onFailK) {
if (! onFailK) { onFailK = function(exn) { throw exn; } };

function doRunWork(){
console.log(1);
var gas = MAX_STEPS_BEFORE_BOUNCE;
while( (! aState.isStuck()) && (gas > 0)) {
console.log(2);
step(aState);
gas--;
}
if (aState.breakRequested) {
console.log('breakRequested');
onFailK(types.schemeError(
types.exnBreak("user break",
state.captureCurrentContinuationMarks(aState),
captureContinuationClosure(aState))));
return;
} else if (gas <= 0) {
console.log('pausing for browser thread');
var stateValues = aState.save();
setTimeout(function(){
aState.restore(stateValues);
run(aState, onSuccessK, onFailK);
},
0);
} else {
console.log('done!')
onSuccessK(aState.v);
return;
}
Expand All @@ -184,7 +180,8 @@ var run = function(aState, onSuccessK, onFailK) {
// scheme exception
// If the error is incomplete, finish constructing it
if ( types.isIncompleteExn(e.val) ) {
var contMarks = state.captureCurrentContinuationMarks(aState);
console.log(state)
var contMarks = state.captureCurrentContinuationMarks(aState);
e = types.schemeError(e.val.constructor.apply(null, [e.val.msg, contMarks].concat(e.val.otherArgs) ));
}
onFailK(e);
Expand Down
2 changes: 2 additions & 0 deletions src/runtime/loader.js
Original file line number Diff line number Diff line change
@@ -1,6 +1,8 @@
// Loader: take bytecode and translate to internal format.

import control from './control'
import state from './state'

var sys = require('sys');

var loader = {};
Expand Down
Loading

0 comments on commit da81f2e

Please sign in to comment.