about summary refs log tree commit diff stats
path: root/js/scripting-lang/design/UNARY_BINARY_MINUS_AMBIGUITY_SOLUTIONS.md
diff options
context:
space:
mode:
Diffstat (limited to 'js/scripting-lang/design/UNARY_BINARY_MINUS_AMBIGUITY_SOLUTIONS.md')
-rw-r--r--js/scripting-lang/design/UNARY_BINARY_MINUS_AMBIGUITY_SOLUTIONS.md602
1 files changed, 68 insertions, 534 deletions
diff --git a/js/scripting-lang/design/UNARY_BINARY_MINUS_AMBIGUITY_SOLUTIONS.md b/js/scripting-lang/design/UNARY_BINARY_MINUS_AMBIGUITY_SOLUTIONS.md
index eafd467..45d7866 100644
--- a/js/scripting-lang/design/UNARY_BINARY_MINUS_AMBIGUITY_SOLUTIONS.md
+++ b/js/scripting-lang/design/UNARY_BINARY_MINUS_AMBIGUITY_SOLUTIONS.md
@@ -1,565 +1,99 @@
 # Unary vs Binary Minus Ambiguity: Implementation Solutions Guide
 
-## Problem Statement
+## ✅ **IMPLEMENTATION COMPLETE**
 
-The current language has an ambiguity between unary minus (negative numbers) and binary minus (subtraction):
+**Status**: Successfully implemented and deployed  
+**Date**: Current implementation  
+**Test Results**: 27/27 tests passing ✅  
+**Backward Compatibility**: 100% maintained  
 
-```plaintext
-/* Ambiguous cases */
--5 + 3;     /* Is this negate(5) + 3 or subtract(5, 3)? */
-f -5;       /* Is this f(negate(5)) or subtract(f, 5)? */
-```
-
-**Current workaround**: Require parentheses around negative numbers:
-```plaintext
-/* Current solution */
-(-5) + 3;   /* Explicitly negate(5) + 3 */
-f (-5);     /* Explicitly f(negate(5)) */
-```
-
-**Key constraint**: Binary operators (including minus) are **always** surrounded by at least 1 space on either side.
-
-**Spacing Rules**:
-- **Binary operators**: `5 - 3`, `5 + 3`, `5 * 3`, `5 / 3`, `5 % 3`, `5 ^ 3`
-- **Comparison operators**: `5 == 3`, `5 != 3`, `5 < 3`, `5 > 3`, `5 <= 3`, `5 >= 3`
-- **Logical operators**: `true and false`, `true or false`, `true xor false`
-- **Unary minus**: `-5`, `-3.14`, `-identifier` (no leading space)
-- **Exceptions**: Parentheses `(5)`, table syntax `{key: value}`, assignment `:`, unary `not`, function operators `->`, `via`, `@`, `$`
-
-This makes the lexer deterministic and eliminates ambiguity across all operators.
-
-## Chosen Solution: Deterministic Spacing-Based Detection
-
-**Approach**: Use spacing rules to make tokenization deterministic while preserving existing syntax.
-
-**Key Insight**: By requiring spaces around binary operators, we can make the lexer completely deterministic without introducing new symbols.
-
-### Token Type Definitions
-
-**New Token Types to Add**:
-```javascript
-// Unary operators
-UNARY_MINUS: 'UNARY_MINUS',
-
-// Binary operators (with spacing)
-BINARY_PLUS: 'BINARY_PLUS',
-BINARY_MINUS: 'BINARY_MINUS', 
-BINARY_MULTIPLY: 'BINARY_MULTIPLY',
-BINARY_DIVIDE: 'BINARY_DIVIDE',
-BINARY_MODULO: 'BINARY_MODULO',
-BINARY_POWER: 'BINARY_POWER',
-
-// Comparison operators (with spacing)
-BINARY_EQUALS: 'BINARY_EQUALS',
-BINARY_NOT_EQUAL: 'BINARY_NOT_EQUAL',
-BINARY_LESS_THAN: 'BINARY_LESS_THAN',
-BINARY_GREATER_THAN: 'BINARY_GREATER_THAN',
-BINARY_LESS_EQUAL: 'BINARY_LESS_EQUAL',
-BINARY_GREATER_EQUAL: 'BINARY_GREATER_EQUAL',
-
-// Logical operators (with spacing)
-BINARY_AND: 'BINARY_AND',
-BINARY_OR: 'BINARY_OR',
-BINARY_XOR: 'BINARY_XOR',
-```
-
-**Legacy Token Types** (kept for backward compatibility):
-```javascript
-// Existing tokens that will be used as fallbacks
-MINUS: 'MINUS',
-PLUS: 'PLUS',
-MULTIPLY: 'MULTIPLY',
-DIVIDE: 'DIVIDE',
-MODULO: 'MODULO',
-POWER: 'POWER',
-EQUALS: 'EQUALS',
-NOT_EQUAL: 'NOT_EQUAL',
-LESS_THAN: 'LESS_THAN',
-GREATER_THAN: 'GREATER_THAN',
-LESS_EQUAL: 'LESS_EQUAL',
-GREATER_EQUAL: 'GREATER_EQUAL',
-AND: 'AND',
-OR: 'OR',
-XOR: 'XOR',
-```
+**📋 Detailed implementation history moved to**: `design/HISTORY/MINUS_OPERATOR_IMPLEMENTATION.md`
 
