From c1ce8eb719a95b22fea8e6220bf407d2eb7447b3 Mon Sep 17 00:00:00 2001
From: Marvin Borner
Date: Mon, 22 May 2023 12:31:05 +0200
Subject: Changed order of abstraction and application encodings

This gives some minor space improvements as almost all abstractions
imply a following application but not so much with applications.
At least by case-analysis :)
---
 makefile          |   2 +-
 readme.md         |  13 ++--
 src/build.c       |   2 +-
 src/parse.c       |  12 ++--
 test/aoc.blc.dump | 188 +++++++++++++++++++++++++++---------------------------
 test/fac.blc.dump |  64 +++++++++----------
 6 files changed, 142 insertions(+), 139 deletions(-)

diff --git a/makefile b/makefile
index 5575ae5..0431d3c 100644
--- a/makefile
+++ b/makefile
@@ -10,7 +10,7 @@ INC = ${CURDIR}/inc
 SRCS = $(wildcard $(SRC)/*.c)
 OBJS = $(patsubst $(SRC)/%.c, $(BUILD)/%.o, $(SRCS))
 
-CFLAGS_DEBUG = -Wno-error -g -O0 -Wno-unused -fsanitize=address,undefined,leak
+CFLAGS_DEBUG = -fsanitize=leak
 CFLAGS_WARNINGS = -Wall -Wextra -Wshadow -Wpointer-arith -Wwrite-strings -Wredundant-decls -Wnested-externs -Wmissing-declarations -Wstrict-prototypes -Wmissing-prototypes -Wcast-qual -Wswitch-default -Wswitch-enum -Wunreachable-code -Wundef -Wold-style-definition -pedantic -Wno-switch-enum
 CFLAGS = $(CFLAGS_WARNINGS) -std=c99 -Ofast -I$(INC)
 
diff --git a/readme.md b/readme.md
index 2ce8f3d..c38d889 100644
--- a/readme.md
+++ b/readme.md
@@ -13,20 +13,20 @@ first show you some results:
 1.  x86 C compiler [8cc](https://github.com/rui314/8cc) translated [to
     lambda calculus](https://github.com/woodrush/lambda-8cc):
     - the original expression takes ~5M bytes in bit-encoded BLC
-    - the same expression in BLoC needs only ~650K bytes (which is
+    - the same expression in BLoC needs only ~640K bytes (which is
       around 2x the original 8cc!)
 2.  The [bruijn](https://github.com/marvinborner/bruijn) expression
     `fac (+30)`, where `fac` is the factorial implementation from
     `std/Math`:
     - the original expression takes 1200 bytes in bit-encoded BLC
-    - the same expression in BLoC needs only 348 bytes
+    - the same expression in BLoC needs only 349 bytes
 3.  [My
     solution](https://github.com/marvinborner/bruijn/blob/main/samples/aoc/2022/01/solve.bruijn)
     for the “Advent of Code” challenge
     [2022/01](https://adventofcode.com/2022/day/1) in
     [bruijn](https://github.com/marvinborner/bruijn):
     - the original expression takes 6258 bytes in bit-encoded BLC
-    - the same expression in BLoC needs only 946 bytes
+    - the same expression in BLoC needs only 935 bytes
 
 You can find these examples in `test/`.
 
@@ -50,8 +50,8 @@ following derivation of normal bit-encoded BLC:
 
 | prefix           | content                       |
 |:-----------------|:------------------------------|
-| 00M              | abstraction of expression `M` |
-| 010MN            | application of `M` and `N`    |
+| 010M             | abstraction of expression `M` |
+| 00MN             | application of `M` and `N`    |
 | 1<sup>i+1</sup>0 | bruijn index `i`              |
 | 011I             | index\* to an entry           |
 
@@ -84,6 +84,9 @@ Even in this small example BLoC uses less space than BLC (0x34 vs. 0x42
 bytes). Depending on the content of `M` and `N`, this could have
 potentially been compressed even more.
 
+You can dump the bloc table using the `-d/--dump` flag of `bloc`. Some
+additional dumps for testing can also be found in `test/`.
+
 ## Optimizer
 
 The optimizer converts a normal BLC expression to the BLoC format.
diff --git a/src/build.c b/src/build.c
index 4c26e69..50b565b 100644
--- a/src/build.c
+++ b/src/build.c
@@ -26,12 +26,12 @@ static void rec_write_bblc(struct tree *tree, FILE *file, char *byte, int *bit)
 	switch (tree->type) {
 	case ABS:
 		write_bit(0, file, byte, bit);
+		write_bit(1, file, byte, bit);
 		write_bit(0, file, byte, bit);
 		rec_write_bblc(tree->u.abs.term, file, byte, bit);
 		break;
 	case APP:
 		write_bit(0, file, byte, bit);
-		write_bit(1, file, byte, bit);
 		write_bit(0, file, byte, bit);
 		rec_write_bblc(tree->u.app.lhs, file, byte, bit);
 		rec_write_bblc(tree->u.app.rhs, file, byte, bit);
diff --git a/src/parse.c b/src/parse.c
index 5f00ffa..7051dd8 100644
--- a/src/parse.c
+++ b/src/parse.c
@@ -46,19 +46,19 @@ struct term *parse_blc(const char *term)
 #define BIT_AT(i) ((term[(i) / 8] & (1 << (7 - ((i) % 8)))) >> (7 - ((i) % 8)))
 
 // parses bloc's bit-encoded blc
-// 00M -> abstraction of M
-// 010MN -> application of M and N
+// 010M -> abstraction of M
+// 00MN -> application of M and N
 // 1X0 -> bruijn index, amount of 1s in X
 // 011I -> 2B index to entry
 static struct term *parse_bloc_bblc(const char *term, size_t *bit)
 {
 	struct term *res = 0;
-	if (!BIT_AT(*bit) && !BIT_AT(*bit + 1)) {
-		(*bit) += 2;
+	if (!BIT_AT(*bit) && BIT_AT(*bit + 1) && !BIT_AT(*bit + 2)) {
+		(*bit) += 3;
 		res = new_term(ABS);
 		res->u.abs.term = parse_bloc_bblc(term, bit);
-	} else if (!BIT_AT(*bit) && BIT_AT(*bit + 1) && !BIT_AT(*bit + 2)) {
-		(*bit) += 3;
+	} else if (!BIT_AT(*bit) && !BIT_AT(*bit + 1)) {
+		(*bit) += 2;
 		res = new_term(APP);
 		res->u.app.lhs = parse_bloc_bblc(term, bit);
 		res->u.app.rhs = parse_bloc_bblc(term, bit);
diff --git a/test/aoc.blc.dump b/test/aoc.blc.dump
index 0cc6113..f5ecf68 100644
--- a/test/aoc.blc.dump
+++ b/test/aoc.blc.dump
@@ -1,100 +1,100 @@
 
 === START BLOC ===
 | entries:	95
-| entry 93:	[[[[(1 3)]]]]
-| entry 92:	(<20> 1)
-| entry 91:	((<9> (<2> [[[(<1> (((<18> <8>) [0]) <42>))]]])) <6>)
-| entry 90:	((3 0) [[0]])
-| entry 89:	(<0> <92>)
-| entry 88:	([(0 0)] [[((<46> [(<38> <76>)]) [(<22> <76>)])]])
-| entry 87:	((0 [[0]]) [[1]])
-| entry 86:	(2 (<39> 1))
-| entry 85:	((3 0) [[[1]]])
-| entry 84:	((3 0) [[1]])
-| entry 83:	[[[[[(((4 1) 0) <41>)]]]]]
-| entry 82:	((<19> <49>) [[[[(((3 2) 0) 1)]]]])
-| entry 81:	(<10> <85>)
-| entry 80:	(<2> [[[[(<25> (((3 2) ((2 1) <14>)) <6>))]]]])
-| entry 79:	(<0> <12>)
-| entry 78:	[(([[[[[[((((5 2) 1) 0) <5>)]]]]]] 1) <7>)]
-| entry 77:	(<83> 1)
-| entry 76:	([((3 3) 0)] 0)
-| entry 75:	[[((([[[((<2> [[((<15> 3) ((4 <14>) (1 <6>)))]]) 0)]]] <83>) [[[2]]]) ((([[[((<54> 0) (((<9> (([[[[((3 0) (2 1))]]]] <47>) (<2> [[(<52> (1 0))]]))) ([(((((<19> [(((0 [[1]]) [[0]]) [[0]])]) <44>) 0) <56>) 0)] ((<34> 2) (<61> 0)))) 1))]]] (<61> (<73> ([(<45> (((0 (<21> [[1]])) [(0 [[(<26> [[0]])]])]) [(0 [[((<0> (<46> <12>)) 0)]])]))] 1)))) [[0]]) (<73> 0)))]]
-| entry 74:	(<20> <7>)
-| entry 73:	[(((0 [[0]]) [((<0> [[1]]) 0)]) [((<0> [[0]]) 0)])]
-| entry 72:	((3 0) [[[2]]])
-| entry 71:	(4 3)
-| entry 70:	(<0> (((<2> [[[(<1> ((<18> (<8> <42>)) [[0]]))]]]) <27>) 0))
-| entry 69:	[(1 [((1 1) 0)])]
-| entry 68:	(<0> <3>)
-| entry 67:	(<20> <72>)
-| entry 66:	[<87>]
-| entry 65:	(<0> <40>)
-| entry 64:	[[(([(((0 [(<59> (<88> 0))]) [[(((0 [[0]]) [(2 0)]) [[[0]]])]]) [[(((0 (1 0)) [[[0]]]) [(2 0)])]])] 1) <55>)]]
-| entry 63:	[([(0 [[0]])] ((((0 (<68> [[[[(2 3)]]]])) [(0 [[(<37> (<20> 0))]])]) [(0 [[(<89> <40>)]])]) [(0 [[(<65> <51>)]])]))]
-| entry 62:	[((1 (<22> <84>)) (<38> <90>))]
-| entry 61:	((<2> [[[(<25> (<86> <6>))]]]) <3>)
-| entry 60:	(0 <3>)
-| entry 59:	[(<33> [0])]
-| entry 58:	(0 (1 3))
-| entry 57:	(<38> 1)
-| entry 56:	([[[[[(((<71> 1) 2) 0)]]]]] 0)
-| entry 55:	([((<46> <93>) [[[[(0 3)]]]])] 0)
-| entry 54:	(<2> [[[(((<31> 1) 0) ((<0> (<45> 1)) ((2 ([(0 [[0]])] 1)) 0)))]]])
-| entry 53:	([[((([<33>] 1) ([[[(0 2)]]] 0)) 1)]] 0)
-| entry 52:	(<0> 0)
-| entry 51:	(<10> 1)
-| entry 50:	[(<77> <90>)]
-| entry 49:	[([(0 [[0]])] (((0 (<21> [[[(1 2)]]])) [(0 [[(<26> (<22> 0))]])]) [(0 [[(<79> <57>)]])]))]
-| entry 48:	((<80> <16>) <3>)
-| entry 47:	(<2> [[[(<1> (((<32> 1) [[0]]) (<8> ((2 (<63> 1)) <6>))))]]])
-| entry 46:	(0 [[[2]]])
-| entry 45:	[(0 [[1]])]
-| entry 44:	[(([[((0 1) [0])]] [[[0]]]) ((((0 [[1]]) [(<53> [[[2]]])]) [(<53> [[[1]]])]) [0]))]
-| entry 43:	(<10> <7>)
-| entry 42:	((2 1) <6>)
-| entry 41:	(((3 2) 1) 0)
-| entry 40:	(<4> 1)
-| entry 39:	[([(0 [[0]])] ((((0 (<68> <93>)) [(0 [[(<37> <40>)]])]) [(0 [[(<89> (<10> 0))]])]) [(0 [[(<65> <92>)]])]))]
-| entry 38:	[[[[(1 <41>)]]]]
-| entry 37:	(<0> <51>)
-| entry 36:	(<4> <7>)
-| entry 35:	([(<52> [[0]])] <14>)
-| entry 34:	[[((<16> 1) <56>)]]
-| entry 33:	((0 [[1]]) [[[0]]])
-| entry 32:	[((<33> [[[0]]]) [0])]
-| entry 31:	[((0 [[[[[0]]]]]) [[1]])]
-| entry 30:	(<2> [[[(<1> ((<0> <18>) <42>))]]])
-| entry 29:	(((<2> [[[(<1> ((<18> <42>) 0))]]]) <27>) 0)
-| entry 28:	[[(((<19> [(<87> [[0]])]) <44>) ((<34> 1) 0))]]
-| entry 27:	((<19> <66>) 1)
-| entry 26:	(<0> <57>)
-| entry 25:	(<15> 1)
-| entry 24:	(<4> 0)
-| entry 23:	[(((1 <36>) <81>) <74>)]
-| entry 22:	[[[[(0 <41>)]]]]
-| entry 21:	(<0> [[[2]]])
-| entry 20:	[[[[[(1 <5>)]]]]]
-| entry 19:	[[[(2 (1 0))]]]
-| entry 18:	(1 <14>)
-| entry 17:	(([([(1 (0 0))] [(1 (0 0))])] [[(((<60> [(<10> (2 0))]) [(<20> (2 0))]) [(<4> (2 0))])]]) 1)
-| entry 16:	[[(([([[((1 0) [[[0]]])]] ((((0 [[(((0 (<63> <17>)) (<39> <17>)) <17>)]]) [[[((((1 (<11> 1)) [(((1 (<4> <72>)) <43>) <67>)]) <78>) <11>)]]]) [[[((((1 (<23> 1)) <78>) [(((1 <74>) (<4> <85>)) <81>)]) <23>)]]]) [[[((((1 (<78> 1)) <11>) <23>) <78>)]]]))] 1) ([(((<60> [[[[[(2 4)]]]]]) [[[[[(1 4)]]]]]) [[[[[(0 4)]]]]])] 0))]]
-| entry 15:	(<31> 0)
-| entry 14:	(<45> 0)
-| entry 13:	(<88> 1)
-| entry 12:	(<22> 1)
-| entry 11:	[(((1 <67>) <36>) <43>)]
-| entry 10:	[[[[[(2 <5>)]]]]]
-| entry 9:	[[[((2 0) 1)]]]
-| entry 8:	(<0> <14>)
-| entry 7:	((3 0) [[[0]]])
-| entry 6:	([(0 [[0]])] 0)
-| entry 5:	(((<71> 2) 1) 0)
-| entry 4:	[[[[[(0 <5>)]]]]]
-| entry 3:	[[[[3]]]]
-| entry 2:	[(<69> <69>)]
-| entry 1:	(<15> [[0]])
+| entry 93:	(<1> [[[(<3> (((<78> 1) [[0]]) (<8> ((2 (<33> 1)) <2>))))]]])
+| entry 92:	(<9> 0)
+| entry 91:	[[(((<45> [(<85> [[0]])]) <62>) ((<34> 1) 0))]]
+| entry 90:	(((3 2) 1) 0)
+| entry 89:	[[[[[(((4 1) 0) <90>)]]]]]
+| entry 88:	[([(0 [[0]])] (((0 (<17> [[[(1 2)]]])) [(0 [[(<28> (<11> 0))]])]) [(0 [[(<30> <23>)]])]))]
+| entry 87:	(((<1> [[[(<3> ((<13> <6>) 0))]]]) <86>) 0)
+| entry 86:	((<45> <56>) 1)
+| entry 85:	((0 [[0]]) [[1]])
+| entry 84:	((0 [[1]]) [[[0]]])
+| entry 83:	([[[[[(((<49> 1) 2) 0)]]]]] 0)
+| entry 82:	(<9> <44>)
+| entry 81:	(<0> <39>)
+| entry 80:	(<1> [[[[(<32> (((3 2) ((2 1) <10>)) <2>))]]]])
+| entry 79:	[[((([[[((<1> [[((<40> 3) ((4 <10>) (1 <2>)))]]) 0)]]] <89>) [[[2]]]) ((([[[((<7> 0) (((<22> (([[[[((3 0) (2 1))]]]] <93>) (<1> [[(<59> (1 0))]]))) ([(((((<45> [(((0 [[1]]) [[0]]) [[0]])]) <62>) 0) <83>) 0)] ((<34> 2) (<42> 0)))) 1))]]] (<42> (<51> ([(<24> (((0 (<17> [[1]])) [(0 [[(<28> [[0]])]])]) [(0 [[((<0> (<43> <36>)) 0)]])]))] 1)))) [[0]]) (<51> 0)))]]
+| entry 78:	[((<84> [[[0]]]) [0])]
+| entry 77:	([((3 3) 0)] 0)
+| entry 76:	([(0 0)] [[((<43> [(<18> <77>)]) [(<11> <77>)])]])
+| entry 75:	(<76> 1)
+| entry 74:	((3 0) [[[1]]])
+| entry 73:	[[(([(((0 [(<29> (<76> 0))]) [[(((0 [[0]]) [(2 0)]) [[[0]]])]]) [[(((0 (1 0)) [[[0]]]) [(2 0)])]])] 1) <31>)]]
+| entry 72:	((3 0) [[1]])
+| entry 71:	[([(0 [[0]])] ((((0 (<64> <53>)) [(0 [[(<46> <35>)]])]) [(0 [[(<81> (<12> 0))]])]) [(0 [[(<47> <39>)]])]))]
+| entry 70:	((3 0) [[[2]]])
+| entry 69:	([(<59> [[0]])] <10>)
+| entry 68:	(<12> <74>)
+| entry 67:	(<12> <44>)
+| entry 66:	(<5> <44>)
+| entry 65:	(<0> (((<1> [[[(<3> ((<13> (<8> <6>)) [[0]]))]]]) <86>) 0))
+| entry 64:	(<0> <4>)
+| entry 63:	(<89> 1)
+| entry 62:	[(([[((0 1) [0])]] [[[0]]]) ((((0 [[1]]) [(<58> [[[2]]])]) [(<58> [[[1]]])]) [0]))]
+| entry 61:	(2 (<71> 1))
+| entry 60:	(<5> <70>)
+| entry 59:	(<0> 0)
+| entry 58:	([[((([<84>] 1) ([[[(0 2)]]] 0)) 1)]] 0)
+| entry 57:	(0 <4>)
+| entry 56:	[<85>]
+| entry 55:	((<80> <21>) <4>)
+| entry 54:	((3 0) [[0]])
+| entry 53:	[[[[(1 3)]]]]
+| entry 52:	(0 (1 3))
+| entry 51:	[(((0 [[0]]) [((<0> [[1]]) 0)]) [((<0> [[0]]) 0)])]
+| entry 50:	((<22> (<1> [[[(<3> (((<13> <8>) [0]) <6>))]]])) <2>)
+| entry 49:	(4 3)
+| entry 48:	(<12> 1)
+| entry 47:	(<0> <35>)
+| entry 46:	(<0> <48>)
+| entry 45:	[[[(2 (1 0))]]]
+| entry 44:	((3 0) [[[0]]])
+| entry 43:	(0 [[[2]]])
+| entry 42:	((<1> [[[(<32> (<61> <2>))]]]) <4>)
+| entry 41:	(([([(1 (0 0))] [(1 (0 0))])] [[(((<57> [(<12> (2 0))]) [(<5> (2 0))]) [(<9> (2 0))])]]) 1)
+| entry 40:	(<16> 0)
+| entry 39:	(<5> 1)
+| entry 38:	(((<49> 2) 1) 0)
+| entry 37:	[(<63> <54>)]
+| entry 36:	(<11> 1)
+| entry 35:	(<9> 1)
+| entry 34:	[[((<21> 1) <83>)]]
+| entry 33:	[([(0 [[0]])] ((((0 (<64> [[[[(2 3)]]]])) [(0 [[(<46> (<5> 0))]])]) [(0 [[(<81> <35>)]])]) [(0 [[(<47> <48>)]])]))]
+| entry 32:	(<40> 1)
+| entry 31:	([((<43> <53>) [[[[(0 3)]]]])] 0)
+| entry 30:	(<0> <36>)
+| entry 29:	[(<84> [0])]
+| entry 28:	(<0> <23>)
+| entry 27:	[(((1 <60>) <82>) <67>)]
+| entry 26:	[((1 (<11> <72>)) (<18> <54>))]
+| entry 25:	[(1 [((1 1) 0)])]
+| entry 24:	[(0 [[1]])]
+| entry 23:	(<18> 1)
+| entry 22:	[[[((2 0) 1)]]]
+| entry 21:	[[(([([[((1 0) [[[0]]])]] ((((0 [[(((0 (<33> <41>)) (<71> <41>)) <41>)]]) [[[((((1 (<27> 1)) [(((1 (<9> <70>)) <67>) <60>)]) <19>) <27>)]]]) [[[((((1 (<15> 1)) <19>) [(((1 <66>) (<9> <74>)) <68>)]) <15>)]]]) [[[((((1 (<19> 1)) <27>) <15>) <19>)]]]))] 1) ([(((<57> [[[[[(2 4)]]]]]) [[[[[(1 4)]]]]]) [[[[[(0 4)]]]]])] 0))]]
+| entry 20:	(<1> [[[(<3> ((<0> <13>) <6>))]]])
+| entry 19:	[(([[[[[[((((5 2) 1) 0) <38>)]]]]]] 1) <44>)]
+| entry 18:	[[[[(1 <90>)]]]]
+| entry 17:	(<0> [[[2]]])
+| entry 16:	[((0 [[[[[0]]]]]) [[1]])]
+| entry 15:	[(((1 <82>) <68>) <66>)]
+| entry 14:	((<45> <88>) [[[[(((3 2) 0) 1)]]]])
+| entry 13:	(1 <10>)
+| entry 12:	[[[[[(2 <38>)]]]]]
+| entry 11:	[[[[(0 <90>)]]]]
+| entry 10:	(<24> 0)
+| entry 9:	[[[[[(0 <38>)]]]]]
+| entry 8:	(<0> <10>)
+| entry 7:	(<1> [[[(((<16> 1) 0) ((<0> (<24> 1)) ((2 ([(0 [[0]])] 1)) 0)))]]])
+| entry 6:	((2 1) <2>)
+| entry 5:	[[[[[(1 <38>)]]]]]
+| entry 4:	[[[[3]]]]
+| entry 3:	(<40> [[0]])
+| entry 2:	([(0 [[0]])] 0)
+| entry 1:	[(<25> <25>)]
 | entry 0:	[[[((0 2) 1)]]]
-| final:	[([(<8> (<48> ((<47> [[[[<58>]]]]) 0)))] ((<2> [[(<1> ((<54> ((<54> (1 (<91> ((<9> (<9> [[(<66> ((<28> 1) 0))]])) <14>)))) <35>)) (1 (<91> ((<9> (<9> <28>)) <14>)))))]]) ((<30> <48>) (((<2> [[[(<1> ([(<8> ((3 2) <6>))] (([[(<70> ([(<1> <6>)] <29>))]] 1) 0)))]]]) <32>) ((<30> ((<19> ((<80> [[((<16> (([[((((1 <3>) [((<34> <24>) 1)]) [((<16> <24>) 1)]) [<24>])]] [[[[(1 <58>)]]]]) 1)) 0)]]) <3>)) (<30> [(((<2> [[[(((<59> 0) 1) (<86> ([([(0 [[0]])] (((0 (<21> [[[2]]])) [(0 [[(<26> <12>)]])]) [(0 [[(<79> (<38> 0))]])]))] 0)))]]]) <3>) (([[((((<64> 0) 1) [[[2]]]) (<82> (([[(([([[((1 0) [[0]])]] (((0 [[((0 (<49> <13>)) <13>)]]) [[[(((1 (<62> 1)) [(<77> <84>)]) <62>)]]]) [[[(((1 (<50> 1)) <62>) <50>)]]]))] 1) <55>)]] ((<75> 1) 0)) (<82> ((<75> 0) 1)))))]] 0) [[[(0 (0 (0 (0 (1 (1 (0 (0 2))))))))]]]))]))) ((<2> [[([(((<31> <6>) <35>) (<8> (2 ([(0 [[0]])] <6>))))] (([[(<70> <29>)]] (<64> [[[(0 (1 (0 (1 (0 (0 (0 (0 2))))))))]]])) 0))]]) 0))))))]
+| final:	[([(<8> (<55> ((<93> [[[[<52>]]]]) 0)))] ((<1> [[(<3> ((<7> ((<7> (1 (<50> ((<22> (<22> [[(<56> ((<91> 1) 0))]])) <10>)))) <69>)) (1 (<50> ((<22> (<22> <91>)) <10>)))))]]) ((<20> <55>) (((<1> [[[(<3> ([(<8> ((3 2) <2>))] (([[(<65> ([(<3> <2>)] <87>))]] 1) 0)))]]]) <78>) ((<20> ((<45> ((<80> [[((<21> (([[((((1 <4>) [((<34> <92>) 1)]) [((<21> <92>) 1)]) [<92>])]] [[[[(1 <52>)]]]]) 1)) 0)]]) <4>)) (<20> [(((<1> [[[(((<29> 0) 1) (<61> ([([(0 [[0]])] (((0 (<17> [[[2]]])) [(0 [[(<28> <36>)]])]) [(0 [[(<30> (<18> 0))]])]))] 0)))]]]) <4>) (([[((((<73> 0) 1) [[[2]]]) (<14> (([[(([([[((1 0) [[0]])]] (((0 [[((0 (<88> <75>)) <75>)]]) [[[(((1 (<26> 1)) [(<63> <72>)]) <26>)]]]) [[[(((1 (<37> 1)) <26>) <37>)]]]))] 1) <31>)]] ((<79> 1) 0)) (<14> ((<79> 0) 1)))))]] 0) [[[(0 (0 (0 (0 (1 (1 (0 (0 2))))))))]]]))]))) ((<1> [[([(((<16> <2>) <69>) (<8> (2 ([(0 [[0]])] <2>))))] (([[(<65> <87>)]] (<73> [[[(0 (1 (0 (1 (0 (0 (0 (0 2))))))))]]])) 0))]]) 0))))))]
 === END BLOC ===
 
diff --git a/test/fac.blc.dump b/test/fac.blc.dump
index db72801..e46df2a 100644
--- a/test/fac.blc.dump
+++ b/test/fac.blc.dump
@@ -1,40 +1,40 @@
 
 === START BLOC ===
 | entries:	35
-| entry 33:	(<2> <26>)
-| entry 32:	(<2> 1)
-| entry 31:	(<5> <32>)
-| entry 30:	[[(([([[((1 0) [[[0]]])]] ((((0 [[(((0 ([([(0 [[0]])] ((((0 (<27> [[[[(2 3)]]]])) [(0 [[(<13> (<2> 0))]])]) [(0 [[(<31> <12>)]])]) [(0 [[(<24> <19>)]])]))] <11>)) (<8> <11>)) <11>)]]) [[[((((1 (<10> 1)) [(((1 (<0> <26>)) <18>) <33>)]) <14>) <10>)]]]) [[[((((1 (<9> 1)) <14>) [(((1 <29>) (<0> <25>)) <17>)]) <9>)]]]) [[[((((1 (<14> 1)) <10>) <9>) <14>)]]]))] 1) <20>)]]
-| entry 29:	(<2> <1>)
-| entry 28:	(4 3)
-| entry 27:	(<5> <3>)
+| entry 33:	(<1> 1)
+| entry 32:	[(((1 <18>) <24>) <22>)]
+| entry 31:	(0 <5>)
+| entry 30:	(<2> <33>)
+| entry 29:	(<3> 1)
+| entry 28:	(<2> <5>)
+| entry 27:	([([(1 (0 0))] [(1 (0 0))])] [[(((<31> [(<3> (2 0))]) [(<1> (2 0))]) [(<0> (2 0))])]])
 | entry 26:	((3 0) [[[2]]])
-| entry 25:	((3 0) [[[1]]])
-| entry 24:	(<5> <12>)
-| entry 23:	(<0> <1>)
-| entry 22:	(<0> 0)
-| entry 21:	([([(1 (0 0))] [(1 (0 0))])] [[(((<16> [(<6> (2 0))]) [(<2> (2 0))]) [(<0> (2 0))])]])
-| entry 20:	([(((<16> [[[[[(2 4)]]]]]) [[[[[(1 4)]]]]]) [[[[[(0 4)]]]]])] 0)
-| entry 19:	(<6> 1)
-| entry 18:	(<6> <1>)
-| entry 17:	(<6> <25>)
-| entry 16:	(0 <3>)
-| entry 15:	[(1 [((1 1) 0)])]
-| entry 14:	[(([[[[[[((((5 2) 1) 0) <4>)]]]]]] 1) <1>)]
-| entry 13:	(<5> <19>)
+| entry 25:	[[(([([[((1 0) [[[0]]])]] ((((0 [[(((0 ([([(0 [[0]])] ((((0 (<28> [[[[(2 3)]]]])) [(0 [[(<19> (<1> 0))]])]) [(0 [[(<30> <12>)]])]) [(0 [[(<17> <29>)]])]))] <6>)) (<11> <6>)) <6>)]]) [[[((((1 (<32> 1)) [(((1 (<0> <26>)) <22>) <18>)]) <7>) <32>)]]]) [[[((((1 (<9> 1)) <7>) [(((1 <21>) (<0> <13>)) <23>)]) <9>)]]]) [[[((((1 (<7> 1)) <32>) <9>) <7>)]]]))] 1) <20>)]]
+| entry 24:	(<0> <15>)
+| entry 23:	(<3> <13>)
+| entry 22:	(<3> <15>)
+| entry 21:	(<1> <15>)
+| entry 20:	([(((<31> [[[[[(2 4)]]]]]) [[[[[(1 4)]]]]]) [[[[[(0 4)]]]]])] 0)
+| entry 19:	(<2> <29>)
+| entry 18:	(<1> <26>)
+| entry 17:	(<2> <12>)
+| entry 16:	(<0> 0)
+| entry 15:	((3 0) [[[0]]])
+| entry 14:	(4 3)
+| entry 13:	((3 0) [[[1]]])
 | entry 12:	(<0> 1)
-| entry 11:	(<21> 1)
-| entry 10:	[(((1 <33>) <23>) <18>)]
-| entry 9:	[(((1 <23>) <17>) <29>)]
-| entry 8:	[([(0 [[0]])] ((((0 (<27> <7>)) [(0 [[(<13> <12>)]])]) [(0 [[(<31> (<6> 0))]])]) [(0 [[(<24> <32>)]])]))]
-| entry 7:	[[[[(1 3)]]]]
-| entry 6:	[[[[[(2 <4>)]]]]]
-| entry 5:	[[[((0 2) 1)]]]
-| entry 4:	(((<28> 2) 1) 0)
-| entry 3:	[[[[3]]]]
-| entry 2:	[[[[[(1 <4>)]]]]]
-| entry 1:	((3 0) [[[0]]])
+| entry 11:	[([(0 [[0]])] ((((0 (<28> <8>)) [(0 [[(<19> <12>)]])]) [(0 [[(<30> (<3> 0))]])]) [(0 [[(<17> <33>)]])]))]
+| entry 10:	[(1 [((1 1) 0)])]
+| entry 9:	[(((1 <24>) <23>) <21>)]
+| entry 8:	[[[[(1 3)]]]]
+| entry 7:	[(([[[[[[((((5 2) 1) 0) <4>)]]]]]] 1) <15>)]
+| entry 6:	(<27> 1)
+| entry 5:	[[[[3]]]]
+| entry 4:	(((<14> 2) 1) 0)
+| entry 3:	[[[[[(2 <4>)]]]]]
+| entry 2:	[[[((0 2) 1)]]]
+| entry 1:	[[[[[(1 <4>)]]]]]
 | entry 0:	[[[[[(0 <4>)]]]]]
-| final:	([((((([(<15> <15>)] [[[[[(((([[(([((((0 [([((((0 [[1]]) [[[0]]]) [[[0]]]) [0])] (<21> 0))]) [[((((0 [[0]]) [(2 0)]) [[[0]]]) [[[0]]])]]) [[((((0 [[0]]) [[[0]]]) [(2 0)]) [[[0]]])]]) [[((((0 (1 0)) [[[0]]]) [[[0]]]) [(2 0)])]])] 1) <20>)]] 2) (<8> 1)) 3) ((((4 (([[((((1 <3>) [(([[((<30> 1) ([[[[[(((<28> 1) 2) 0)]]]]] 0))]] <22>) 1)]) [((<30> <22>) 1)]) [<22>])]] 3) (0 2))) (<8> 2)) 1) 0))]]]]]) <7>) <7>) 0) [0])] [[[[(0 (1 (0 (1 3))))]]]])
+| final:	([((((([(<10> <10>)] [[[[[(((([[(([((((0 [([((((0 [[1]]) [[[0]]]) [[[0]]]) [0])] (<27> 0))]) [[((((0 [[0]]) [(2 0)]) [[[0]]]) [[[0]]])]]) [[((((0 [[0]]) [[[0]]]) [(2 0)]) [[[0]]])]]) [[((((0 (1 0)) [[[0]]]) [[[0]]]) [(2 0)])]])] 1) <20>)]] 2) (<11> 1)) 3) ((((4 (([[((((1 <5>) [(([[((<25> 1) ([[[[[(((<14> 1) 2) 0)]]]]] 0))]] <16>) 1)]) [((<25> <16>) 1)]) [<16>])]] 3) (0 2))) (<11> 2)) 1) 0))]]]]]) <8>) <8>) 0) [0])] [[[[(0 (1 (0 (1 3))))]]]])
 === END BLOC ===
 
-- 
cgit v1.2.3