From 450758323afd85e50a520a1b3010261d4d7a1279 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yosbel=20Mar=C3=ADn?= Date: Sat, 9 Dec 2017 18:17:20 -0500 Subject: [PATCH] add pretty print to the repl --- src/cli.js | 2 +- src/compiler.js | 17 +++++++++++------ src/repl.js | 45 +++++++++++++++++++++++++++------------------ src/util.js | 36 ++++++++++++++++++++++++++++++++++++ 4 files changed, 75 insertions(+), 25 deletions(-) diff --git a/src/cli.js b/src/cli.js index dcc772a..2edc1c4 100644 --- a/src/cli.js +++ b/src/cli.js @@ -57,7 +57,7 @@ function dispatch(command, opts) { run(opts) break case 'repl' : - repl.launch(R) + repl.launch({R: R}) break case 'eval' : _eval(opts) diff --git a/src/compiler.js b/src/compiler.js index d676b7b..962cae9 100644 --- a/src/compiler.js +++ b/src/compiler.js @@ -1,4 +1,3 @@ - var nodes = require('./nodes') var util = require('./util') var T = nodes.type @@ -378,6 +377,16 @@ function writeCommonJSStub(ast, ctx) { // write IIFE stub function writeIIFEStub(ctx) { + writeRamdaFunctionAsGlobalStub(ctx) + ctx.writeTop(';(function () {') + + ctx.newLine() + ctx.newLine() + ctx.write('})()') +} + +// write each used Ramda function as if `R` is in the global scope +function writeRamdaFunctionAsGlobalStub(ctx) { ctx.newLineTop() ctx.newLineTop() @@ -385,11 +394,6 @@ function writeIIFEStub(ctx) { ctx.newLineTop() ctx.writeTop('var ' + key + ' = R.' + key) }) - ctx.writeTop(';(function () {') - - ctx.newLine() - ctx.newLine() - ctx.write('})()') } function writeCompilerInfo(ctx) { @@ -417,6 +421,7 @@ exports.astToChunks = function astToChunks(ast, ctx, format) { writeIIFEStub(ctx) break case 'none' : + writeRamdaFunctionAsGlobalStub(ctx) break default : throw '`' + format + '` is not a valid format' diff --git a/src/repl.js b/src/repl.js index 88f3e1c..bbcdddf 100644 --- a/src/repl.js +++ b/src/repl.js @@ -2,32 +2,41 @@ var repl = require('repl') var vm = require('vm') var ram = require('./ramdascript') +var util = require('./util') // launch RamdaScript REPL, external variables can be // added to the context, example: // -// repl.launch(R) +// repl.launch({R: require('ramda')}) // exports.launch = function launch(extCtx) { extCtx = extCtx || {} - + Object.assign(global, extCtx) // launch - repl.start('ram> ', null, _eval) + repl.start({ + prompt : 'ram> ', + eval : _eval, + writer : util.inspect + }) +} - function _eval(code, ctx, file, cb) { - var js - var err - var result - try { - // import passed context - Object.assign(ctx, extCtx) - result = ram.compile(code, { - filename: '' - }) - result = vm.runInContext(result.js, ctx, file) - } catch (e) { - err = e - } - cb(err, result) +function _eval(code, ctx, file, cb) { + var err + var result + var value + var filename = '' + try { + result = ram.compile(code, { + filename: filename, + format: 'none' + }) + value = vm.runInThisContext(result.js, { + filename: filename, + lineOffset: 0, + displayErrors: true + }) + } catch (e) { + err = e } + cb(err, value) } \ No newline at end of file diff --git a/src/util.js b/src/util.js index a8af668..b1d605a 100644 --- a/src/util.js +++ b/src/util.js @@ -101,6 +101,42 @@ exports.isDefVar = function isDefVar(node, varName) { return node.defVars.indexOf(varName) !== -1 } +exports.inspect = function inspect(val, indent) { + indent = R.defaultTo(0, indent) + var indentUnit = ' ' + var indentStr = R.times(R.always(indentUnit), indent).join('') + if (val === void 0) { + return 'void' + } + switch (R.type(val)) { + case 'Null' : + return 'nil' + case 'String' : + return '\'' + val + '\'' + case 'RegExp' : + return '/' + val.source + '/' + val.flags + case 'Date' : + return '(new Date \'' + val.toString() + '\')' + case 'Boolean' : + return val ? 'true' : 'false' + case 'Function' : + return '(func [...])' + case 'Object' : + indent++ + var kv = R.keys(val).map(function(k) { + return indentStr + indentUnit + ':' + k + ' ' + inspect(val[k], indent) + }) + return kv.length ? '{\n' + kv.join('\n') + '\n' + indentStr + '}' : '{}' + case 'Array' : + var arr = val.map(function(item) { + return inspect(item) + }) + return '[' + arr.join(' ') + ']' + + } + return val +} + // format a string using `{}` placeholder // example // u.format('Hello {0}', ['World'])