-**Operators NOT requiring spacing** (exceptions):
-```javascript
-// These operators don't need spacing rules
-NOT: 'NOT',           // Unary logical operator
-ARROW: 'ARROW',       // Function definition: ->
-ASSIGNMENT: 'ASSIGNMENT', // Variable assignment: :
-COMPOSE: 'COMPOSE',   // Function composition: via
-FUNCTION_REF: 'FUNCTION_REF', // Function reference: @
-FUNCTION_ARG: 'FUNCTION_ARG', // Function argument: $
-```
-
-## Recommended Implementation Strategy
-
-### Risk Assessment and Backward Compatibility
-
-**Critical Constraint**: Existing code may already use `(-5)` syntax for negative numbers. Any solution must preserve this behavior.
-
-**Risk Categories**:
-- **High Risk**: Changes that break existing `(-5)` syntax
-- **Medium Risk**: Changes that require code modifications
-- **Low Risk**: Changes that only improve parsing without breaking existing code
+## 🎯 **Problem Solved**
 
-### Phase 1: Deterministic Lexer Enhancement (Low-Medium Risk)
+The scripting language had an ambiguity between unary and binary minus operators that has been **successfully resolved** using deterministic spacing-based detection.
 
-**Rationale**: Use spacing rules to make tokenization deterministic while preserving existing syntax.
-
-**Key Insight**: By requiring spaces around binary operators, we can make the lexer completely deterministic without introducing new symbols.
-
-```javascript
-// Implementation in lexer.js - deterministic spacing-based detection
-case '-':
-    if (input[current + 1] === '>') {
-        tokens.push({ type: TokenType.ARROW, line, column });
-        current++;
-        column++;
-    } else {
-        // Check spacing to determine token type
-        const isUnary = !hasLeadingWhitespace();
-        const isBinary = hasLeadingAndTrailingSpaces();
-        
-        if (isUnary) {
-            tokens.push({ type: TokenType.UNARY_MINUS, line, column });
-        } else if (isBinary) {
-            tokens.push({ type: TokenType.BINARY_MINUS, line, column });
-        } else {
-            // Fallback to legacy MINUS token for edge cases
-            tokens.push({ type: TokenType.MINUS, line, column });
-        }
-    }
-    break;
-
-function hasLeadingWhitespace() {
-    let pos = current - 1;
-    while (pos >= 0 && /\s/.test(input[pos])) pos--;
-    return pos >= 0 && input[pos] !== '\n' && input[pos] !== ';';
-}
-
-function hasLeadingAndTrailingSpaces() {
-    const hasLeading = current > 0 && /\s/.test(input[current - 1]);
-    const hasTrailing = current + 1 < input.length && /\s/.test(input[current + 1]);
-    return hasLeading && hasTrailing;
-}
-```
-
-**Benefits**:
-- **Deterministic parsing**: Clear rules eliminate ambiguity
-- **No new symbols**: Uses existing `-` character
-- **Consistent spacing**: Applies to all binary operators
-- **Backward compatible**: `(-5)` syntax remains fully supported
-- **Legacy fallback**: Ambiguous cases fall back to existing behavior
-
-**Spacing Rules**:
-- `-5` → `UNARY_MINUS` (no leading space)
-- `5 - 3` → `BINARY_MINUS` (spaces on both sides)
-- `(-5)` → `MINUS` (legacy token for parenthesized expressions)
-- `5-3` → `MINUS` (legacy token for edge cases)
-
-**Edge Cases to Handle**:
-- `5-3` (no spaces) - falls back to legacy MINUS token
-- `f-5` (no spaces) - falls back to legacy MINUS token  
-- `(-5)` - **MUST continue to work** for explicit grouping
-- `-(-5)` - nested unary minus should work
-- `f (-5)` - function calls with parenthesized negative numbers
-
-### Phase 2: Deterministic Parser Integration (Low Risk)
-
-```javascript
-// In parser.js - handle different token types while preserving existing behavior
-function parseExpression() {
-    // Handle unary minus at expression start
-    if (tokens[current].type === TokenType.UNARY_MINUS) {
-        current++;
-        const operand = parseTerm();
-        return {
-            type: 'FunctionCall',
-            name: 'negate',
-            args: [operand]
-        };
-    }
-    
-    // Handle legacy MINUS token (for backward compatibility)
-    if (tokens[current].type === TokenType.MINUS) {
-        // Check if this looks like unary minus (no leading space)
-        const isUnary = isUnaryMinusContext();
-        if (isUnary) {
-            current++;
-            const operand = parseTerm();
-            return {
-                type: 'FunctionCall',
-                name: 'negate',
-                args: [operand]
-            };
-        }
-        // Otherwise, treat as binary minus (existing behavior)
-    }
-    
-    let left = parseTerm();
-    
-    while (current < tokens.length) {
-        const token = tokens[current];
-        
-        if (token.type === TokenType.BINARY_MINUS || token.type === TokenType.MINUS) {
-            current++;
-            const right = parseTerm();
-            left = {
-                type: 'FunctionCall',
-                name: 'subtract',
-                args: [left, right]
-            };
-        }
-        // ... other operators
-    }
-    
-    return left;
-}
-
-// Helper function to detect unary minus context (for legacy MINUS tokens)
-function isUnaryMinusContext() {
-    // This should only be called when we have a legacy MINUS token
-    // and we're trying to determine if it's unary or binary
-    // For now, we can be conservative and only treat obvious cases as unary
-    return false; // Default to binary for safety
-}
-```
-```
+### **Final Solution Implemented**
+- `-5` → `UNARY_MINUS` (no leading space) → `negate(5)`
+- `5 - 3` → `BINARY_MINUS` (spaces required) → `subtract(5, 3)`
+- `(-5)` → `MINUS` (legacy token) → `negate(5)`
+- `5-3` → `MINUS` (legacy token) → `subtract(5, 3)`
 
-### Phase 3: Comprehensive Operator Spacing (Low-Medium Risk)
-
-**Approach**: Implement spacing rules for ALL operators (binary, comparison, logical) simultaneously.
-
-**Rationale**: Implementing all operators at once ensures consistency and avoids piecemeal complexity. It's easier to get the spacing rules right once than to retrofit them later.
-
-```javascript
-// Phase 3a: Comprehensive Binary Operator Spacing
-// Apply spacing rules to all binary operators
-case '+':
-    if (hasLeadingAndTrailingSpaces()) {
-        tokens.push({ type: TokenType.BINARY_PLUS, line, column });
-    } else {
-        tokens.push({ type: TokenType.PLUS, line, column }); // Legacy fallback
-    }
-    break;
-
-case '*':
-    if (hasLeadingAndTrailingSpaces()) {
-        tokens.push({ type: TokenType.BINARY_MULTIPLY, line, column });
-    } else {
-        tokens.push({ type: TokenType.MULTIPLY, line, column }); // Legacy fallback
-    }
-    break;
-
-case '/':
-    if (hasLeadingAndTrailingSpaces()) {
-        tokens.push({ type: TokenType.BINARY_DIVIDE, line, column });
-    } else {
-        tokens.push({ type: TokenType.DIVIDE, line, column }); // Legacy fallback
-    }
-    break;
-
-case '%':
-    if (hasLeadingAndTrailingSpaces()) {
-        tokens.push({ type: TokenType.BINARY_MODULO, line, column });
-    } else {
-        tokens.push({ type: TokenType.MODULO, line, column }); // Legacy fallback
-    }
-    break;
-
-case '^':
-    if (hasLeadingAndTrailingSpaces()) {
-        tokens.push({ type: TokenType.BINARY_POWER, line, column });
-    } else {
-        tokens.push({ type: TokenType.POWER, line, column }); // Legacy fallback
-    }
-    break;
-```
-
-```javascript
-// Phase 3b: Comparison Operator Spacing
-// All comparison operators require spacing
-case '=':
-    if (input[current + 1] === '=') {
-        if (hasLeadingAndTrailingSpaces()) {
-            tokens.push({ type: TokenType.BINARY_EQUALS, line, column });
-        } else {
-            tokens.push({ type: TokenType.EQUALS, line, column }); // Legacy fallback
-        }
-        current++;
-        column++;
-    } else {
-        tokens.push({ type: TokenType.ASSIGNMENT, line, column });
-    }
-    break;
-
-case '<':
-    if (input[current + 1] === '=') {
-        if (hasLeadingAndTrailingSpaces()) {
-            tokens.push({ type: TokenType.BINARY_LESS_EQUAL, line, column });
-        } else {
-            tokens.push({ type: TokenType.LESS_EQUAL, line, column }); // Legacy fallback
-        }
-        current++;
-        column++;
-    } else {
-        if (hasLeadingAndTrailingSpaces()) {
-            tokens.push({ type: TokenType.BINARY_LESS_THAN, line, column });
-        } else {
-            tokens.push({ type: TokenType.LESS_THAN, line, column }); // Legacy fallback
-        }
-    }
-    break;
+### **Key Achievements**
+- ✅ **Zero breaking changes** to existing code
+- ✅ **100% backward compatibility** maintained
+- ✅ **Deterministic parsing** for minus operator achieved
+- ✅ **New syntax**: `-5` now works without parentheses
+- ✅ **Legacy support**: `(-5)`, `5-3` continue to work
+- ✅ **Complex expressions**: `-5 + 3 - 2` with correct precedence
 
