From 2be6a6095f80b8dc2bed80b0b9ed9936233194d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jens=20M=C3=B6nig?= Date: Tue, 1 Mar 2022 15:39:32 +0100 Subject: [PATCH] adapted formula editor for variadic infix reporters --- HISTORY.md | 1 + src/objects.js | 23 +++++++++++++++-------- 2 files changed, 16 insertions(+), 8 deletions(-) diff --git a/HISTORY.md b/HISTORY.md index 41cf1608..6a905c81 100755 --- a/HISTORY.md +++ b/HISTORY.md @@ -15,6 +15,7 @@ * blocks: refactored adding and removing inputs in variadic slots * blocks: adjusted inserting / deleting single inputs in variadic infix slots * objects: adjusted block-search-bar for variadic infix reporters +* objects: adapted formula editor for variadic infix reporters ### 2022-02-28 * blocks, objects, threads, store: made addition reporter variadic diff --git a/src/objects.js b/src/objects.js index 0596afa1..0201c4e9 100644 --- a/src/objects.js +++ b/src/objects.js @@ -3634,7 +3634,7 @@ SpriteMorph.prototype.reporterize = function (expressionString) { var ast; function parseInfix(expression, operator, already) { - // very basic diadic infix parser for arithmetic expressions + // very basic dyadic infix parser for arithmetic expressions // with strict left-to-right operator precedence (as in Smalltalk) // which can be overriden by - nested - parentheses. // assumes well-formed expressions, no graceful error handling yet. @@ -3723,13 +3723,13 @@ SpriteMorph.prototype.reporterize = function (expressionString) { } function blockFromAST(ast) { - var block, selectors, monads, alias, key, sel, i, inps, + var block, target, selectors, monads, alias, key, sel, i, inps, off = 1, reverseDict = {}; selectors = { - '+': 'reportSum', + '+': 'reportVariadicSum', '-': 'reportDifference', - '*': 'reportProduct', + '*': 'reportVariadicProduct', '/': 'reportQuotient', '%': 'reportModulus', '^': 'reportPower', @@ -3763,18 +3763,24 @@ SpriteMorph.prototype.reporterize = function (expressionString) { inps[0].setContents([key]); off = 0; } + target = block; // +++ } else { // dyadic block = SpriteMorph.prototype.blockForSelector(selectors[key]); - inps = block.inputs(); + target = block; + inps = block.inputs(); // +++++ + if (inps[0] instanceof MultiArgMorph) { // infix sum or product + target = inps[0]; + inps = target.inputs(); + } } for (i = 1; i < ast.length; i += 1) { if (ast[i] instanceof Array) { - block.replaceInput(inps[i - off], blockFromAST(ast[i])); + target.replaceInput(inps[i - off], blockFromAST(ast[i])); // +++ } else if (isString(ast[i])) { if (contains( ['true', 'false'], reverseDict[ast[i]] || ast[i]) ) { - block.replaceInput( + target.replaceInput( // +++ inps[i - off], SpriteMorph.prototype.blockForSelector( (reverseDict[ast[i]] || ast[i]) === 'true' ? @@ -3782,7 +3788,7 @@ SpriteMorph.prototype.reporterize = function (expressionString) { ) ); } else if (ast[i] !== '_') { - block.replaceInput( + target.replaceInput( // +++ inps[i - off], SpriteMorph.prototype.variableBlock(ast[i]) ); @@ -3791,6 +3797,7 @@ SpriteMorph.prototype.reporterize = function (expressionString) { inps[i - off].setContents(ast[i]); } } + target.fixLayout(); block.isDraggable = true; block.fixLayout(); block.fixBlockColor(null, true);