soma.cell

E1006: nesting_too_deep

E1006 nesting_too_deep — expressions or blocks nested too deeply.

A compile-time error of soma check, the checker of the Soma programming language (soma explain E1006).

The rule

The parser refuses expressions and blocks nested more than 400 levels deep, counting expressions and blocks together. The limit keeps the compiler from exhausting its stack on generated code. Flatten the expression, compute it differently, or split it into let bindings or a helper handler; here 420 nested (... + fee) become base + 420 * fee.

A program that triggers it

wrong.cell

cell Billing {
    // generated: one fee per line item, folded into a single expression
    on total(base: Int, fee: Int) {
        return ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((base + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee)
    }
}

What soma check prints:

$ soma check wrong.cell
error: nested more than 400 levels deep (expressions and blocks together) — split it into `let` bindings or a helper handler
  --> wrong.cell:4:215
  |
4 | …((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((…
  |                                                              ^
  = code: E1006

On line 2, // generated: one fee per line item, folded into a single expression becomes // generated: one fee per line item, 420 line items; on line 4, return ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((base + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) becomes return base + 420 * fee.

wrong.cell → right.cell

--- wrong.cell
+++ right.cell
@@ -1,6 +1,6 @@
 cell Billing {
-    // generated: one fee per line item, folded into a single expression
+    // generated: one fee per line item, 420 line items
     on total(base: Int, fee: Int) {
-        return ((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((((base + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee) + fee)
+        return base + 420 * fee
     }
 }

With the fix, soma check accepts the program:

$ soma check right.cell
✓ All checks passed.