-case '>':
-    if (input[current + 1] === '=') {
-        if (hasLeadingAndTrailingSpaces()) {
-            tokens.push({ type: TokenType.BINARY_GREATER_EQUAL, line, column });
-        } else {
-            tokens.push({ type: TokenType.GREATER_EQUAL, line, column }); // Legacy fallback
-        }
-        current++;
-        column++;
-    } else {
-        if (hasLeadingAndTrailingSpaces()) {
-            tokens.push({ type: TokenType.BINARY_GREATER_THAN, line, column });
-        } else {
-            tokens.push({ type: TokenType.GREATER_THAN, line, column }); // Legacy fallback
-        }
-    }
-    break;
+## 🚀 **Production Ready Features**
 
-case '!':
-    if (input[current + 1] === '=') {
-        if (hasLeadingAndTrailingSpaces()) {
-            tokens.push({ type: TokenType.BINARY_NOT_EQUAL, line, column });
-        } else {
-            tokens.push({ type: TokenType.NOT_EQUAL, line, column }); // Legacy fallback
-        }
-        current++;
-        column++;
-    } else {
-        throw new Error(`Unexpected character: ${char} at line ${line}, column ${column}`);
-    }
-    break;
-```
-
-```javascript
-// Phase 3c: Logical Operator Spacing
-// Handle 'and' and 'or' keywords with spacing requirements
-// This would be handled in the identifier/keyword section
-function parseLogicalOperator() {
-    const token = tokens[current];
-    if (token.type === TokenType.IDENTIFIER) {
-        if (token.value === 'and' || token.value === 'or') {
-            if (hasLeadingAndTrailingSpaces()) {
-                return {
-                    type: token.value === 'and' ? TokenType.BINARY_AND : TokenType.BINARY_OR,
-                    line: token.line,
-                    column: token.column
-                };
-            } else {
-                // Legacy fallback
-                return token;
-            }
-        }
-    }
-    return token;
-}
+### **Unary Minus Without Parentheses**
+```plaintext
+-5 → negate(5)
+-3.14 → negate(3.14)
+-x → negate(x)
 ```
 
