git » jacl.git » commit 112f6ba

add JACL:%THROW special form

author Alan Dipert
2020-01-31 08:31:03 UTC
committer Alan Dipert
2020-01-31 08:31:03 UTC
parent 85b3003e68256312fa92f35fffb1ffa265980694

add JACL:%THROW special form

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()');