Skip to content

Commit bec8647

Browse files
committed
feat(reox): UI framework enhancements
- Add stdlib modules: core.rs, io.rs, ui.rs - Add ViewModifier, ContainerBuilder for SwiftUI-like patterns - Add widget builders: ButtonBuilder, TextBuilder, InputBuilder, etc. - Enhance codegen to emit reox FFI calls for UI widgets - Add animation easing functions to interpreter - Add theme colors (color_primary, color_success, etc.) - Add AI helper functions (ai_complete, ai_explain, ai_fix) - Fix float arithmetic and comparisons in interpreter
1 parent ac83124 commit bec8647

11 files changed

Lines changed: 1842 additions & 37 deletions

File tree

docs/reox_health_report.md

Lines changed: 18 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
11
# REOX Language Health Report
22

3-
**Date:** January 18, 2026
3+
**Date:** January 28, 2026
44
**Version:** Pre-v1
5-
**Last Updated:** After async/await implementation
5+
**Last Updated:** After float arithmetic and clippy fixes
66

77
## 📊 Executive Summary
88

9-
The REOX compiler (`reoxc`) has made significant progress toward v1 readiness. Recent updates have addressed critical issues including async/await support, match expressions, and bitwise operators. The compiler now successfully compiles control flow, function calls, match expressions, and async/await to C code.
9+
The REOX compiler (`reoxc`) has made significant progress toward v1 readiness. Recent updates have addressed critical issues including async/await support, match expressions, bitwise operators, and float arithmetic. The interpreter now fully supports float operations and mixed int/float arithmetic.
1010

1111
## ✅ Recently Fixed
1212

@@ -42,6 +42,21 @@ The REOX compiler (`reoxc`) has made significant progress toward v1 readiness. R
4242
- Typechecker enforces int operands
4343
- Codegen passes through to C operators
4444

45+
### 4. Float Arithmetic - **IMPLEMENTED**
46+
47+
- **Status:** Working (Jan 28, 2026)
48+
- **Implementation:**
49+
- All arithmetic operators (+, -, \*, /, %) now support float types
50+
- Mixed int/float operations auto-promote to float
51+
- Comparison operators (<, >, <=, >=) work with floats
52+
- Float equality uses epsilon comparison
53+
- **Usage:**
54+
```reox
55+
let x: float = 3.14;
56+
let y: float = x * 2.0; // 6.28
57+
let z: float = 1 + 0.5; // Mixed: 1.5
58+
```
59+
4560
## 🟡 Improvement Areas
4661

4762
### 1. Match Type Inference (Low Priority)

reox-lang/src/codegen/mod.rs

Lines changed: 136 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -350,15 +350,42 @@ impl CodeGen {
350350
}
351351

352352
fn gen_for(&mut self, f: &ForStmt) {
353-
// Convert to C-style for loop (simplified - assumes iterable is range)
354-
self.emit_indent();
355-
self.emit(&format!("for (int {} = 0; {} < ", f.var, f.var));
356-
self.gen_expr(&f.iterable);
357-
self.emit(&format!("; {}++) {{\n", f.var));
358-
self.indent();
359-
self.gen_block(&f.body);
360-
self.dedent();
361-
self.emit_line("}");
353+
match &f.iterable {
354+
Expr::Range(start, end, _) => {
355+
// Optimized C loop: for (int64_t i = start; i <= end; ++i)
356+
self.emit_indent();
357+
self.emit(&format!("for (int64_t {} = ", f.var));
358+
self.gen_expr(start);
359+
self.emit(&format!("; {} <= ", f.var));
360+
self.gen_expr(end);
361+
self.emit(&format!("; ++{}) {{\n", f.var));
362+
self.indent();
363+
self.gen_block(&f.body);
364+
self.dedent();
365+
self.emit_line("}");
366+
}
367+
_ => {
368+
// Default array iteration (simplified for C)
369+
// Assuming iterable is an array pointer or similar convention
370+
// This would typically rely on a runtime iterator or Array struct in C
371+
self.emit_indent();
372+
// Create unique iterator name
373+
let iter_name = format!("_iter_{}", f.var);
374+
self.emit(&format!("array_t* {} = ", iter_name));
375+
self.gen_expr(&f.iterable);
376+
self.emit(";\n");
377+
378+
self.emit_indent();
379+
self.emit(&format!("for (int64_t _i = 0; _i < {}->length; ++_i) {{\n", iter_name));
380+
self.indent();
381+
self.emit_indent();
382+
// Extract item
383+
self.emit(&format!("int64_t {} = {}->data[_i];\n", f.var, iter_name));
384+
self.gen_block(&f.body);
385+
self.dedent();
386+
self.emit_line("}");
387+
}
388+
}
362389
}
363390

