🔧 Fix peek expression terminator issues and add ternary operator support

- Fix LLVM IR terminator missing in peek expression entry blocks
- Add proper jump instructions between peek blocks
- Implement ternary operator (? :) as syntactic sugar for peek
- Update Python LLVM externcall handling for improved compatibility
- Add comprehensive test cases for peek and ternary expressions
- Update language guide with ternary operator documentation

ChatGPTが頑張って修正してくれたにゃ!🐱

Co-Authored-By: ChatGPT <noreply@openai.com>
This commit is contained in:
Selfhosting Dev
2025-09-14 20:30:38 +09:00
parent 8f1b2ffa12
commit 5cad0ab20c
17 changed files with 241 additions and 38 deletions

View File

@ -15,6 +15,39 @@ Common Constructs
- Null-coalesce: `x ?? y``peek x { null => y, else => x }`
- Safe access: `a?.b``peek a { null => null, else => a.b }`
Minimal Examples
- Ternary
```nyash
static box Main {
main(args) {
local a = 3
local b = 5
// Nested ternary is supported
local v = (a < b) ? ((b < 0) ? 40 : 50) : 60
return v
}
}
```
- Peek as expression block (last expression is the value)
```nyash
static box Main {
main(args) {
local d = "1"
// Each arm can be a block; the last expression becomes the value
local dv = peek d {
"0" => { print("found zero") 0 }
"1" => { print("found one") 1 }
else => { print("other") 0 }
}
return dv
}
}
```
must_use Notes
- Peek arms are expressions. When using a block arm `{ ... }`, the last expression is the resulting value; statements without a final expression yield no usable value.
- Ternary is an expression; ensure both branches are type-compatible at MIR level (e.g., both yield integer or both yield string handle in current phase).
When you need the implementation details
- Tokenizer: src/tokenizer.rs
- Parser: src/parser/expressions.rs, src/parser/statements.rs