From 3a3e25c6c7b0338ae9593b4578482867196f4a3a Mon Sep 17 00:00:00 2001 From: Maxwell Jeffress Date: Sat, 28 Feb 2026 17:16:51 +1100 Subject: [PATCH] Lambdas now work as expected --- src/codegen/codegen.c | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/codegen/codegen.c b/src/codegen/codegen.c index 672bedf..319aa84 100644 --- a/src/codegen/codegen.c +++ b/src/codegen/codegen.c @@ -692,6 +692,8 @@ ResultType(GroundProgram, charptr) generateLambdaNode(SolsNode* node, SolsScope* char* lambdaId = malloc(sizeof(char) * 64); snprintf(lambdaId, 64, "__SOLS_LAMBDA_%zu", scope->tmpCounter++); + node->accessArg = groundCreateReference(VALREF, lambdaId); + groundAddReferenceToInstruction(&signature, groundCreateReference(FNREF, lambdaId)); ResultType(GroundArg, charptr) arg = createGroundArgFromSolsType(node->as.type.returnType); if (arg.error) { @@ -712,8 +714,19 @@ ResultType(GroundProgram, charptr) generateLambdaNode(SolsNode* node, SolsScope* groundAddInstructionToProgram(&gp, signature); + // Create a scope for lambda arguments + // Lambdas do NOT have access to external state + SolsScope lambdaScope = { + .variables = NULL, + .tmpCounter = 0 + }; + + for (size_t i = 0; i < node->as.type.children.count; i++) { + addVariableToScope(&lambdaScope, node->as.type.children.at[i].name, node->as.type.children.at[i].type); + } + // Generate children and add then to this program - ResultType(GroundProgram, charptr) bodyCode = generateCode(&node->children.at[0], scope); + ResultType(GroundProgram, charptr) bodyCode = generateCode(&node->children.at[0], &lambdaScope); if (bodyCode.error) return bodyCode; for (size_t i = 0; i < bodyCode.as.success.size; i++) { groundAddInstructionToProgram(&gp, bodyCode.as.success.instructions[i]);