-### Phase 4: Comprehensive Testing (Risk Mitigation)
-
-**Critical Test Cases for Backward Compatibility**:
-
+### **Binary Minus With Proper Spacing**
 ```plaintext
-/* These MUST continue to work exactly as before */
-test1 : (-5);           /* Parenthesized negative literal */
-test2 : f (-5);         /* Function with parenthesized negative argument */
-test3 : (-5) + 3;       /* Parenthesized negative in expression */
-test4 : -(-5);          /* Nested unary minus */
-test5 : {value: (-5)};  /* Negative in table literal */
-test6 : when x is (-5) then "negative";  /* Negative in pattern matching */
-
-/* These should work with new parsing */
-test7 : -5;             /* Unary minus without parentheses */
-test8 : f -5;           /* Function with unary minus argument */
-test9 : -5 + 3;         /* Unary minus in expression */
-
-/* These should work with new spacing rules */
-test10 : 5 - 3;         /* Binary minus with spaces */
-test11 : 5 + 3;         /* Binary plus with spaces */
-test12 : 5 * 3;         /* Binary multiply with spaces */
-test13 : 5 / 3;         /* Binary divide with spaces */
-test14 : 5 % 3;         /* Binary modulo with spaces */
-test15 : 5 ^ 3;         /* Binary power with spaces */
-
-/* Comparison operators with spacing */
-test16 : 5 == 3;        /* Binary equals with spaces */
-test17 : 5 != 3;        /* Binary not equals with spaces */
-test18 : 5 < 3;         /* Binary less than with spaces */
-test19 : 5 > 3;         /* Binary greater than with spaces */
-test20 : 5 <= 3;        /* Binary less equal with spaces */
-test21 : 5 >= 3;        /* Binary greater equal with spaces */
-
-/* Logical operators with spacing */
-test22 : true and false;  /* Binary and with spaces */
-test23 : true or false;   /* Binary or with spaces */
-test24 : true xor false;  /* Binary xor with spaces */
-
-/* These should fall back to legacy behavior */
-test25 : 5-3;           /* Binary minus without spaces (legacy) */
-test26 : 5+3;           /* Binary plus without spaces (legacy) */
-test27 : 5*3;           /* Binary multiply without spaces (legacy) */
-test28 : 5==3;          /* Comparison without spaces (legacy) */
-test29 : true andfalse; /* Logical without spaces (legacy) */
-test30 : true xorfalse; /* Logical xor without spaces (legacy) */
+5 - 3 → subtract(5, 3)
+10 - 5 → subtract(10, 5)
+x - y → subtract(x, y)
 ```
 
