feat: implement evidence passing for O(1) effect handler lookup
Interpreter changes: - Add evidence HashMap for O(1) handler lookup instead of O(n) stack search - Update eval_run to manage evidence when entering/exiting run blocks - Modify handle_effect to use evidence.get() instead of stack iteration C backend infrastructure: - Add handler structs (LuxConsoleHandler, LuxStateHandler, LuxReaderHandler) - Add LuxEvidence struct containing pointers to all handlers - Add default handlers that delegate to built-in implementations - Add Console.readLine built-in implementation Documentation: - Create docs/EVIDENCE_PASSING.md explaining design and implementation - Update docs/C_BACKEND.md with current progress Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
@@ -379,12 +379,78 @@ impl CBackend {
|
||||
self.writeln(" return strstr(haystack, needle) != NULL;");
|
||||
self.writeln("}");
|
||||
self.writeln("");
|
||||
self.writeln("// === Console Effect (built-in) ===");
|
||||
self.writeln("// === Built-in Effect Implementations ===");
|
||||
self.writeln("");
|
||||
self.writeln("static void lux_console_print(LuxString msg) {");
|
||||
self.writeln(" printf(\"%s\\n\", msg);");
|
||||
self.writeln("}");
|
||||
self.writeln("");
|
||||
self.writeln("static LuxString lux_console_readLine(void) {");
|
||||
self.writeln(" char buffer[4096];");
|
||||
self.writeln(" if (fgets(buffer, sizeof(buffer), stdin)) {");
|
||||
self.writeln(" size_t len = strlen(buffer);");
|
||||
self.writeln(" if (len > 0 && buffer[len-1] == '\\n') buffer[len-1] = '\\0';");
|
||||
self.writeln(" return strdup(buffer);");
|
||||
self.writeln(" }");
|
||||
self.writeln(" return strdup(\"\");");
|
||||
self.writeln("}");
|
||||
self.writeln("");
|
||||
self.writeln("// === Evidence Passing Types ===");
|
||||
self.writeln("// These enable O(1) effect handler lookup instead of O(n) stack search.");
|
||||
self.writeln("// See docs/EVIDENCE_PASSING.md for details.");
|
||||
self.writeln("");
|
||||
self.writeln("// Handler struct for Console effect");
|
||||
self.writeln("typedef struct {");
|
||||
self.writeln(" void (*print)(void* env, LuxString msg);");
|
||||
self.writeln(" LuxString (*readLine)(void* env);");
|
||||
self.writeln(" void* env;");
|
||||
self.writeln("} LuxConsoleHandler;");
|
||||
self.writeln("");
|
||||
self.writeln("// Handler struct for State effect");
|
||||
self.writeln("typedef struct {");
|
||||
self.writeln(" void* (*get)(void* env);");
|
||||
self.writeln(" void (*put)(void* env, void* value);");
|
||||
self.writeln(" void* env;");
|
||||
self.writeln("} LuxStateHandler;");
|
||||
self.writeln("");
|
||||
self.writeln("// Handler struct for Reader effect");
|
||||
self.writeln("typedef struct {");
|
||||
self.writeln(" void* (*ask)(void* env);");
|
||||
self.writeln(" void* env;");
|
||||
self.writeln("} LuxReaderHandler;");
|
||||
self.writeln("");
|
||||
self.writeln("// Evidence struct - passed to effectful functions");
|
||||
self.writeln("// Contains pointers to current handlers for each effect type");
|
||||
self.writeln("typedef struct {");
|
||||
self.writeln(" LuxConsoleHandler* console;");
|
||||
self.writeln(" LuxStateHandler* state;");
|
||||
self.writeln(" LuxReaderHandler* reader;");
|
||||
self.writeln("} LuxEvidence;");
|
||||
self.writeln("");
|
||||
self.writeln("// Default Console handler using built-in implementations");
|
||||
self.writeln("static void default_console_print(void* env, LuxString msg) {");
|
||||
self.writeln(" (void)env;");
|
||||
self.writeln(" lux_console_print(msg);");
|
||||
self.writeln("}");
|
||||
self.writeln("");
|
||||
self.writeln("static LuxString default_console_readLine(void* env) {");
|
||||
self.writeln(" (void)env;");
|
||||
self.writeln(" return lux_console_readLine();");
|
||||
self.writeln("}");
|
||||
self.writeln("");
|
||||
self.writeln("static LuxConsoleHandler default_console_handler = {");
|
||||
self.writeln(" .print = default_console_print,");
|
||||
self.writeln(" .readLine = default_console_readLine,");
|
||||
self.writeln(" .env = NULL");
|
||||
self.writeln("};");
|
||||
self.writeln("");
|
||||
self.writeln("// Default evidence with built-in handlers");
|
||||
self.writeln("static LuxEvidence default_evidence = {");
|
||||
self.writeln(" .console = &default_console_handler,");
|
||||
self.writeln(" .state = NULL,");
|
||||
self.writeln(" .reader = NULL");
|
||||
self.writeln("};");
|
||||
self.writeln("");
|
||||
self.writeln("// === List Types ===");
|
||||
self.writeln("");
|
||||
self.writeln("typedef struct {");
|
||||
|
||||
Reference in New Issue
Block a user