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:
@@ -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):',
|
||||
|
||||
Reference in New Issue
Block a user