364391
fn gen_expr(&mut self, expr: &Expr) {
@@ -377,6 +404,98 @@ impl CodeGen {
377404
self.gen_expr(operand);
378405
}
379406
Expr::Call(callee, args, _) => {
407+
// Check for UI widget function calls
408+
if let Expr::Identifier(name, _) = callee.as_ref() {
409+
match name.as_str() {
410+
// UI Widget constructors -> emit reox FFI calls
411+
"button" => {
412+
self.emit("reox_button_create(");
413+
for (i, arg) in args.iter().enumerate() {
414+
if i > 0 { self.emit(", "); }
415+
self.gen_expr(arg);
416+
}
417+
self.emit(")");
418+
return;
419+
}
420+
"text" | "label" => {
421+
self.emit("reox_label_create(");
422+
for (i, arg) in args.iter().enumerate() {
423+
if i > 0 { self.emit(", "); }
424+
self.gen_expr(arg);
425+
}
426+
self.emit(")");
427+
return;
428+
}
429+
"input" | "textfield" => {
430+
self.emit("reox_textfield_create(");
431+
for (i, arg) in args.iter().enumerate() {
432+
if i > 0 { self.emit(", "); }
433+
self.gen_expr(arg);
434+
}
435+
self.emit(")");
436+
return;
437+
}
438+
"slider" => {
439+
self.emit("reox_slider_create(");
440+
for (i, arg) in args.iter().enumerate() {
441+
if i > 0 { self.emit(", "); }
442+
self.gen_expr(arg);
443+
}
444+
self.emit(")");
445+
return;
446+
}
447+
"checkbox" => {
448+
self.emit("reox_checkbox_create(");
449+
for (i, arg) in args.iter().enumerate() {
450+
if i > 0 { self.emit(", "); }
451+
self.gen_expr(arg);
452+
}
453+
self.emit(")");
454+
return;
455+
}
456+
"vstack" => {
457+
self.emit("reox_vstack(");
458+
if !args.is_empty() {
459+
self.gen_expr(&args[0]);
460+
} else {
461+
self.emit("0");
462+
}
463+
self.emit(")");
464+
return;
465+
}
466+
"hstack" => {
467+
self.emit("reox_hstack(");
468+
if !args.is_empty() {
469+
self.gen_expr(&args[0]);
470+
} else {
471+
self.emit("0");
472+
}
473+
self.emit(")");
474+
return;
475+
}
476+
"window" => {
477+
self.emit("reox_window_create(");
478+
for (i, arg) in args.iter().enumerate() {
479+
if i > 0 { self.emit(", "); }
480+
self.gen_expr(arg);
481+
}
482+
self.emit(")");
483+
return;
484+
}
485+
// Theme colors -> emit directly
486+
"color_primary" => { self.emit("(rx_color){0, 122, 255, 255}"); return; }
487+
"color_secondary" => { self.emit("(rx_color){88, 86, 214, 255}"); return; }
488+
"color_success" => { self.emit("(rx_color){52, 199, 89, 255}"); return; }
489+
"color_warning" => { self.emit("(rx_color){255, 149, 0, 255}"); return; }
490+
"color_danger" => { self.emit("(rx_color){255, 59, 48, 255}"); return; }
491+
"color_background" => { self.emit("(rx_color){28, 28, 30, 255}"); return; }
492+
"color_surface" => { self.emit("(rx_color){44, 44, 46, 255}"); return; }
493+
"color_text" => { self.emit("(rx_color){255, 255, 255, 255}"); return; }
494+
// Standard function - emit as-is
495+
_ => {}
496+
}
497+
}
498+
// Default: emit as regular function call
380499
self.gen_expr(callee);
381500
self.emit("(");
382501
for (i, arg) in args.iter().enumerate() {
@@ -537,6 +656,14 @@ impl CodeGen {
537656
self.gen_expr(operand);
538657
self.emit(")");
539658
}
659+
Expr::Range(start, end, _) => {
660+
// Runtime call to create array from range
661+
self.emit("rx_range(");
662+
self.gen_expr(start);
663+
self.emit(", ");
664+
self.gen_expr(end);
665+
self.emit(")");
666+
}
540667
}
541668
}
542669

0 commit comments

Comments
 (0)