author | Alan Dipert
<alan@dipert.org> 2019-11-03 21:44:31 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-11-03 21:44:31 UTC |
parent | a4265923b6b355c4e4136f1d5edd4ad7ad7dce7a |
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;