# Language Features Analysis - 20 Features from Modern Languages **Generated by**: Task Agent 4 (Cross-Language Research) **Date**: 2025-10-12 **Philosophy**: Learn from Rust, Python, Go, Kotlin, Swift, Elixir, TypeScript --- ## 📊 Analysis Matrix | Feature | Origin | Hakorune Status | Priority | Implementation | |---------|--------|----------------|----------|----------------| | **Pattern Matching** | Rust/Elixir | ✅ Has `match` | - | Already implemented | | **Null Safety** | Kotlin/Swift | ⚠️ Partial (? operator) | HIGH | Need `?.` operator | | **Async/Await** | Rust/JS | ✅ Has `nowait`/`await` | - | Already implemented | | **Pipe Operator** | Elixir/F# | ✅ Has `\|>` | - | Already implemented | | **String Interpolation** | Python/Kotlin | ❌ Missing | HIGH | Add `` `${var}` `` | | **List Comprehension** | Python | ❌ Missing | HIGH | Add `[x for x in list]` | | **Guard Clauses** | Swift | ❌ Missing | MEDIUM | Add `guard ... else` | | **With Statement** | Python | ⚠️ Partial (`cleanup`) | MEDIUM | Enhance | | **Spread Operator** | JS/Rust | ❌ Missing | MEDIUM | Add `...array` | | **Destructuring** | JS/Rust | ❌ Missing | MEDIUM | Add `local [a,b] = arr` | | **Optional Chaining** | Swift/JS | ❌ Missing | HIGH | Add `obj?.field` | | **Type Inference** | Rust/Go | ⚠️ Partial | LOW | Enhance | | **Traits/Protocols** | Rust/Swift | ❌ Missing | LOW | Add `trait` keyword | | **Operator Overloading** | Rust/Kotlin | ❌ Missing | LOW | Add via Boxes | | **Macros** | Rust | ⚠️ Has `@enum/@match` | MEDIUM | Expand system | | **Iterators** | Rust | ⚠️ Basic | MEDIUM | Enhance protocol | | **Error Handling** | Rust | ⚠️ Has ResultBox | MEDIUM | Add `?` propagation | | **Ranges** | Rust/Python | ❌ Missing | HIGH | Add `0..10` | | **Default Parameters** | Python/Kotlin | ❌ Missing | MEDIUM | Add `func(x=10)` | | **Named Parameters** | Python/Swift | ❌ Missing | MEDIUM | Add `func(name: val)` | **Legend**: - ✅ Already implemented - ⚠️ Partially implemented - ❌ Not yet implemented --- ## 🎯 High Priority - Immediate Adoption Recommended ### 1. **Optional Chaining** (Swift/TypeScript) **Status**: ❌ Missing **Impact**: Crash prevention, cleaner null handling **Recommendation**: ✅ ADOPT ```hakorune // Swift/TypeScript style local street = person?.address?.street // Equivalent to: local street if person != null { local addr = person.address if addr != null { street = addr.street } } ``` **Why adopt**: - Extremely common pattern in real-world code - Prevents 90% of null pointer crashes - Syntactic sugar, desugars to null checks - Already planned in sugar-syntax-proposals.md --- ### 2. **String Interpolation** (Python/Kotlin/Swift) **Status**: ❌ Missing **Impact**: Eliminate ugly concatenation **Recommendation**: ✅ ADOPT ```hakorune // Python/Kotlin style local message = `Hello, ${name}! You have ${count} messages.` // Current Hakorune: local message = "Hello, " + name + "! You have " + count.to_string() + " messages." ``` **Why adopt**: - Universal feature in modern languages - 70% code reduction for string building - Desugars to StringBox operations - Already planned in sugar-syntax-proposals.md --- ### 3. **List Comprehension** (Python) **Status**: ❌ Missing **Impact**: 60-70% code reduction in data processing **Recommendation**: ✅ ADOPT ```hakorune // Python style local evens = [x * 2 for x in numbers if x % 2 == 0] // Current Hakorune: local evens = new ArrayBox() local i = 0 loop(i < numbers.length()) { local x = numbers.get(i) if x % 2 == 0 { evens.push(x * 2) } i = i + 1 } ``` **Why adopt**: - Most requested Python feature - Functional programming essential - Desugars to loop + conditional + push - Already planned in sugar-syntax-proposals.md --- ### 4. **Range Operator** (Rust/Python) **Status**: ❌ Missing **Impact**: Clean iteration and slicing **Recommendation**: ✅ ADOPT ```hakorune // Rust/Python style local range = 0..10 // Exclusive end local range2 = 0..=10 // Inclusive end local slice = array[2..5] // Slice syntax loop(i in 0..10) { print(i) } // Current Hakorune: local i = 0 loop(i < 10) { print(i) i = i + 1 } ``` **Why adopt**: - Extremely common pattern - Safer than manual index management - Desugars to RangeBox + iterator - Already planned in sugar-syntax-proposals.md --- ## 💡 Medium Priority - Consider Adoption ### 5. **Guard Clauses** (Swift) **Status**: ❌ Missing **Impact**: Reduce nesting, improve readability **Recommendation**: ✅ ADOPT (Low complexity) ```hakorune // Swift style guard value != null else return null guard value > 0 else return -1 // Current Hakorune: if value == null { return null } if value <= 0 { return -1 } ``` **Why adopt**: - Reduces nesting (20-30% fewer indentation levels) - "Fail fast" pattern is universally recommended - Desugars to inverted conditionals - Already planned in sugar-syntax-proposals.md --- ### 6. **With Statement Enhancement** (Python) **Status**: ⚠️ Has `cleanup`, but not integrated with variable binding **Impact**: Better resource management **Recommendation**: ✅ ENHANCE ```hakorune // Python style with file = FileBox.open("data.txt") { local content = file.read() print(content) } // file.close() called automatically // Current Hakorune: local file = FileBox.open("data.txt") cleanup { file.close() } local content = file.read() print(content) ``` **Why enhance**: - Hakorune already has `cleanup` keyword - Just need syntactic sugar for binding + cleanup - Common pattern for files, locks, connections - Already planned in sugar-syntax-proposals.md --- ### 7. **Spread Operator** (JavaScript/Rust) **Status**: ❌ Missing **Impact**: Clean array/object merging **Recommendation**: ✅ ADOPT ```hakorune // JavaScript style local merged = [...arr1, item, ...arr2] local combined = {name: "Alice", ...defaults} // Current Hakorune: local merged = new ArrayBox() local iter1 = arr1.iterator() loop(iter1.has_next()) { merged.push(iter1.next()) } merged.push(item) local iter2 = arr2.iterator() loop(iter2.has_next()) { merged.push(iter2.next()) } ``` **Why adopt**: - Common in functional programming - 80% code reduction for merging - Desugars to iterator loops - Already planned in sugar-syntax-proposals.md --- ### 8. **Destructuring Assignment** (JavaScript/Rust) **Status**: ❌ Missing **Impact**: Cleaner variable extraction **Recommendation**: ✅ ADOPT ```hakorune // JavaScript/Rust style local [first, second, rest...] = array local {name, age} = person // Current Hakorune: local first = array.get(0) local second = array.get(1) local rest = array.slice(2, array.length()) ``` **Why adopt**: - Extremely common pattern - 50% code reduction - Desugars to individual assignments - Already planned in sugar-syntax-proposals.md --- ### 9. **Default Parameters** (Python/Kotlin) **Status**: ❌ Missing **Impact**: Reduce function overloads **Recommendation**: ✅ ADOPT ```hakorune // Python/Kotlin style greet(name = "World") { print(`Hello, ${name}!`) } greet() // "Hello, World!" greet("Alice") // "Hello, Alice!" // Current Hakorune: greet(name) { if name == null { name = "World" } print("Hello, " + name + "!") } ``` **Why adopt**: - Reduces API complexity - Common in all modern languages - Desugars to null check + assignment - Already planned in sugar-syntax-proposals.md --- ### 10. **Named Parameters** (Python/Swift) **Status**: ❌ Missing **Impact**: Better API ergonomics **Recommendation**: ✅ ADOPT ```hakorune // Python/Swift style create_user(name: "Alice", age: 30, admin: true) // Current Hakorune: create_user("Alice", 30, true) // What does true mean? ``` **Why adopt**: - Self-documenting code - Prevents parameter order mistakes - Desugars to MapBox parameter passing - Already planned in sugar-syntax-proposals.md --- ## 🔮 Low Priority - Future Consideration ### 11. **Type Inference Enhancement** (Rust/Go) **Status**: ⚠️ Hakorune has basic inference **Current**: `local x = 42` (infers IntegerBox) **Enhancement**: Full Hindley-Milner inference **Recommendation**: ⚠️ DEFER (Complexity vs benefit) **Reason**: Hakorune's "Everything is Box" already provides sufficient type safety without complex type inference. Full inference would add significant compiler complexity for marginal benefit. --- ### 12. **Traits/Protocols** (Rust/Swift) **Status**: ❌ Missing **Impact**: Interface polymorphism **Recommendation**: ⚠️ DEFER (Consider after stabilization) ```rust // Rust style trait Drawable { fn draw(&self); } impl Drawable for Circle { fn draw(&self) { ... } } ``` **Hakorune alternative**: Use Box inheritance + method checking ```hakorune box Drawable { draw() { panic("draw() not implemented") } } box Circle from Drawable { override draw() { print("Drawing circle") } } ``` **Reason**: Box inheritance already provides similar functionality. Traits would add complexity for marginal benefit in current use cases. Revisit if generic programming becomes essential. --- ### 13. **Operator Overloading** (Rust/Kotlin) **Status**: ❌ Missing **Impact**: Custom types behaving like primitives **Recommendation**: ⚠️ DEFER (Can be done via Boxes) ```rust // Rust style impl Add for Vector { fn add(self, other: Vector) -> Vector { ... } } let v3 = v1 + v2; ``` **Hakorune alternative**: Use methods ```hakorune box Vector { add(other) { return new Vector(me.x + other.x, me.y + other.y) } } local v3 = v1.add(v2) ``` **Reason**: Method calls are explicit and clear. Operator overloading can lead to surprising behavior. Hakorune prioritizes clarity over brevity. --- ### 14. **Macros System Enhancement** (Rust) **Status**: ⚠️ Has `@enum`, `@match` **Recommendation**: ✅ EXPAND (Already planned) See [macro-system-proposals.md](macro-system-proposals.md) for 12 additional macro proposals. --- ### 15. **Iterator Protocol Enhancement** (Rust) **Status**: ⚠️ Basic `.iterator()` exists **Enhancement**: Rich iterator combinators ```hakorune // Rust-style iterator chain local result = array .iter() .filter(x => x > 10) .map(x => x * 2) .collect() // Current Hakorune: local result = new ArrayBox() local iter = array.iterator() loop(iter.has_next()) { local x = iter.next() if x > 10 { result.push(x * 2) } } ``` **Recommendation**: ✅ ADOPT (via IteratorBox enhancement) **Implementation**: Add `.filter()`, `.map()`, `.collect()` methods to IteratorBox --- ### 16. **Error Handling with ? Operator** (Rust) **Status**: ⚠️ Has ResultBox, but no propagation operator **Enhancement**: Add `?` operator for error propagation ```rust // Rust style fn process() -> Result { let value = may_fail()?; // Early return if Err Ok(value * 2) } ``` ```hakorune // Proposed Hakorune process() { local value = may_fail()? // Early return if Err return Ok(value * 2) } ``` **Recommendation**: ✅ ADOPT (Low complexity, high value) **Implementation**: Desugar to match + early return --- ### 17. **Partial Application** (Haskell/Scala) **Status**: ❌ Missing **Impact**: Functional programming patterns **Recommendation**: ⚠️ DEFER (Niche use case) ```haskell -- Haskell style add :: Int -> Int -> Int add x y = x + y add5 = add 5 result = add5 10 -- 15 ``` **Hakorune alternative**: Use closures (when arrow functions added) ```hakorune add(x, y) { return x + y } local add5 = (y) => add(5, y) local result = add5(10) // 15 ``` **Reason**: Partial application is powerful but has a steep learning curve. Closures provide similar functionality with more explicit syntax. Consider if functional programming becomes a major use case. --- ### 18. **Tail Call Optimization** (Scheme/Elixir) **Status**: ❌ Not automatic **Impact**: Enable infinite recursion **Recommendation**: ⚠️ DEFER (LLVM backend only) **Current issue**: Recursive fibonacci is 0.02% of C speed (see benchmarks) **Root cause**: `call_legacy` overhead, not tail call optimization **Priority**: Fix `call_legacy → call_direct` first (50x speedup expected), then consider TCO **Recommendation**: TCO is nice-to-have, but fixing call overhead is more important --- ### 19. **Generator Functions** (Python/JavaScript) **Status**: ❌ Missing **Impact**: Lazy iteration **Recommendation**: ⚠️ DEFER (Complex implementation) ```python # Python style def fibonacci(): a, b = 0, 1 while True: yield a a, b = b, a + b ``` **Hakorune alternative**: Implement as IteratorBox ```hakorune box FibonacciIterator from IteratorBox { a: IntegerBox b: IntegerBox birth() { me.a = 0 me.b = 1 } next() { local current = me.a local temp = me.a me.a = me.b me.b = temp + me.b return current } } ``` **Reason**: Generator functions require complex state machine transformation. IteratorBox provides the same functionality with explicit state management. Consider if lazy evaluation becomes essential. --- ### 20. **Immutability by Default** (Rust/Elixir) **Status**: ❌ All variables mutable **Impact**: Prevent accidental mutation **Recommendation**: ❌ REJECT (Breaks Box philosophy) ```rust // Rust style let x = 10; // Immutable let mut y = 20; // Mutable ``` **Why reject**: - Hakorune's "Everything is Box" means all values are heap-allocated and potentially shared - Arc> semantics mean mutation is controlled at runtime, not compile time - Immutability-by-default would require significant language redesign - Current design prioritizes simplicity and ease of learning **Alternative**: Provide `ImmutableBox` wrapper for values that shouldn't change --- ## 📊 Feature Priority Summary ### ✅ ADOPT (High Priority) 1. Optional chaining (`?.`) 2. String interpolation (`` `${var}` ``) 3. List comprehension (`[x for x in list]`) 4. Range operator (`0..10`) **Total impact**: 60-70% code reduction ### ✅ ADOPT (Medium Priority) 1. Guard clauses (`guard ... else`) 2. With statement enhancement (`with x = ... { }`) 3. Spread operator (`...array`) 4. Destructuring (`local [a, b] = arr`) 5. Default parameters (`func(x = 10)`) 6. Named parameters (`func(name: val)`) 7. Error propagation (`?` operator) **Total impact**: Additional 20-30% code reduction ### ✅ ENHANCE (Existing Features) 1. Macro system (add 12 macros) 2. Iterator protocol (add combinators) 3. JSONBox (JsonPath, schema) 4. DateTimeBox (formatting, arithmetic) ### ⚠️ DEFER (Future Consideration) 1. Traits/protocols (current Box inheritance sufficient) 2. Operator overloading (explicit methods preferred) 3. Partial application (closures more explicit) 4. Tail call optimization (fix call overhead first) 5. Generator functions (IteratorBox alternative) ### ❌ REJECT (Incompatible with Philosophy) 1. Immutability by default (breaks Box semantics) 2. Full Hindley-Milner inference (unnecessary complexity) --- ## 🎯 Implementation Roadmap ### **Week 1-2: Critical Ergonomics** 1. Optional chaining (`?.`) 2. String interpolation (`` `${var}` ``) 3. List comprehension 4. Range operator ### **Week 3-4: Code Quality** 1. Guard clauses 2. With statement 3. Spread operator 4. Destructuring ### **Week 5-6: API Comfort** 1. Default parameters 2. Named parameters 3. Error propagation (`?`) 4. Iterator combinators ### **Week 7+: Advanced Features** 1. Macro system expansion 2. Box library enhancements 3. Performance optimizations --- ## 🏆 Success Criteria **Code reduction**: 70-80% in typical cases (combining all features) **Ergonomics**: Match Python comfort with Rust safety **Learning curve**: Gentle (all features desugar to Box operations) **Performance**: No regression (all features compile to same MIR) **Compatibility**: All existing code continues to work --- ## 📚 Research Sources **Languages analyzed**: - Rust (pattern matching, error handling, traits, macros) - Python (list comprehension, string interpolation, with statement) - Go (simplicity, defer, goroutines) - Kotlin (null safety, extension functions, coroutines) - Swift (optional chaining, guard clauses, protocols) - Elixir (pipe operator, pattern matching, immutability) - TypeScript (type system, optional chaining) - JavaScript (async/await, destructuring, spread) **Key insight**: Modern languages converge on similar features: - Null safety (optional chaining) - String interpolation - Destructuring - Async/await - Pattern matching - Error handling Hakorune should adopt the best ideas while maintaining its unique "Everything is Box" philosophy. --- **Summary**: Hakorune already has many advanced features (match, nowait/await, pipe). Adding 15-20 ergonomics features from other languages will make it competitive with Python/Kotlin/Swift while maintaining Rust-level power and simplicity.