author | Alan Dipert
<alan@dipert.org> 2020-01-31 08:31:03 UTC |
committer | Alan Dipert
<alan@dipert.org> 2020-01-31 08:31:03 UTC |
parent | 85b3003e68256312fa92f35fffb1ffa265980694 |
jacl.js | +16 | -1 |
diff --git a/jacl.js b/jacl.js index 828778f..06860f8 100644 --- a/jacl.js +++ b/jacl.js @@ -868,7 +868,8 @@ const SPECIAL_FORMS = [ '%TAGBODY', '%GO', '%JS', - '%IF' + '%IF', + '%THROW' ]; for (const s of SPECIAL_FORMS) { @@ -1249,6 +1250,12 @@ const analyzeSpecials = new Map([ node.args = args.map(x => analyze(env.withContext('expr'), node, x)); return node; }], + [JACLPKG.intern('%THROW'), (env, parent, form) => { + const [, obj] = form; + const node = makeNode('throw', { env: env, parent: parent, form: form }); + node.obj = analyze(env.withContext('expr'), node, obj); + return node; + }], [JACLPKG.intern('%LET'), (env, parent, form) => { const [, bindings, ...body] = form; const node = makeNode('let', { @@ -1669,6 +1676,14 @@ const emitNode = (print, node) => { print(')'); if (context !== 'expr') print(';\n'); break; + case 'throw': { + if (context === 'expr') print('(function(){'); + print('throw '); + emitNode(print, node.obj); + print(';'); + if (context === 'expr') print('})()'); + break; + } case 'let': { if (context === 'expr') print('(function()');