# control_flow URL: /api/compiler/statements/control_flow/ Section: statements -------------------------------------------------------------------------------- control_flow - Kida window.BENGAL_THEME_DEFAULTS = { appearance: 'light', palette: 'brown-bengal' }; window.Bengal = window.Bengal || {}; window.Bengal.enhanceBaseUrl = '/kida/assets/js/enhancements'; window.Bengal.watchDom = true; window.Bengal.debug = false; window.Bengal.enhanceUrls = { 'toc': '/kida/assets/js/enhancements/toc.632a9783.js', 'docs-nav': '/kida/assets/js/enhancements/docs-nav.57e4b129.js', 'tabs': '/kida/assets/js/enhancements/tabs.aac9e817.js', 'lightbox': '/kida/assets/js/enhancements/lightbox.1ca22aa1.js', 'interactive': '/kida/assets/js/enhancements/interactive.fc077855.js', 'mobile-nav': '/kida/assets/js/enhancements/mobile-nav.d991657f.js', 'action-bar': '/kida/assets/js/enhancements/action-bar.d62417f4.js', 'copy-link': '/kida/assets/js/enhancements/copy-link.7d9a5c29.js', 'data-table': '/kida/assets/js/enhancements/data-table.1f5bc1eb.js', 'lazy-loaders': '/kida/assets/js/enhancements/lazy-loaders.a5c38245.js', 'holo': '/kida/assets/js/enhancements/holo.ee13c841.js', 'link-previews': '/kida/assets/js/enhancements/link-previews.8d906535.js' }; (function () { try { var defaults = window.BENGAL_THEME_DEFAULTS || { appearance: 'system', palette: '' }; var defaultAppearance = defaults.appearance; if (defaultAppearance === 'system') { defaultAppearance = (window.matchMedia && window.matchMedia('(prefers-color-scheme: dark)').matches) ? 'dark' : 'light'; } var storedTheme = localStorage.getItem('bengal-theme'); var storedPalette = localStorage.getItem('bengal-palette'); var theme = storedTheme ? (storedTheme === 'system' ? defaultAppearance : storedTheme) : defaultAppearance; var palette = storedPalette ?? defaults.palette; document.documentElement.setAttribute('data-theme', theme); if (palette) { document.documentElement.setAttribute('data-palette', palette); } } catch (e) { document.documentElement.setAttribute('data-theme', 'light'); } })(); { "prerender": [ { "where": { "and": [ { "href_matches": "/docs/*" }, { "not": { "selector_matches": "[data-external], [target=_blank], .external" } } ] }, "eagerness": "conservative" } ], "prefetch": [ { "where": { "and": [ { "href_matches": "/*" }, { "not": { "selector_matches": "[data-external], [target=_blank], .external" } } ] }, "eagerness": "conservative" } ] } Skip to main content Magnifying Glass ESC Recent Clear Magnifying Glass No results for "" Start typing to search... ↑↓ Navigate ↵ Open ESC Close Powered by Lunr )彡 DocumentationInfoAboutArrow ClockwiseGet StartedCodeSyntaxTerminalUsageNoteTutorialsStarburstExtendingBookmarkReferenceTroubleshootingReleasesDevGitHubKida API Reference Magnifying Glass Search ⌘K Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal List )彡 Magnifying Glass Search X Close Documentation Caret Down Info About Arrow Clockwise Get Started Code Syntax Terminal Usage Note Tutorials Starburst Extending Bookmark Reference Troubleshooting Releases Dev Caret Down GitHub Kida API Reference Palette Appearance Chevron Down Mode Monitor System Sun Light Moon Dark Palette Snow Lynx Brown Bengal Silver Bengal Charcoal Bengal Blue Bengal Kida API Reference Caret Right Analysis analyzer cache config dependencies landmarks metadata purity roles Caret Right Compiler Caret Right Statements basic control_flow functions special_blocks template_structure variables _protocols coalescing core expressions utils Caret Right Environment core exceptions filters loaders protocols registry tests Caret Right Parser Caret Right Blocks control_flow core functions special_blocks template_structure variables _protocols core errors expressions statements tokens Caret Right Utils html lru_cache workers _types bytecode_cache kida lexer nodes template tstring CompilerStatements ᗢ Caret Down Link Copy URL External Open LLM text Copy Copy LLM text Share with AI Ask Claude Ask ChatGPT Ask Gemini Ask Copilot Module compiler.statements.control_flow Control flow statement compilation for Kida compiler. Provides mixin for compiling control flow statements (if, for). Uses inline TYPE_CHECKING declarations for host attributes. See: plan/rfc-mixin-protocol-typing.md 1Class Classes ControlFlowMixin 10 ▼ Mixin for compiling control flow statements. Host attributes and cross-mixin dependencies are decl… Mixin for compiling control flow statements. Host attributes and cross-mixin dependencies are declared via inline TYPE_CHECKING blocks. Methods Internal Methods 10 ▼ _wrap_with_scope 1 list[ast.stmt] ▼ Wrap statements with scope push/pop for block-scoped variables. Generates: … def _wrap_with_scope(self, body_stmts: list[ast.stmt]) -> list[ast.stmt] Wrap statements with scope push/pop for block-scoped variables. Generates: _scope_stack.append({}) ... body statements ... _scope_stack.pop() Parameters Name Type Description body_stmts — Returns list[ast.stmt] _compile_break 1 list[ast.stmt] ▼ Compile {% break %} loop control. Part of RFC: kida-modern-syntax-features. def _compile_break(self, node: Any) -> list[ast.stmt] Parameters Name Type Description node — Returns list[ast.stmt] _compile_continue 1 list[ast.stmt] ▼ Compile {% continue %} loop control. Part of RFC: kida-modern-syntax-features. def _compile_continue(self, node: Any) -> list[ast.stmt] Compile {% continue %} loop control. Part of RFC: kida-modern-syntax-features. Parameters Name Type Description node — Returns list[ast.stmt] _compile_while 1 list[ast.stmt] ▼ Compile {% while cond %}...{% end %} loop. **Generates:** while condition: … def _compile_while(self, node: Any) -> list[ast.stmt] Compile {% while cond %}...{% end %} loop. Generates: while condition: ... body ... Part of RFC: kida-2.0-moonshot (While Loops). Parameters Name Type Description node — Returns list[ast.stmt] _compile_if 1 list[ast.stmt] ▼ Compile {% if %} conditional. def _compile_if(self, node: Any) -> list[ast.stmt] Parameters Name Type Description node — Returns list[ast.stmt] _uses_loop_variable 1 bool ▼ Check if any node in the tree references the 'loop' variable. This enables laz… def _uses_loop_variable(self, nodes: Any) -> bool Check if any node in the tree references the 'loop' variable. This enables lazy LoopContext optimization: when loop.index, loop.first, etc. are not used, we can skip creating the LoopContext wrapper and iterate directly over the items (16% faster per benchmark). Parameters Name Type Description nodes — A node or sequence of nodes to check Returns bool True if 'loop' is referenced anywhere in the tree _compile_for 1 list[ast.stmt] ▼ Compile {% for %} loop with optional LoopContext. Generates one of two forms b… def _compile_for(self, node: Any) -> list[ast.stmt] Compile {% for %} loop with optional LoopContext. Generates one of two forms based on whether loop.* is used: When loop.* IS used (loop.index, loop.first, etc.): _iter_source = iterable _loop_items = list(_iter_source) if _iter_source is not None else [] if _loop_items: loop = _LoopContext(_loop_items) for item in loop: ... body ... else: ... empty block ... When loop.* is NOT used (16% faster): _iter_source = iterable _loop_items = list(_iter_source) if _iter_source is not None else [] if _loop_items: for item in _loop_items: ... body ... else: ... empty block ... Optimization: Loop variables are tracked as locals and accessed directly (O(1) LOAD_FAST) instead of through ctx dict lookup. Parameters Name Type Description node — Returns list[ast.stmt] _extract_names 1 list[str] ▼ Extract variable names from a target expression. def _extract_names(self, node: Any) -> list[str] Parameters Name Type Description node — Returns list[str] _compile_match 1 list[ast.stmt] ▼ Compile {% match expr %}{% case pattern [if guard] %}...{% end %}. Generates c… def _compile_match(self, node: Any) -> list[ast.stmt] Compile {% match expr %}{% case pattern [if guard] %}...{% end %}. Generates chained if/elif comparisons with structural pattern matching and variable binding support. Generates: _match_subject_N = (site.logo, site.logo_text) if isinstance(_match_subject_N, (list, tuple)) and len(_match_subject_N) == 2: logo = _match_subject_N[0] if logo: ... Parameters Name Type Description node — Returns list[ast.stmt] _make_pattern_match 2 tuple[ast.expr, list[tup… ▼ Generate match test and bindings for a pattern. def _make_pattern_match(self, pattern: Any, subject_ast: ast.expr) -> tuple[ast.expr, list[tuple[str, ast.expr]]] Parameters Name Type Description pattern — subject_ast — Returns tuple[ast.expr, list[tuple[str, ast.expr]]] (test_ast, [(name, value_ast), ...]) ← Previous basic Next → functions List © 2026 Kida built in ᓚᘏᗢ { "linkPreviews": { "enabled": true, "hoverDelay": 200, "hideDelay": 150, "showSection": true, "showReadingTime": true, "showWordCount": true, "showDate": true, "showTags": true, "maxTags": 3, "includeSelectors": [".prose"], "excludeSelectors": ["nav", ".toc", ".breadcrumb", ".pagination", ".card", "[class*='-card']", ".tab-nav", "[class*='-widget']", ".child-items", ".content-tiles"], "allowedHosts": [], "allowedSchemes": ["https"], "hostFailureThreshold": 3 } } window.BENGAL_LAZY_ASSETS = { tabulator: '/kida/assets/js/tabulator.min.js', dataTable: '/kida/assets/js/data-table.js', mermaidToolbar: '/kida/assets/js/mermaid-toolbar.9de5abba.js', mermaidTheme: '/kida/assets/js/mermaid-theme.344822c5.js', graphMinimap: '/kida/assets/js/graph-minimap.ff04e939.js', graphContextual: '/kida/assets/js/graph-contextual.355458ba.js' }; window.BENGAL_ICONS = { close: '/kida/assets/icons/close.911d4fe1.svg', enlarge: '/kida/assets/icons/enlarge.652035e5.svg', copy: '/kida/assets/icons/copy.3d56e945.svg', 'download-svg': '/kida/assets/icons/download.04f07e1b.svg', 'download-png': '/kida/assets/icons/image.c34dfd40.svg', 'zoom-in': '/kida/assets/icons/zoom-in.237b4a83.svg', 'zoom-out': '/kida/assets/icons/zoom-out.38857c77.svg', reset: '/kida/assets/icons/reset.d26dba29.svg' }; Arrow Up -------------------------------------------------------------------------------- Metadata: - Word Count: 1112 - Reading Time: 6 minutes