669 lines
17 KiB
Markdown
669 lines
17 KiB
Markdown
|
|
# 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<T, E> {
|
||
|
|
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<Mutex<>> 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.
|