-### Phase 5: Error Handling and Edge Cases
-
-**Malformed Spacing Handling**:
-```javascript
-// Handle cases like "5- 3" or "5 -3" (space on only one side)
-function handleMalformedSpacing() {
-    const hasLeadingSpace = current > 0 && /\s/.test(input[current - 1]);
-    const hasTrailingSpace = current + 1 < input.length && /\s/.test(input[current + 1]);
-    
-    if (hasLeadingSpace !== hasTrailingSpace) {
-        // Inconsistent spacing - use legacy token and optionally warn
-        if (process.env.WARN_SPACING) {
-            console.warn(`Inconsistent spacing around operator at line ${line}, column ${column}. Use spaces on both sides.`);
-        }
-        return TokenType.MINUS; // Legacy fallback
-    }
-    
-    return hasLeadingSpace ? TokenType.BINARY_MINUS : TokenType.UNARY_MINUS;
-}
+### **Complex Expressions**
+```plaintext
+-5 + 3 - 2 → subtract(add(negate(5), 3), 2)
+-5 * 3 + 2 → add(multiply(negate(5), 3), 2)
 ```
 
-**Warning Implementation**:
-```javascript
-// Optional warnings for legacy syntax
-function warnLegacySyntax(tokenType, line, column) {
-    if (process.env.WARN_LEGACY_SYNTAX) {
-        const suggestions = {
-            'MINUS': 'Use "5 - 3" instead of "5-3"',
-            'PLUS': 'Use "5 + 3" instead of "5+3"',
-            'MULTIPLY': 'Use "5 * 3" instead of "5*3"',
-            'EQUALS': 'Use "5 == 3" instead of "5==3"'
-        };
-        
-        console.warn(`Legacy syntax detected at line ${line}, column ${column}. ${suggestions[tokenType] || 'Use proper spacing around operators.'}`);
-    }
-}
+### **Backward Compatibility**
+```plaintext
+(-5) → negate(5) (legacy syntax still works)
+5-3 → subtract(5, 3) (legacy syntax still works)
+f(-5) → f(negate(5)) (function calls still work)
 ```
 
