git » jacl.git » commit 7ab8866

&optional is go!

author Alan Dipert
2019-11-03 21:44:31 UTC
committer Alan Dipert
2019-11-03 21:44:31 UTC
parent a4265923b6b355c4e4136f1d5edd4ad7ad7dce7a

&optional is go!

jacl.js +32 -10

diff --git a/jacl.js b/jacl.js
index b6f376a..dc45d26 100644
--- a/jacl.js
+++ b/jacl.js
@@ -1458,18 +1458,40 @@ const emitNode = (print, node) => {
           print(`if (arguments.length > ${max}) throw new Error('Called with too many arguments: ' + arguments.length);\n`);
         }
       }
-      // Speculatively bind &optional svars to true
-      if (node.lambdaList.optionalSvars.length) {
-        print('var ');
-        for (let i = 0; i < node.lambdaList.optionalSvars.length; i++) {
-          const svar = node.lambdaList.optionalSvars[i];
-          print(mungeSym(svar, 'local'));
-          print('=true');
-          if (i < node.lambdaList.optionalSvars.length-1) print(',');
+      // &optional stuff
+      if (node.lambdaList.optional.length) {
+        // Speculatively bind &optional svars to true
+        if (node.lambdaList.optionalSvars.length) {
+          print('var ');
+          for (let i = 0; i < node.lambdaList.optionalSvars.length; i++) {
+            const svar = node.lambdaList.optionalSvars[i];
+            print(mungeSym(svar, 'local'));
+            print('=true');
+            if (i < node.lambdaList.optionalSvars.length-1) print(',');
+          }
+          print(';\n');
+        }
+        print('switch(arguments.length){\n');
+        for (let i = 0; i < node.lambdaList.optional.length; i++) {
+          const ospec = node.lambdaList.optional[i];
+          print(`case ${min+i}:\n`);
+          print(mungeSym(ospec.name, 'local'));
+          print('=');
+          if (ospec.initform === UNDEFINED) {
+            print('null');
+          } else {
+            emitNode(print, ospec.initform);
+          }
+          print(';\n');
+          if (ospec.svar !== UNDEFINED) {
+            print(mungeSym(ospec.svar, 'local'));
+            print('=false;\n');
+          }
         }
-        print(';\n');
+        print('default:\n');
+        print('break;\n');
+        print('}\n');
       }
-      // TODO Initialize &optionals and set svars depending on arg len
       emitBlock(print, node.statements, node.ret);
       print('})');
       break;