elisp.js/elisp/repl.js

69 lines
1.6 KiB
JavaScript

////
// Emacs Lisp implementation in JavaScript.
//
// Copyright (c) 2009 Sami Samhuri - sami.samhuri@gmail.com
//
// Released under the terms of the MIT license. See the included file
// LICENSE.
var parser = require('elisp/parser'),
evaluator = require('elisp/evaluator'),
utils = require('elisp/utils'),
Parser = parser.Parser,
Evaluator = evaluator.Evaluator;
// this should probably be renamed to avoid confusion
var eval = function(string) {
var p = new Parser(),
e = new Evaluator();
return e.evalExpressions(p.parse(string));
};
exports.eval = eval;
var parse = function(string) {
var p = new Parser();
return p.parse(string);
};
exports.parse = parse;
var parseOne = function(string) {
return parse(string).car();
};
exports.parseOne = parseOne;
exports.read = parseOne;
exports.pp = utils.pp;
var rep = function(string) {
var p = new Parser(),
e = new Evaluator();
utils.pp(e.eval(p.read(string)));
};
exports.rep = rep;
var repl = function() {
var p = new Parser(),
e = new Evaluator(),
sys = require('system'),
settings = require('elisp/settings');
while (true) {
if (!settings.hidePrompt) {
sys.stdout.print("elisp> "); // i don't want a newline, grrrr
}
try {
var line = sys.stdin.readLine();
while (!line) {
line = sys.stdin.readLine();
}
if (line.substring(0,1).toLowerCase() == 'q') return;
utils.pp(e.eval(p.parseOne(line)));
} catch (x) {
if (x.evalError) {
print('[error] ' + x.message + ': ' + x.expression);
}
else throw(x);
}
}
};
exports.repl = repl;