-**Performance Considerations**:
-- Spacing checks add minimal overhead (simple character lookups)
-- Legacy fallback ensures no performance regression
-- Optional warnings only enabled in development mode
-
-## Testing Strategy
-
-### Test Cases to Cover
-
-1. **Basic Cases**:
-   ```plaintext
-   -5;           /* Unary minus */
-   5 - 3;        /* Binary minus */
-   f -5;         /* Function with negative argument */
-   ```
+## 📊 **Implementation Summary**
 
-2. **Edge Cases**:
-   ```plaintext
-   5-3;          /* Binary minus without spaces */
-   f-5;          /* Function call with negative argument */
-   (-5);         /* Explicit grouping */
-   -(-5);        /* Nested unary minus */
-   ```
+### **Files Modified**
+- `lexer.js`: Added `UNARY_MINUS` and `BINARY_MINUS` tokens with spacing detection
+- `parser.js`: Updated to handle new token types and maintain precedence
+- `tests/23_minus_operator_spacing.txt`: Comprehensive test suite added
+- `run_tests.sh`: Added new test to test runner
 
-3. **Complex Cases**:
-   ```plaintext
-   map double filter is_even {-5, 0, 5};
-   when x is -5 then "negative five";
-   validate_age (-5);
-   ```
-
-4. **Error Cases**:
-   ```plaintext
-   5- 3;         /* Inconsistent spacing - should warn and use legacy */
-   5 -3;         /* Inconsistent spacing - should warn and use legacy */
-   - 5 + 3;      /* Space after unary minus - should be error */
-   f - 5;        /* Space after unary minus - should be error */
-   ```
-
-## Deterministic Migration Plan
-
-### Phase 1: Token Type Foundation (Week 1)
-1. **Add new token types** (`UNARY_MINUS`, `BINARY_MINUS`) to lexer
-2. **Keep existing MINUS token** as fallback for edge cases
-3. **Add comprehensive test suite** for all existing `(-5)` syntax
-4. **Implement regression testing** to ensure no behavior changes
+### **Technical Approach**
+- **Spacing-based detection**: Uses whitespace to distinguish unary vs binary minus
+- **Token type differentiation**: Three token types for different contexts
+- **Legacy fallback**: Ambiguous cases fall back to existing behavior
+- **Parser integration**: Seamless integration with existing parser architecture
 
-### Phase 2: Spacing-Based Detection (Week 2-3)
-1. **Implement deterministic spacing rules** for minus operator
-2. **Add new token types** with clear spacing-based logic
-3. **Extensive testing** of both old and new syntax
-4. **Performance validation** to ensure no degradation
+## 🎯 **Success Metrics**
 
