Report Generator
Builds a formatted text report from data.
Example 073 of the basic Soma programs: a small, commented program that teaches one thing. Every output below was printed by soma 3.2.4 when this page was built.
How it is built
The cell ReportGenerator has no face and no memory. Handlers: run (line 21).
The source
073_report_generator.cell
// ============================================================================
// 073 — Report Generator
// ============================================================================
// Builds a formatted text report from data.
//
// Run: soma run 073_report_generator.cell run
// Expect:
// ========================================
// QUARTERLY REPORT
// ========================================
// Q1: revenue=1700, deals=2
// Q2: revenue=3300, deals=2
// Q3: revenue=2600, deals=3
// Q4: revenue=1050, deals=3
// ========================================
// TOTAL: 8650 across 10 deals
// ========================================
cell ReportGenerator {
on run() {
let sales = list(
map("rep", "Alice", "amount", 500, "quarter", "Q1"),
map("rep", "Bob", "amount", 1200, "quarter", "Q1"),
map("rep", "Carol", "amount", 2500, "quarter", "Q2"),
map("rep", "Alice", "amount", 800, "quarter", "Q2"),
map("rep", "Bob", "amount", 350, "quarter", "Q3"),
map("rep", "Carol", "amount", 1500, "quarter", "Q3"),
map("rep", "Alice", "amount", 750, "quarter", "Q3"),
map("rep", "Bob", "amount", 400, "quarter", "Q4"),
map("rep", "Carol", "amount", 400, "quarter", "Q4"),
map("rep", "Alice", "amount", 250, "quarter", "Q4")
)
let sep = "========================================"
print(sep)
print("QUARTERLY REPORT")
print(sep)
// Aggregate by quarter
let by_quarter = sales |> agg("quarter", "amount:sum") |> sort_by("quarter", "asc")
for row in by_quarter {
print("{row.quarter}: revenue={row.amount_sum}, deals={row.count}")
}
let total = sales |> sum_by("amount")
let deal_count = sales.length
print(sep)
print("TOTAL: {total} across {deal_count} deals")
print(sep)
return "done"
}
}What the toolchain says
$ soma check 073_report_generator.cell
✓ All checks passed.$ soma run 073_report_generator.cell run
========================================
QUARTERLY REPORT
========================================
Q1: revenue=1700, deals=2
Q2: revenue=3300, deals=2
Q3: revenue=2600, deals=3
Q4: revenue=1050, deals=3
========================================
TOTAL: 8650 across 10 deals
========================================
done