author | Alan Dipert
<alan@dipert.org> 2019-11-15 23:59:27 UTC |
committer | Alan Dipert
<alan@dipert.org> 2019-11-15 23:59:27 UTC |
parent | c1eb11df4b19633daab5724e4da2661bd80904c4 |
jacl.js | +31 | -31 |
diff --git a/jacl.js b/jacl.js index 988d906..d73b76f 100644 --- a/jacl.js +++ b/jacl.js @@ -862,13 +862,13 @@ const makeNode = (op, ...objs) => merge({ op: op }, ...objs); const analyzeBlock = (env, parent, forms) => { let stmts = forms.slice(0, forms.length-1) - .map(x => analyze(env.withContext('statement'), parent, x)), + .map(x => analyze(env.withContext('stmt'), parent, x)), ret; if (forms.length <= 1) { - ret = analyze(env.withContext(env.context === 'statement' ? 'statement' : 'return'), parent, forms.length ? forms[0] : null); + ret = analyze(env.withContext(env.context === 'stmt' ? 'stmt' : 'return'), parent, forms.length ? forms[0] : null); } else { ret = analyze( - env.withContext(env.context === 'statement' ? 'statement' : 'return'), + env.withContext(env.context === 'stmt' ? 'stmt' : 'return'), parent, forms.slice(forms.length-1)[0] ) @@ -1104,20 +1104,20 @@ const analyzeSpecials = new Map([ form: form, field: field instanceof LispSymbol ? field.name : field.toString() }); - node.target = analyze(env.withContext('sval'), node, target); + node.target = analyze(env.withContext('expr'), node, target); return node; }], [JACLPKG.intern('%CALL'), (env, parent, form) => { const [, func, ...args] = form; const node = makeNode('call', { env: env, parent: parent, form: form }); - node.f = analyze(env.withContext('sval'), node, func); - node.args = args.map(analyze.bind(null, env.withContext('sval'), node)) + node.f = analyze(env.withContext('expr'), node, func); + node.args = args.map(analyze.bind(null, env.withContext('expr'), node)) return node; }], [JACLPKG.intern('%LAMBDA'), (env, parent, form) => { const [, list, ...body] = form; const node = makeNode('lambda', { env: env, parent: parent, form: form }); - const { lambdaList, bodyEnv } = analyzeLambdaList(env.withContext('sval'), node, list); + const { lambdaList, bodyEnv } = analyzeLambdaList(env.withContext('expr'), node, list); node.lambdaList = lambdaList; return merge( node, @@ -1133,7 +1133,7 @@ const analyzeSpecials = new Map([ throw new Error(`%JS wrong number of arguments`); const node = makeNode('js', { env: env, parent: parent, form: form }); - node.args = args.map(x => analyze(env.withContext('sval'), node, x)); + node.args = args.map(x => analyze(env.withContext('expr'), node, x)); node.template = templateStr; return node; }], @@ -1145,7 +1145,7 @@ const analyzeSpecials = new Map([ form: form }); node.bindings = Cons.toArray(bindings).map(([name, expr]) => { - return [name, analyze(env.withContext('sval'), node, expr)]; + return [name, analyze(env.withContext('expr'), node, expr)]; }); return merge( node, @@ -1157,7 +1157,7 @@ const analyzeSpecials = new Map([ if (!(target instanceof LispSymbol)) throw new Error(`Can't assign to non-symbol`); - const valExpr = analyze(env.withContext('sval'), null, val); + const valExpr = analyze(env.withContext('expr'), null, val); let op; @@ -1207,7 +1207,7 @@ const analyzeSpecials = new Map([ }); const childEnv = env - .withContext('statement') + .withContext('stmt') .withTags(node.id, Array.from(tags.keys()).filter(x => x !== null)); // Second pass: analyze statements @@ -1241,7 +1241,7 @@ const analyzeSpecials = new Map([ [JACLPKG.intern('%IF'), (env, parent, form) => { if ([...form].length < 4) throw new Error(`IF requires at least 3 args`); const [, pred, expr0, expr1] = form; - const testNode = analyze(env.withContext('sval'), null, pred), + const testNode = analyze(env.withContext('expr'), null, pred), thenNode = analyze(env, null, expr0), elseNode = analyze(env, null, expr1); const node = makeNode('if', { @@ -1261,12 +1261,12 @@ const analyzeSpecials = new Map([ const parseCall = (env, parent, form) => { const [func, ...args] = form; let node = makeNode('call', { env: env, parent: parent, form: form }); - node.args = args.map(analyze.bind(null, env.withContext('sval'), node)); + node.args = args.map(analyze.bind(null, env.withContext('expr'), node)); if (isLambdaForm(func)) { - node.f = analyze(env.withContext('sval'), parent, func); + node.f = analyze(env.withContext('expr'), parent, func); } else if (func instanceof LispSymbol) { node.f = makeNode('global', { - env: env.withContext('sval'), + env: env.withContext('expr'), parent: node, form: func, slot: 'function' @@ -1322,7 +1322,7 @@ class Env { env.locals = new Set(); // sym => tagbodyName env.tags = new Map(); - env.context = 'sval'; + env.context = 'expr'; env.counter = makeCounter(); return env; } @@ -1435,23 +1435,23 @@ const emitNode = (print, node) => { case 'js-var': if (context === 'return') print('return '); print(node.name); - if (context !== 'sval') print(';\n'); + if (context !== 'expr') print(';\n'); break; case 'js-field': if (context === 'return') print('return '); emitNode(print, node.target); print(`.${node.field}`); - if (context !== 'sval') print(';\n'); + if (context !== 'expr') print(';\n'); break; case 'constant': if (context === 'return') print('return '); print(constantCode(form)); - if (context !== 'sval') print(';\n'); + if (context !== 'expr') print(';\n'); break; case 'local': if (context === 'return') print('return '); print(mungeSym(form, 'local')); - if (context !== 'sval') print(';\n'); + if (context !== 'expr') print(';\n'); break; case 'global': if (context === 'return') print('return '); @@ -1467,13 +1467,13 @@ const emitNode = (print, node) => { throw new Error(`Unknown global slot: ${node.slot}`); } } - if (context !== 'sval') print(';\n'); + if (context !== 'expr') print(';\n'); break; case 'set-global': if (context === 'return') print('return '); print(`Package.get('${escapeSingle(node.targetSym.packageName)}').intern('${escapeSingle(node.targetSym.name)}').value=`); emitNode(print, node.val); - if (context !== 'sval') print(';\n'); + if (context !== 'expr') print(';\n'); break; break; case 'set-local': @@ -1481,7 +1481,7 @@ const emitNode = (print, node) => { print(mungeSym(node.targetSym, 'local')) print('='); emitNode(print, node.val); - if (context !== 'sval') print(';\n'); + if (context !== 'expr') print(';\n'); break; case 'js': if (context === 'return') print('return '); @@ -1500,10 +1500,10 @@ const emitNode = (print, node) => { } else { print(node.template); } - if (context !== 'sval') print(';\n'); + if (context !== 'expr') print(';\n'); break; case 'let': - if (context === 'sval') print('(function()'); + if (context === 'expr') print('(function()'); print('{'); if (node.bindings.length) print('var '); for (let i = 0; i < node.bindings.length; i++) { @@ -1516,7 +1516,7 @@ const emitNode = (print, node) => { if (node.bindings.length) print(';'); emitBlock(print, node.statements, node.ret); print('}'); - if (context === 'sval') print(')()'); + if (context === 'expr') print(')()'); break; case 'lambda': { print('(function('); @@ -1670,10 +1670,10 @@ const emitNode = (print, node) => { if (i < node.args.length-1) print(','); }); print(')'); - if (context !== 'sval') print(';\n'); + if (context !== 'expr') print(';\n'); break; case 'if': - if (context === 'sval' || context === 'return') { + if (context === 'expr' || context === 'return') { print('('); emitNode(print, node.testNode); print('!==null)?') @@ -1693,7 +1693,7 @@ const emitNode = (print, node) => { break; case 'tagbody': { if (context === 'return') print('return '); - if (context === 'sval' || context === 'return') { + if (context === 'expr' || context === 'return') { throw new Error('TODO tagbody IIFE'); } else { for (const stmt of node.prelude) { @@ -1713,11 +1713,11 @@ const emitNode = (print, node) => { print('}\n'); } } - //if (context !== 'sval') print(';\n'); + //if (context !== 'expr') print(';\n'); break; } case 'go': { if (context === 'return') print('return '); - if (context === 'sval' || context === 'return') { + if (context === 'expr' || context === 'return') { throw new Error('TODO go IIFE'); } else { print('{\n');