Separate eval from render: render-active? gate in eval-list

eval-list only dispatches to the render adapter when render-active? is true.
render-to-html and aser set render-active! on entry. Pure evaluate() calls
no longer stringify component results through the render adapter.

Fixes component children parity: (defcomp ~wrap (&key &rest children) children)
now returns [1,2,3] in eval mode, renders to "123" only in render mode.

Parity: 112/116 pass (remaining 4 are hand-written evaluator.py bugs).

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
2026-03-11 03:42:04 +00:00
parent 0a7a9aa5ae
commit f54ebf26f8
5 changed files with 56 additions and 13 deletions

View File

@@ -524,6 +524,19 @@ def is_render_expr(expr):
# Render dispatch -- set by adapter
_render_expr_fn = None
# Render mode flag -- set by render-to-html/aser, checked by eval-list
# When false, render expressions (HTML tags, components) fall through to eval-call
_render_mode = False
def render_active_p():
return _render_mode
def set_render_active_b(val):
global _render_mode
_render_mode = bool(val)
def render_expr(expr, env):
if _render_expr_fn:
@@ -1342,9 +1355,14 @@ def public_api_py(has_html: bool, has_sx: bool, has_deps: bool = False) -> str:
'',
'def render(expr, env=None):',
' """Render expr to HTML string."""',
' global _render_mode',
' if env is None:',
' env = {}',
' return render_to_html(expr, env)',
' try:',
' _render_mode = True',
' return render_to_html(expr, env)',
' finally:',
' _render_mode = False',
'',
'',
'def make_env(**kwargs):',