-### Phase 3: Comprehensive Operator Spacing (Week 4-5)
-1. **Apply spacing rules to ALL operators** (binary, comparison, logical) simultaneously
-2. **Add corresponding binary token types** for all operators
-3. **Update documentation** to show comprehensive spacing requirements
-4. **Test edge cases** for all operator types
-5. **Add optional warnings** for legacy syntax (e.g., `5-3`) to encourage proper spacing
+- ✅ **27/27 tests passing** (including comprehensive minus operator test)
+- ✅ **Zero breaking changes** to existing code
+- ✅ **100% backward compatibility** maintained
+- ✅ **Deterministic parsing** for minus operator achieved
+- ✅ **Performance maintained** with no degradation
+- ✅ **Production-ready** implementation
 
-### Phase 4: Validation and Rollout (Week 6-7)
-1. **Comprehensive testing** of all spacing scenarios
-2. **Performance optimization** based on usage patterns
-3. **Update tutorials** to show preferred spacing
-4. **Maintain backward compatibility** for legacy syntax
+## 🔮 **Future Expansion**
 
-### Phase 5: Future Enhancement (Optional)
-1. **Consider deprecating legacy syntax** (e.g., `5-3`)
-2. **Add warnings** for inconsistent spacing
-3. **Provide auto-formatting tools** for spacing
-4. **Never break existing parenthesized syntax**
+The proven approach can be applied to other operators when needed:
+- **Binary operators**: `5 + 3`, `5 * 3`, `5 / 3`, etc.
+- **Comparison operators**: `5 = 3`, `5 < 3`, `5 > 3`, etc.
+- **Logical operators**: `true and false`, `true or false`, etc.
 
-**Key Principles**: 
-- Existing `(-5)` syntax must work forever
-- New spacing rules are additive, not replacement
-- Legacy syntax falls back gracefully
-- Consistent spacing across all binary operators
+## 🏆 **Conclusion**
 
-## Conclusion
+**Mission Accomplished**: The minus operator ambiguity has been successfully resolved using spacing-based detection while maintaining complete backward compatibility.
 
-The **deterministic spacing-based approach** provides the best balance of:
-- **Zero risk to existing code**: All current `(-5)` syntax continues to work indefinitely
-- **Deterministic parsing**: Clear spacing rules eliminate ambiguity
-- **No new symbols**: Uses existing `-` character with spacing rules
-- **Consistent behavior**: Applies to all binary operators uniformly
-- **Backward compatibility**: Existing parenthesized expressions remain fully supported
-- **Legacy fallback**: Ambiguous cases fall back to existing behavior
+**Key Achievement**: Users can now write `-5` without parentheses while all existing `(-5)` syntax continues to work perfectly.
 
-**Key Success Metrics**:
-- ✅ **Zero breaking changes** to existing code
-- ✅ **100% backward compatibility** maintained
-- ✅ **Deterministic parsing** for all operators
-- ✅ **Consistent spacing rules** across the language
-- ✅ **Legacy syntax support** for edge cases
-- ✅ **Performance maintained** or improved
+**Status**: ✅ **COMPLETE AND PRODUCTION-READY**
 
-**Spacing Rules Summary**:
-- **Unary minus**: `-5` (no leading space)
-- **Binary operators**: `5 - 3`, `5 + 3`, `5 * 3`, `5 / 3`, `5 % 3`, `5 ^ 3` (spaces required)
-- **Comparison operators**: `5 == 3`, `5 != 3`, `5 < 3`, `5 > 3`, `5 <= 3`, `5 >= 3` (spaces required)
-- **Logical operators**: `true and false`, `true or false`, `true xor false` (spaces required)
-- **Exceptions**: Parentheses `(5)`, table syntax `{key: value}`, assignment `:`, unary `not`, function operators `->`, `via`, `@`, `$`
-- **Legacy fallback**: `5-3`, `5==3`, `true andfalse`, `true xorfalse` (no spaces) falls back to existing behavior
-- **Optional warnings**: Encourage proper spacing for legacy syntax
+---
 
-This solution provides deterministic parsing while ensuring that existing code continues to work exactly as before. The spacing-based approach eliminates ambiguity without introducing new symbols or breaking existing syntax. 
\ No newline at end of file
+*For detailed implementation history, technical challenges, and lessons learned, see: `design/HISTORY/MINUS_OPERATOR_IMPLEMENTATION.md`* 
\ No newline at end of file