// Five FRB (Five Runtime Binary) Demo // Shows all FRB capabilities: file-based, in-memory compile, one-shot // Copyright (c) 2026 Charles KWON OhJun (charleskwonohjun@gmail.com) // // Build: five build examples/frb_demo.prg -o frb_demo // Prep: five frb examples/frb_mathlib.prg -o mathlib.frb // Run: ./frb_demo FUNCTION Main() ? "=========================================" ? " Five FRB (Five Runtime Binary) Demo" ? "=========================================" ? "" // ----------------------------------------------- // 1. Load pre-compiled FRB from file // ----------------------------------------------- ? "--- 1. File-based FRB ---" ? "" LOCAL pMath := FrbLoad("mathlib.frb") IF pMath = NIL ? " (skipped: mathlib.frb not found)" ? " Build it: five frb examples/frb_mathlib.prg -o mathlib.frb" ELSE ? " Loaded mathlib.frb" ? " CircleArea(5.0) =", FrbDo(pMath, "CIRCLEAREA", 5.0) ? " Fibonacci(10) =", FrbDo(pMath, "FIBONACCI", 10) ? " IsPrime(97) =", FrbDo(pMath, "ISPRIME", 97) FrbUnload(pMath) ? " Unloaded." ENDIF ? "" // ----------------------------------------------- // 2. Compile PRG source at runtime (in-memory) // ----------------------------------------------- ? "--- 2. In-Memory Compilation ---" ? "" LOCAL cSource := ; 'FUNCTION Reverse(cStr)' + Chr(10) + ; ' LOCAL i, cResult := ""' + Chr(10) + ; ' FOR i := Len(cStr) TO 1 STEP -1' + Chr(10) + ; ' cResult += SubStr(cStr, i, 1)' + Chr(10) + ; ' NEXT' + Chr(10) + ; ' RETURN cResult' + Chr(10) + ; 'FUNCTION Repeat(cStr, n)' + Chr(10) + ; ' RETURN Replicate(cStr, n)' + Chr(10) ? " Compiling PRG source at runtime..." LOCAL pStr := FrbCompile(cSource) IF pStr != NIL ? " Reverse('Hello') =", FrbDo(pStr, "REVERSE", "Hello") ? " Repeat('Go!', 3) =", FrbDo(pStr, "REPEAT", "Go!", 3) FrbUnload(pStr) ? " Unloaded." ELSE ? " ERROR: Compile failed" ENDIF ? "" // ----------------------------------------------- // 3. One-shot: compile + run + unload // ----------------------------------------------- ? "--- 3. One-Shot FrbExec ---" ? "" LOCAL cProgram := ; 'FUNCTION Main()' + Chr(10) + ; ' LOCAL i, nSum := 0' + Chr(10) + ; ' FOR i := 1 TO 100' + Chr(10) + ; ' nSum += i' + Chr(10) + ; ' NEXT' + Chr(10) + ; ' RETURN nSum' + Chr(10) ? " Sum of 1..100 =", FrbExec(cProgram) ? "" // ----------------------------------------------- // 4. Dynamic code with goroutine // ----------------------------------------------- ? "--- 4. Dynamic Code + Goroutine ---" ? "" LOCAL cAsync := ; 'FUNCTION Worker(ch, n)' + Chr(10) + ; ' ChSend(ch, n * n)' + Chr(10) + ; ' RETURN NIL' + Chr(10) LOCAL pAsync := FrbCompile(cAsync) IF pAsync != NIL LOCAL ch := Channel(1) Go("WORKER", ch, 7) ? " 7^2 from dynamic goroutine =", ChReceive(ch) FrbUnload(pAsync) ENDIF ? "" ? "=========================================" ? " Done! PRG code compiled at runtime" ? " and executed at native Go speed." ? "=========================================" RETURN NIL