From c96b1c2faf8c31bbe38f31714e2c6432fc9a81e6 Mon Sep 17 00:00:00 2001 From: Dsm0 Date: Mon, 19 Jan 2026 01:15:55 -0800 Subject: [PATCH] fixed anonymous label casing --- packages/core/repl.mjs | 21 ++++++++++++--------- 1 file changed, 12 insertions(+), 9 deletions(-) diff --git a/packages/core/repl.mjs b/packages/core/repl.mjs index 8d023c72b..3ff43e2f0 100644 --- a/packages/core/repl.mjs +++ b/packages/core/repl.mjs @@ -473,15 +473,12 @@ export function repl({ const labels = meta.labels || []; + // Check for anonymous labels (labels starting with '$') + const hasAnonymousLabel = labels.some((label) => label.name.startsWith('$')); + // Store code blocks in dictionary using labels as keys - if (labels.length > 0) { - for (let i = 0; i < labels.length; i++) { - // processing transpiler output instead of code is simply to avoid - // extra regex in detecting whether or not an inline widget has been commented out - processLabeledBlock(labels, i, meta.output, options, meta); - } - } else if (pattern !== silence) { - // variable/function declarations that return silence are allowed, + if (hasAnonymousLabel) { + // variable/function declarations that don't return patterns are allowed, // but anonymous pattern blocks pose an issue for block-based evaluation // if an anonymous pattern is evaluated multiple times it will just stack and get louder and louder @@ -490,11 +487,17 @@ export function repl({ // otherwise we'll have no idea of which pattern is being overridden // (we probably need to update the docs on this) - // we could easily enable it, but it would confuse a lot of people + throw new Error( 'anonymous labels disabled for block based evaluation (see https://strudel.cc/blog/#label-notation)', ); + } else if (labels.length > 0) { + for (let i = 0; i < labels.length; i++) { + // processing transpiler output instead of code is simply to avoid + // extra regex in detecting whether or not an inline widget has been commented out + processLabeledBlock(labels, i, meta.output, options, meta); + } } else { // Declaration block (variable/function that returns silence) // Store it so its miniLocations are preserved for highlighting patterns stored in variables