244 lines
5.4 KiB
Markdown
244 lines
5.4 KiB
Markdown
# 🌟 Modern Language Inspiration & Implementation Plan
|
|
|
|
## Language Research Summary
|
|
|
|
### Pipe Operators Across Languages
|
|
|
|
| Language | Syntax | Placeholder | Notes |
|
|
|----------|--------|-------------|-------|
|
|
| **Gleam** | `\|>` | `_` | Placeholder can go anywhere, enables function capture |
|
|
| **Elixir** | `\|>` | `&1`, `&2` | Always first arg by default, numbered placeholders |
|
|
| **Nushell** | `\|` | structured data | Pipes structured data, not just text |
|
|
| **F#** | `\|>` | none | Always first argument |
|
|
| **Raku** | `==>` | `*` | Star placeholder for positioning |
|
|
|
|
### Conditional Syntax
|
|
|
|
| Language | Single-line | Multi-line | Returns Value |
|
|
|----------|------------|------------|---------------|
|
|
| **Lua** | `if x then y end` | `if..elseif..else..end` | No (statement) |
|
|
| **Luau** | `if x then y else z` | Same | Yes (expression) |
|
|
| **Ruby** | `x = y if condition` | `if..elsif..else..end` | Yes |
|
|
| **Python** | `y if x else z` | `if..elif..else:` | Yes |
|
|
| **Gleam** | N/A | `case` expressions | Yes |
|
|
|
|
## 🍤 Shrimp Design Decisions
|
|
|
|
### Pipe Operator with Placeholder (`|`)
|
|
|
|
**Syntax Choice: `|` with `_` placeholder**
|
|
|
|
```shrimp
|
|
# Basic pipe with placeholder
|
|
"hello world" | upcase _
|
|
"log.txt" | tail _ lines=10
|
|
|
|
# Placeholder positioning flexibility
|
|
"error.log" | grep "ERROR" _ | head _ 5
|
|
data | process format="json" input=_
|
|
|
|
# Multiple placeholders (future consideration)
|
|
value | combine _ _
|
|
```
|
|
|
|
**Why this design:**
|
|
- **`|` over `|>`**: Cleaner, more shell-like
|
|
- **`_` placeholder**: Explicit, readable, flexible positioning
|
|
- **Gleam-inspired**: Best of functional programming meets shell scripting
|
|
|
|
### Conditionals
|
|
|
|
**Multi-line syntax:**
|
|
```shrimp
|
|
if condition:
|
|
expression
|
|
elsif other-condition:
|
|
expression
|
|
else:
|
|
expression
|
|
end
|
|
```
|
|
|
|
**Single-line syntax (expression form):**
|
|
```shrimp
|
|
result = if x = 5: "five"
|
|
# Returns nil when false
|
|
|
|
result = if x > 0: "positive" else: "non-positive"
|
|
# Explicit else for non-nil guarantee
|
|
```
|
|
|
|
**Design choices:**
|
|
- **`elsif` not `else if`**: Avoids nested parsing complexity (Ruby-style)
|
|
- **`:` after conditions**: Consistent with function definitions
|
|
- **`=` for equality**: Context-sensitive (assignment vs comparison)
|
|
- **`nil` for no-value**: Short, clear, well-understood
|
|
- **Expressions return values**: Everything is an expression philosophy
|
|
|
|
## 📝 Implementation Plan
|
|
|
|
### Phase 1: Grammar Foundation
|
|
|
|
**1.1 Add Tokens**
|
|
```grammar
|
|
@tokens {
|
|
// Existing...
|
|
"|" // Pipe operator
|
|
"_" // Placeholder
|
|
"if" // Conditionals
|
|
"elsif"
|
|
"else"
|
|
"nil" // Null value
|
|
}
|
|
```
|
|
|
|
**1.2 Precedence Updates**
|
|
```grammar
|
|
@precedence {
|
|
multiplicative @left,
|
|
additive @left,
|
|
pipe @left, // After arithmetic, before assignment
|
|
assignment @right,
|
|
call
|
|
}
|
|
```
|
|
|
|
### Phase 2: Grammar Rules
|
|
|
|
**2.1 Pipe Expression**
|
|
```grammar
|
|
PipeExpr {
|
|
expression !pipe "|" PipeTarget
|
|
}
|
|
|
|
PipeTarget {
|
|
FunctionCallWithPlaceholder |
|
|
FunctionCall // Error in compiler if no placeholder
|
|
}
|
|
|
|
FunctionCallWithPlaceholder {
|
|
Identifier PlaceholderArg+
|
|
}
|
|
|
|
PlaceholderArg {
|
|
PositionalArg | NamedArg | Placeholder
|
|
}
|
|
|
|
Placeholder {
|
|
"_"
|
|
}
|
|
```
|
|
|
|
**2.2 Conditional Expression**
|
|
```grammar
|
|
Conditional {
|
|
SingleLineIf | MultiLineIf
|
|
}
|
|
|
|
SingleLineIf {
|
|
"if" Comparison ":" expression ElseClause?
|
|
}
|
|
|
|
MultiLineIf {
|
|
"if" Comparison ":" newlineOrSemicolon
|
|
(line newlineOrSemicolon)*
|
|
ElsifClause*
|
|
ElseClause?
|
|
"end"
|
|
}
|
|
|
|
ElsifClause {
|
|
"elsif" Comparison ":" newlineOrSemicolon
|
|
(line newlineOrSemicolon)*
|
|
}
|
|
|
|
ElseClause {
|
|
"else" ":" (expression | (newlineOrSemicolon (line newlineOrSemicolon)*))
|
|
}
|
|
|
|
Comparison {
|
|
expression "=" expression // Context-sensitive in if/elsif
|
|
}
|
|
```
|
|
|
|
**2.3 Update line rule**
|
|
```grammar
|
|
line {
|
|
PipeExpr |
|
|
Conditional |
|
|
FunctionCall |
|
|
// ... existing rules
|
|
}
|
|
```
|
|
|
|
### Phase 3: Test Cases
|
|
|
|
**Pipe Tests:**
|
|
```shrimp
|
|
# Basic placeholder
|
|
"hello" | upcase _
|
|
|
|
# Named arguments with placeholder
|
|
"file.txt" | process _ format="json"
|
|
|
|
# Chained pipes
|
|
data | filter _ "error" | count _
|
|
|
|
# Placeholder in different positions
|
|
5 | subtract 10 _ # 10 - 5 = 5
|
|
```
|
|
|
|
**Conditional Tests:**
|
|
```shrimp
|
|
# Single line
|
|
x = if n = 0: "zero"
|
|
|
|
# Single line with else
|
|
sign = if n > 0: "positive" else: "negative"
|
|
|
|
# Multi-line
|
|
if score > 90:
|
|
grade = "A"
|
|
elsif score > 80:
|
|
grade = "B"
|
|
else:
|
|
grade = "C"
|
|
end
|
|
|
|
# Nested conditionals
|
|
if x > 0:
|
|
if y > 0:
|
|
quadrant = 1
|
|
end
|
|
end
|
|
```
|
|
|
|
### Phase 4: Compiler Implementation
|
|
|
|
**4.1 PipeExpr Handling**
|
|
- Find placeholder position in right side
|
|
- Insert left side value at placeholder
|
|
- Error if no placeholder found
|
|
|
|
**4.2 Conditional Compilation**
|
|
- Generate JUMP bytecode for branching
|
|
- Handle nil returns for missing else
|
|
- Context-aware `=` parsing
|
|
|
|
## 🎯 Key Decision Points
|
|
|
|
1. **Placeholder syntax**: `_` vs `$` vs `?` → **Choose `_` (Gleam-like)**
|
|
2. **Pipe operator**: `|` vs `|>` vs `>>` → **Choose `|` (cleaner)**
|
|
3. **Nil naming**: `nil` vs `null` vs `none` → **Choose `nil` (Ruby-like)**
|
|
4. **Equality**: Keep `=` context-sensitive or add `==`? → **Keep `=` (simpler)**
|
|
5. **Single-line if**: Require else or default nil? → **Default nil (flexible)**
|
|
|
|
## 🚀 Next Steps
|
|
|
|
1. Update grammar file with new tokens and rules
|
|
2. Write comprehensive test cases
|
|
3. Implement compiler support for pipes
|
|
4. Implement conditional bytecode generation
|
|
5. Test edge cases and error handling
|
|
|
|
This plan combines the best ideas from modern languages while maintaining Shrimp's shell-like simplicity and functional philosophy! |