From 348e5e1c354ddbab3138383046e6e92ae66510f2 Mon Sep 17 00:00:00 2001 From: Robert Mayer Date: Tue, 26 Nov 2024 06:11:30 +0100 Subject: [PATCH] special case for labels forms that contain only define/ defun/ defmacro --- .../main/java/io/github/jmurmel/LambdaJ.java | 25 ++++++++++++++++++- lambda/todo.txt | 3 +-- lambda/todo_done.txt | 3 +++ 3 files changed, 28 insertions(+), 3 deletions(-) diff --git a/lambda/src/main/java/io/github/jmurmel/LambdaJ.java b/lambda/src/main/java/io/github/jmurmel/LambdaJ.java index 22c3dc2e..06679750 100644 --- a/lambda/src/main/java/io/github/jmurmel/LambdaJ.java +++ b/lambda/src/main/java/io/github/jmurmel/LambdaJ.java @@ -10176,7 +10176,30 @@ private ConsCell toplevelFormToJava(WrappingWriter ret, List bodyForms, return globalEnv; } - case sLabels: + case sLabels: { + if (!complexFormSeen) { + final ConsCell ccBodyForms = (ConsCell)cddr(ccForm); + globalEnv = toplevelLetBody(ret, globals, globalEnv, ccBodyForms, 1); + for (Object bodyForm : ccBodyForms) { + if (consp(bodyForm)) { + final Object bodyFormOp = car(bodyForm); + if (bodyFormOp != sDefine && bodyFormOp != intern(DEFUN) && bodyFormOp != intern(DEFMACRO)) { + complexFormSeen = true; + bodyForms.add(ccForm); + return globalEnv; + } + } + } + + // body of labels form contains only define/ defun/ defmacro + ret.append(" {\n "); + emitLabels(ret, (ConsCell)cdr(ccForm), globalEnv, globalEnv, 1, false); + ret.append(";\n }\n\n"); + return globalEnv; + } + // else fallthrough + } + case sLet: case sLetStar: case sLetrec: { diff --git a/lambda/todo.txt b/lambda/todo.txt index 955a6615..2b18dfc2 100755 --- a/lambda/todo.txt +++ b/lambda/todo.txt @@ -1,5 +1,4 @@ -toplevel labels wird in runBody() reingeneriert, folgende defuns bekommen nicht mehr die sonderbehandlung dass kein "defun_...()" nötig ist --> toplevel labels die keinen normalen code enthalten (nur define/ defun/ defmacro/ macrolet/ labels) irgendwie aus runBody rausheben +emitLabels könnte bei labels forms die nur atoms und defmacro enthalten die lokalen funktionen weglassen und nur den body in ein progn reingenerieren wie gross wird eigentlich der constructor der generierten MurmelProgram, mit den vielen "public CompilerGlobal _caar = new CompilerGlobal(..." diff --git a/lambda/todo_done.txt b/lambda/todo_done.txt index fe219648..ca1e46ef 100755 --- a/lambda/todo_done.txt +++ b/lambda/todo_done.txt @@ -2904,3 +2904,6 @@ JMurmel> define/ defun und defmacro sollte in labels erlaubt sein -> define/ defun geht + +toplevel labels wird in runBody() reingeneriert, folgende defuns bekommen nicht mehr die sonderbehandlung dass kein "defun_...()" nötig ist +-> toplevel labels die keinen normalen code enthalten (nur define/ defun/ defmacro/ macrolet/ labels) irgendwie aus runBody rausheben