Skip to content

Commit

Permalink
special case for labels forms that contain only define/ defun/ defmacro
Browse files Browse the repository at this point in the history
  • Loading branch information
mayerrobert committed Nov 26, 2024
1 parent d2e5da5 commit 348e5e1
Show file tree
Hide file tree
Showing 3 changed files with 28 additions and 3 deletions.
25 changes: 24 additions & 1 deletion lambda/src/main/java/io/github/jmurmel/LambdaJ.java
Original file line number Diff line number Diff line change
Expand Up @@ -10176,7 +10176,30 @@ private ConsCell toplevelFormToJava(WrappingWriter ret, List<Object> 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: {
Expand Down
3 changes: 1 addition & 2 deletions lambda/todo.txt
Original file line number Diff line number Diff line change
@@ -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(..."

Expand Down
3 changes: 3 additions & 0 deletions lambda/todo_done.txt
Original file line number Diff line number Diff line change
Expand Up @@ -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

0 comments on commit 348e5e1

Please sign in to comment.