@@ -184,9 +184,9 @@ addGlobalHelp mode graph global state =
184 Opt.Link linkedGlobal ->
184 Opt.Link linkedGlobal ->
185 addGlobal mode graph state linkedGlobal
185 addGlobal mode graph state linkedGlobal
187− Opt.Cycle values functions deps ->
187+ Opt.Cycle names values functions deps ->
188 addStmt (addDeps deps state) (
188 addStmt (addDeps deps state) (
189− generateCycle mode global values functions
189+ generateCycle mode global names values functions
192 Opt.Manager effectsType ->
192 Opt.Manager effectsType ->
@@ -253,14 +253,28 @@ isDebugger (Opt.Global (ModuleName.Canonical _ home) _) =
253-- GENERATE CYCLES
253-- GENERATE CYCLES
256−generateCycle :: Mode.Mode -> Opt.Global -> [(N.Name, Opt.Expr)] -> [Opt.Def] -> JS.Stmt
256+generateCycle :: Mode.Mode -> Opt.Global -> [N.Name] -> [(N.Name, Opt.Expr)] -> [Opt.Def] -> JS.Stmt
257−generateCycle mode (Opt.Global home _) values functions =
257+generateCycle mode (Opt.Global home _) names values functions =
259− funcDefs = map (generateCycleFunc mode home) functions
259+ funcBlock = JS.Block $ map (generateCycleFunc mode home) functions
260− safeDefs = map (generateSafeCycle mode home) values
260+ safeBlock = JS.Block $ map (generateSafeCycle mode home) values
261− realDefs = map (generateRealCycle home) values
261+ realBlock = JS.Block $ map (generateRealCycle home) values
263− JS.Block (funcDefs ++ safeDefs ++ realDefs)
263+ case mode of
265+ JS.Block [ funcBlock, safeBlock, realBlock ]
270+ JS.Try realBlock Name.dollar $ JS.Throw $ JS.String $
271+ "Some top-level definitions from `" <> N.toBuilder (ModuleName._module home) <> "` are causing infinite recursion:\\n"
273+ <> "\\n\\nThese errors are very tricky, so read "
274+ <> B.stringUtf8 (D.makeNakedLink "halting-problem")
275+ <> " to learn how to fix it!"
277+ JS.Block [ funcBlock, safeBlock, tryRealBlock ]
266generateCycleFunc :: Mode.Mode -> ModuleName.Canonical -> Opt.Def -> JS.Stmt
280generateCycleFunc :: Mode.Mode -> ModuleName.Canonical -> Opt.Def -> JS.Stmt
@@ -292,6 +306,17 @@ generateRealCycle home (name, _) =
309+drawCycle :: [N.Name] -> B.Builder
312+ topLine = "\\n ┌─────┐"
313+ nameLine name = "\\n │ " <> N.toBuilder name
315+ bottomLine = "\\n └─────┘"
317+ mconcat (topLine : List.intersperse midLine (map nameLine names) ++ [ bottomLine ])
296-- GENERATE KERNEL
321-- GENERATE KERNEL