wisp
Version:
Homoiconic JS with clojure syntax, s-expressions & macros
99 lines (98 loc) • 15.7 kB
JavaScript
{
var _ns_ = {
id: 'wisp.wisp',
doc: 'Wisp program that reads wisp code from stdin and prints\n compiled javascript code into stdout'
};
var fs = require('fs');
var createReadStream = fs.createReadStream;
var path = require('path');
var basename = path.basename;
var dirname = path.dirname;
var join = path.join;
var resolve = path.resolve;
var module = require('module');
var Module = module.Module;
var commander = require('commander');
var wisp_package = require('./package');
var version = wisp_package.version;
var wisp_string = require('./string');
var split = wisp_string.split;
var join = wisp_string.join;
var upperCase = wisp_string.upperCase;
var replace = wisp_string.replace;
var wisp_sequence = require('./sequence');
var first = wisp_sequence.first;
var second = wisp_sequence.second;
var last = wisp_sequence.last;
var count = wisp_sequence.count;
var reduce = wisp_sequence.reduce;
var rest = wisp_sequence.rest;
var conj = wisp_sequence.conj;
var partition = wisp_sequence.partition;
var assoc = wisp_sequence.assoc;
var drop = wisp_sequence.drop;
var isEmpty = wisp_sequence.isEmpty;
var wisp_repl = require('./repl');
var startRepl = wisp_repl.start;
var wisp_engine_node = require('./engine/node');
var wisp_runtime = require('./runtime');
var str = wisp_runtime.str;
var subs = wisp_runtime.subs;
var isEqual = wisp_runtime.isEqual;
var isNil = wisp_runtime.isNil;
var wisp_ast = require('./ast');
var prStr = wisp_ast.prStr;
var name = wisp_ast.name;
var wisp_compiler = require('./compiler');
var compile = wisp_compiler.compile;
}
var compileStdin = exports.compileStdin = function compileStdin(options) {
return withStreamContent(process.stdin, compileString, conj({}, options));
};
var compileFile = exports.compileFile = function compileFile(path, options) {
return withStreamContent(createReadStream(path), compileString, conj({ 'source-uri': path }, options));
};
var compileString = exports.compileString = function compileString(source, options) {
return function () {
var channelø1 = (options || 0)['print'] || 'code';
var outputø1 = compile(source, options);
var contentø1 = isEqual(channelø1, 'code') ? (outputø1 || 0)['code'] : isEqual(channelø1, 'expansion') ? (outputø1 || 0)['expansion'] : 'else' ? JSON.stringify((outputø1 || 0)[channelø1], 2, 2) : void 0;
process.stdout.write(contentø1 || 'nil');
return (outputø1 || 0)['error'] ? (function () {
throw outputø1.error;
})() : void 0;
}.call(this);
};
var withStreamContent = exports.withStreamContent = function withStreamContent(input, resume, options) {
return function () {
var contentø1 = '';
input.setEncoding('utf8');
input.resume();
input.on('data', function ($1) {
return contentø1 = '' + contentø1 + $1;
});
return input.once('end', function () {
return resume(contentø1, options);
});
}.call(this);
};
var run = exports.run = function run(path) {
return Module._load(resolve(path), null, true);
};
void 0;
var parseParams = exports.parseParams = function parseParams(params) {
return function () {
var optionsø1 = commander.version(version).usage('[options] <file ...>').option('-r, --run', 'compile and execute the file (same as wisp path/to/file.wisp)').option('-c, --compile', 'compile given file and prints to stdout').option('-i, --interactive', 'run an interactive wisp REPL (same as wisp with no params)').option('--print <format>', 'use custom print output `expansion`,`forms`, `ast`, `js-ast` or (default) `code`', function (x, _) {
return '' + x;
}, 'code').option('--no-map', 'disable source map generation').option('--source-uri <uri>', 'uri input will be associated with in source maps').option('--output-uri <uri>', 'uri output will be associated with in source maps').parse(params);
return conj({ 'no-map': !(optionsø1 || 0)['map'] }, optionsø1);
}.call(this);
};
var main = exports.main = function main() {
return function () {
var optionsø1 = parseParams(process.argv);
var pathø1 = optionsø1.args[0];
return optionsø1.run ? run(pathø1) : !process.stdin.isTTY ? compileStdin(optionsø1) : optionsø1.interactive ? startRepl() : optionsø1.compile ? compileFile(pathø1, optionsø1) : pathø1 ? run(pathø1) : 'else' ? startRepl() : void 0;
}.call(this);
};
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJzb3VyY2VzIjpbImFub255bW91cy53aXNwIl0sIm5hbWVzIjpbIl9uc18iLCJpZCIsImRvYyIsImNyZWF0ZVJlYWRTdHJlYW0iLCJiYXNlbmFtZSIsImRpcm5hbWUiLCJqb2luIiwicmVzb2x2ZSIsIk1vZHVsZSIsInZlcnNpb24iLCJzcGxpdCIsInVwcGVyQ2FzZSIsInJlcGxhY2UiLCJmaXJzdCIsInNlY29uZCIsImxhc3QiLCJjb3VudCIsInJlZHVjZSIsInJlc3QiLCJjb25qIiwicGFydGl0aW9uIiwiYXNzb2MiLCJkcm9wIiwiaXNFbXB0eSIsInN0YXJ0UmVwbCIsInN0YXJ0Iiwic3RyIiwic3VicyIsImlzRXF1YWwiLCJpc05pbCIsInByU3RyIiwibmFtZSIsImNvbXBpbGUiLCJjb21waWxlU3RkaW4iLCJleHBvcnRzIiwib3B0aW9ucyIsIndpdGhTdHJlYW1Db250ZW50IiwicHJvY2VzcyIsInN0ZGluIiwiY29tcGlsZVN0cmluZyIsImNvbXBpbGVGaWxlIiwicGF0aCIsInNvdXJjZSIsImNoYW5uZWzDuDEiLCJvdXRwdXTDuDEiLCJjb250ZW50w7gxIiwiSlNPTiIsInN0cmluZ2lmeSIsInN0ZG91dCIsIndyaXRlIiwiZXJyb3IiLCJpbnB1dCIsInJlc3VtZSIsInNldEVuY29kaW5nIiwib24iLCIkMSIsIm9uY2UiLCJydW4iLCJfbG9hZCIsIm51bGwiLCJwYXJzZVBhcmFtcyIsInBhcmFtcyIsIm9wdGlvbnPDuDEiLCJjb21tYW5kZXIiLCJ1c2FnZSIsIm9wdGlvbiIsIngiLCJfIiwicGFyc2UiLCJtYWluIiwiYXJndiIsInBhdGjDuDEiLCJhcmdzIiwic3RkaW4uaXNUVFkiLCJpbnRlcmFjdGl2ZSJdLCJtYXBwaW5ncyI6IjtJQUFBLElBQUNBLEksR0FBRDtBQUFBLFlBQUFDLEUsRUFBSSxXQUFKO0FBQUEsWUFBQUMsRyxFQUNFLGlHQURGO0FBQUEsVTs7UUFHd0JDLGdCQUFBLEcsR0FBQUEsZ0I7O1FBQ0VDLFFBQUEsRyxLQUFBQSxRO1FBQVNDLE9BQUEsRyxL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SUFBRCxDQUFNLEUsVUFBUyxDLENBQVcyQyxTLE1BQU4sQyxLQUFBLENBQWQsRUFBTixFQUNNQSxTQUROLEVBcEJJO0FBQUEsUyxLQUFOLEMsSUFBQTtBQUFBLEtBRkYsQztBQXlCQSxJQUFNTyxJQUFBLEdBQUFuQyxPQUFBLENBQUFtQyxJQUFBLEdBQU4sU0FBTUEsSUFBTixHQUVFO0FBQUEsZSxZQUFNO0FBQUEsZ0JBQUFQLFMsR0FBU0YsV0FBRCxDQUFjdkIsT0FBQSxDQUFRaUMsSUFBdEIsQ0FBUjtBQUFBLFlBQ0EsSUFBQUMsTSxHQUFXVCxTQUFBLENBQVFVLElBQWQsQ0FBbUIsQ0FBbkIsQ0FBTCxDQURBO0FBQUEsWUFFSixPQUFNVixTQUFBLENBQVFMLEdBQWQsR0FBbUJBLEdBQUQsQ0FBS2MsTUFBTCxDQUFsQixHQUNNLENBQUtsQyxPQUFBLENBQVFvQyxXLEdBQWN4QyxZQUFELENBQWU2QixTQUFmLEMsR0FDMUJBLFNBQUEsQ0FBUVksVyxHQUFhbEQsU0FBRCxFLEdBQ3BCc0MsU0FBQSxDQUFROUIsTyxHQUFTUSxXQUFELENBQWMrQixNQUFkLEVBQW1CVCxTQUFuQixDLEdBQ2hCUyxNLEdBQU1kLEdBQUQsQ0FBS2MsTUFBTCxDLFlBQ0UvQyxTQUFELEUsU0FMWixDQUZJO0FBQUEsUyxLQUFOLEMsSUFBQTtBQUFBLEtBRkYiLCJzb3VyY2VzQ29udGVudCI6WyIobnMgd2lzcC53aXNwXG4gIFwiV2lzcCBwcm9ncmFtIHRoYXQgcmVhZHMgd2lzcCBjb2RlIGZyb20gc3RkaW4gYW5kIHByaW50c1xuICBjb21waWxlZCBqYXZhc2NyaXB0IGNvZGUgaW50byBzdGRvdXRcIlxuICAoOnJlcXVpcmUgW2ZzIDpyZWZlciBbY3JlYXRlUmVhZFN0cmVhbV1dXG4gICAgICAgICAgICBbcGF0aCA6cmVmZXIgW2Jhc2VuYW1lIGRpcm5hbWUgam9pbiByZXNvbHZlXV1cbiAgICAgICAgICAgIFttb2R1bGUgOnJlZmVyIFtNb2R1bGVdXVxuICAgICAgICAgICAgW2NvbW1hbmRlcl1cbiAgICAgICAgICAgIFt3aXNwLnBhY2thZ2UgOnJlZmVyIFt2ZXJzaW9uXV1cblxuICAgICAgICAgICAgW3dpc3Auc3RyaW5nIDpyZWZlciBbc3BsaXQgam9pbiB1cHBlci1jYXNlIHJlcGxhY2VdXVxuICAgICAgICAgICAgW3dpc3Auc2VxdWVuY2UgOnJlZmVyIFtmaXJzdCBzZWNvbmQgbGFzdCBjb3VudCByZWR1Y2UgcmVzdFxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBjb25qIHBhcnRpdGlvbiBhc3NvYyBkcm9wIGVtcHR5P11dXG5cbiAgICAgICAgICAgIFt3aXNwLnJlcGwgOnJlZmVyIFtzdGFydF0gOnJlbmFtZSB7c3RhcnQgc3RhcnQtcmVwbH1dXG4gICAgICAgICAgICBbd2lzcC5lbmdpbmUubm9kZV1cbiAgICAgICAgICAgIFt3aXNwLnJ1bnRpbWUgOnJlZmVyIFtzdHIgc3VicyA9IG5pbD9dXVxuICAgICAgICAgICAgW3dpc3AuYXN0IDpyZWZlciBbcHItc3RyIG5hbWVdXVxuICAgICAgICAgICAgW3dpc3AuY29tcGlsZXIgOnJlZmVyIFtjb21waWxlXV0pKVxuXG4oZGVmbiBjb21waWxlLXN0ZGluXG4gIFtvcHRpb25zXVxuICAod2l0aC1zdHJlYW0tY29udGVudCBwcm9jZXNzLnN0ZGluXG4gICAgICAgICAgICAgICAgICAgICAgIGNvbXBpbGUtc3RyaW5nXG4gICAgICAgICAgICAgICAgICAgICAgIChjb25qIHt9IG9wdGlvbnMpKSlcbjs7IChjb25qIHs6c291cmNlLXVyaSBvcHRpb25zfSkgY2F1c2VzIHNlZ2ZhdWx0IGZvciBzb21lIHJlYXNvblxuXG4oZGVmbiBjb21waWxlLWZpbGVcbiAgW3BhdGggb3B0aW9uc11cbiAgKHdpdGgtc3RyZWFtLWNvbnRlbnQgKGNyZWF0ZVJlYWRTdHJlYW0gcGF0aClcbiAgICAgICAgICAgICAgICAgICAgICAgY29tcGlsZS1zdHJpbmdcbiAgICAgICAgICAgICAgICAgICAgICAgKGNvbmogezpzb3VyY2UtdXJpIHBhdGh9IG9wdGlvbnMpKSlcblxuKGRlZm4gY29tcGlsZS1zdHJpbmdcbiAgW3NvdXJjZSBvcHRpb25zXVxuICAobGV0IFtjaGFubmVsIChvciAoOnByaW50IG9wdGlvbnMpIDpjb2RlKVxuICAgICAgICBvdXRwdXQgKGNvbXBpbGUgc291cmNlIG9wdGlvbnMpXG4gICAgICAgIGNvbnRlbnQgKGNvbmRcbiAgICAgICAgICAgICAgICAgICg9IGNoYW5uZWwgOmNvZGUpICg6Y29kZSBvdXRwdXQpXG4gICAgICAgICAgICAgICAgICAoPSBjaGFubmVsIDpleHBhbnNpb24pICg6ZXhwYW5zaW9uIG91dHB1dClcbiAgICAgICAgICAgICAgICAgIDplbHNlIChKU09OLnN0cmluZ2lmeSAoZ2V0IG91dHB1dCBjaGFubmVsKSAyIDIpKV1cbiAgICAgICgud3JpdGUgcHJvY2Vzcy5zdGRvdXQgKG9yIGNvbnRlbnQgXCJuaWxcIikpXG4gICAgKGlmICg6ZXJyb3Igb3V0cHV0KSAodGhyb3cgKC4tZXJyb3Igb3V0cHV0KSkpKSlcblxuKGRlZm4gd2l0aC1zdHJlYW0tY29udGVudFxuICBbaW5wdXQgcmVzdW1lIG9wdGlvbnNdXG4gIChsZXQgW2NvbnRlbnQgXCJcIl1cbiAgICAoLnNldEVuY29kaW5nIGlucHV0IFwidXRmOFwiKVxuICAgICgucmVzdW1lIGlucHV0KVxuICAgICgub24gaW5wdXQgXCJkYXRhXCIgIyhzZXQhIGNvbnRlbnQgKHN0ciBjb250ZW50ICUpKSlcbiAgICAoLm9uY2UgaW5wdXQgXCJlbmRcIiAoZm4gW10gKHJlc3VtZSBjb250ZW50IG9wdGlvbnMpKSkpKVxuXG5cbihkZWZuIHJ1blxuICBbcGF0aF1cbiAgOzsgTG9hZGluZyBtb2R1bGUgYXMgbWFpbiBvbmUsIHNhbWUgd2F5IGFzIG5vZGVqcyBkb2VzIGl0OlxuICA7OyBodHRwczovL2dpdGh1Yi5jb20vam95ZW50L25vZGUvYmxvYi9tYXN0ZXIvbGliL21vZHVsZS5qcyNMNDg5LTQ5M1xuICAoTW9kdWxlLl9sb2FkIChyZXNvbHZlIHBhdGgpIG51bGwgdHJ1ZSkpXG5cbihkZWZtYWNybyAtPlxuICBbJiBvcGVyYXRpb25zXVxuICAocmVkdWNlXG4gICAoZm4gW2Zvcm0gb3BlcmF0aW9uXVxuICAgICAoY29ucyAoZmlyc3Qgb3BlcmF0aW9uKVxuICAgICAgICAgICAoY29ucyBmb3JtIChyZXN0IG9wZXJhdGlvbikpKSlcbiAgIChmaXJzdCBvcGVyYXRpb25zKVxuICAgKHJlc3Qgb3BlcmF0aW9ucykpKVxuXG4oZGVmbiBwYXJzZS1wYXJhbXNcbiAgW3BhcmFtc11cbiAgKGxldCBbb3B0aW9ucyAoLT4gY29tbWFuZGVyXG4gICAgICAgICAgICAgICAgICAgICgudmVyc2lvbiB2ZXJzaW9uKVxuICAgICAgICAgICAgICAgICAgICAoLnVzYWdlIFwiW29wdGlvbnNdIDxmaWxlIC4uLj5cIilcbiAgICAgICAgICAgICAgICAgICAgKC5vcHRpb24gXCItciwgLS1ydW5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcImNvbXBpbGUgYW5kIGV4ZWN1dGUgdGhlIGZpbGUgKHNhbWUgYXMgd2lzcCBwYXRoL3RvL2ZpbGUud2lzcClcIilcbiAgICAgICAgICAgICAgICAgICAgKC5vcHRpb24gXCItYywgLS1jb21waWxlXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJjb21waWxlIGdpdmVuIGZpbGUgYW5kIHByaW50cyB0byBzdGRvdXRcIilcbiAgICAgICAgICAgICAgICAgICAgKC5vcHRpb24gXCItaSwgLS1pbnRlcmFjdGl2ZVwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwicnVuIGFuIGludGVyYWN0aXZlIHdpc3AgUkVQTCAoc2FtZSBhcyB3aXNwIHdpdGggbm8gcGFyYW1zKVwiKVxuICAgICAgICAgICAgICAgICAgICAoLm9wdGlvbiBcIi0tcHJpbnQgPGZvcm1hdD5cIlxuICAgICAgICAgICAgICAgICAgICAgICAgICAgICBcInVzZSBjdXN0b20gcHJpbnQgb3V0cHV0IGBleHBhbnNpb25gLGBmb3Jtc2AsIGBhc3RgLCBganMtYXN0YCBvciAoZGVmYXVsdCkgYGNvZGVgXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgKGZuIFt4IF9dIChzdHIgeCkpXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwiY29kZVwiKVxuICAgICAgICAgICAgICAgICAgICAoLm9wdGlvbiBcIi0tbm8tbWFwXCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJkaXNhYmxlIHNvdXJjZSBtYXAgZ2VuZXJhdGlvblwiKVxuICAgICAgICAgICAgICAgICAgICAoLm9wdGlvbiBcIi0tc291cmNlLXVyaSA8dXJpPlwiXG4gICAgICAgICAgICAgICAgICAgICAgICAgICAgIFwidXJpIGlucHV0IHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIGluIHNvdXJjZSBtYXBzXCIpXG4gICAgICAgICAgICAgICAgICAgICgub3B0aW9uIFwiLS1vdXRwdXQtdXJpIDx1cmk+XCJcbiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgXCJ1cmkgb3V0cHV0IHdpbGwgYmUgYXNzb2NpYXRlZCB3aXRoIGluIHNvdXJjZSBtYXBzXCIpXG4gICAgICAgICAgICAgICAgICAgICgucGFyc2UgcGFyYW1zKSldXG4gICAgKGNvbmogezpuby1tYXAgKG5vdCAoOm1hcCBvcHRpb25zKSl9XG4gICAgICAgICAgb3B0aW9ucykpKVxuXG4oZGVmbiBtYWluXG4gIFtdXG4gIChsZXQgW29wdGlvbnMgKHBhcnNlLXBhcmFtcyBwcm9jZXNzLmFyZ3YpXG4gICAgICAgIHBhdGggKGFnZXQgb3B0aW9ucy5hcmdzIDApXVxuICAgIChjb25kIG9wdGlvbnMucnVuIChydW4gcGF0aClcbiAgICAgICAgICAobm90IHByb2Nlc3Muc3RkaW4uaXNUVFkpIChjb21waWxlLXN0ZGluIG9wdGlvbnMpXG4gICAgICAgICAgb3B0aW9ucy5pbnRlcmFjdGl2ZSAoc3RhcnQtcmVwbClcbiAgICAgICAgICBvcHRpb25zLmNvbXBpbGUgKGNvbXBpbGUtZmlsZSBwYXRoIG9wdGlvbnMpXG4gICAgICAgICAgcGF0aCAocnVuIHBhdGgpXG4gICAgICAgICAgOmVsc2UgKHN0YXJ0LXJlcGwpKSkpXG4iXX0=