about summary refs log tree commit diff
diff options
context:
space:
mode:
-rw-r--r--README.txt4
-rw-r--r--compilation/top-level.e247
-rw-r--r--evoke.e7
-rw-r--r--evoke.hex1085
-rw-r--r--hello.e23
-rw-r--r--hex.e23
-rw-r--r--inscribe-hex.e29
7 files changed, 1002 insertions, 416 deletions
diff --git a/README.txt b/README.txt
index 388f85f..208bbfc 100644
--- a/README.txt
+++ b/README.txt
@@ -373,12 +373,12 @@ can be metacircular while you're metacircular.)
 
   If you need to compile "hex", you can do so as follows:
 
-  $ cat hex.e | ./evoke > hex
+  $ ./evoke hex.e enchant > hex
   $ chmod 755 hex
 
   To produce the hex-dump version of it, do:
 
-  $ cat inscribe-hex.e | ./evoke > hex.hex
+  $ ./evoke hex.e inscribe > hex.hex
 
   The program "hex" is written in Evocation-assembly, but the hex transform
 also works on Forth programs, including Evocation itself. To produce the
diff --git a/compilation/top-level.e b/compilation/top-level.e
index 7c714cb..0cc5a93 100644
--- a/compilation/top-level.e
+++ b/compilation/top-level.e
@@ -16,13 +16,30 @@
 
 
 : compilation-definition-top-level-filename ;
-: compilation-definition-static-filenames 8 + ;
-: compilation-definition-dynamic-filenames 2 8 * + ;
-: compilation-definition-boot-filenames 3 8 * + ;
-: compilation-definition-compile-header 4 8 * + ;
-: compilation-definition-compile-footer 5 8 * + ;
+: compilation-definition-executable-type 8 + ;
+: compilation-definition-static-filenames 2 8 * + ;
+: compilation-definition-dynamic-filenames 3 8 * + ;
+: compilation-definition-boot-filenames 4 8 * + ;
+: compilation-definition-compile-header 5 8 * + ;
+: compilation-definition-compile-body 6 8 * + ;
+: compilation-definition-compile-footer 7 8 * + ;
 : allocate-compilation-definition
-  6 8 * allocate ;
+  8 8 * allocate ;
+
+s" :raw-executable" keyword
+s" :forth-executable" keyword
+
+~ (definition structure pointer --)
+: zero-compilation-definition
+  dup compilation-definition-top-level-filename 0 swap !
+  dup compilation-definition-executable-type 0 swap !
+  dup compilation-definition-static-filenames 0 swap !
+  dup compilation-definition-dynamic-filenames 0 swap !
+  dup compilation-definition-boot-filenames 0 swap !
+  dup compilation-definition-compile-header 0 swap !
+  dup compilation-definition-compile-body 0 swap !
+  dup compilation-definition-compile-footer 0 swap !
+  drop ;
 
 
 ~   This accepts a pointer to an existing buffer for file contents to be
@@ -44,84 +61,137 @@
 
 
 ~ (static source filename list, dynamic source filename list, boot source
-~  filename list -- source to precompile, source to copy to log,
-~  source to copy textually)
+~  filename list -- source to label transform, source to log-load transform,
+~  boot source)
 : read-inputs
-  here @ dup
-  ~ (static source filename list, dynamic source filename list,
-  ~  boot source filename list, source to precompile, buffer point)
-  4 pick read-inputs-from-filename-list
-  0 pack8 8 packalign here !
-  ~ (static source filename list, dynamic source filename list,
-  ~  boot source filename list, source to precompile)
-
-  here @ dup
-  ~ (static source filename list, dynamic source filename list,
-  ~  boot source filename list, source to precompile, source to copy to log,
-  ~  buffer point)
-  5 pick read-inputs-from-filename-list
-  4 pick read-inputs-from-filename-list
-  0 pack8 8 packalign here !
+  2 pick {
+    here @ dup
+    ~ (static source filename list, dynamic source filename list,
+    ~  boot source filename list, source to label-transform, buffer point)
+    4 pick read-inputs-from-filename-list
+    0 pack8 8 packalign here !
+  } { 0 } if-else
   ~ (static source filename list, dynamic source filename list,
-  ~  boot source filename list, source to precompile, source to copy to log)
-
-  here @ dup
+  ~  boot source filename list, source to label-transform)
+
+  3 pick 3 pick || {
+    here @ dup
+    ~ (static source filename list, dynamic source filename list,
+    ~  boot source filename list, source to label-transform,
+    ~  source to log-load transform, buffer point)
+    5 pick dup { read-inputs-from-filename-list } { drop } if-else
+    4 pick dup { read-inputs-from-filename-list } { drop } if-else
+    0 pack8 8 packalign here !
+  } { 0 } if-else
   ~ (static source filename list, dynamic source filename list,
-  ~  boot source filename list, source to precompile, source to copy to log,
-  ~  source to copy textually, buffer point)
-  4 pick read-inputs-from-filename-list
-  0 pack8 8 packalign here !
+  ~  boot source filename list, source to label-transform,
+  ~  source to log-load transform)
+
+  2 pick {
+    here @ dup
+    ~ (static source filename list, dynamic source filename list,
+    ~  boot source filename list, source to label-transform,
+    ~  source to log-load transform, boot source, buffer point)
+    4 pick read-inputs-from-filename-list
+    0 pack8 8 packalign here !
+  } { 0 } if-else
   ~ (static source filename list, dynamic source filename list,
-  ~  boot source filename list, source to precompile, source to copy to log,
-  ~  source to copy textually)
+  ~  boot source filename list, source to label-transform,
+  ~  source to log-load transform, boot source)
 
   4 roll drop 4 roll drop 4 roll drop ;
 
 
-~ (output memory start, current output point,
-~  compile-header execution token, compile-footer execution token,
-~  source to precompile, source to copy to log, source to include textually
+~ (output memory start, current output point, definition structure pointer,
+~  source to label-transform, source to log-load transform, boot source
 ~  -- output memory start, current output point)
 : output-contents
-  7 roll 7 roll
-  ~ (compile-header execution token, compile-footer execution token,
-  ~  source to precompile, source to copy to log, source to include textually,
-  ~  output memory start, current output point)
-
-  ~ Invoke the provided header callback.
-  7 roll execute
-  ~ (compile-footer execution token, source to precompile,
-  ~  source to copy to log, source to include textually, output memory start,
+  6 roll 6 roll
+  ~ (definition structure pointer, source to label-transform,
+  ~  source to log-load transform, boot source, output memory start,
   ~  current output point)
 
-  elf-file-header
-  elf-program-header
+  ~ Switch based on the executable type.
+  5 pick compilation-definition-executable-type @
+  ~ (definition structure pointer, source to label-transform,
+  ~  source to log-load transform, boot source, output memory start,
+  ~  current output point, executable type)
 
-  output-cold-start
+  dup :raw-executable = {
+    drop 3roll drop 3roll drop 3roll drop
+  ~ (definition structure pointer, output memory start, current output point)
 
-  ~ Warm start and the log-loaded source.
-  output-warm-start-header
-  4 roll log-load-transform
-  ~ (compile-footer execution token, source to precompile,
-  ~  source to include textually, output memory start, current output point)
-  output-warm-start-post-log-load-transform
-  output-warm-start-attach-boot-source
-  output-warm-start-footer
+    ~ Invoke the provided header callback, if it's nonzero.
+    2 pick compilation-definition-compile-header @
+    dup { execute } { drop } if-else
 
-  ~ The label-transformed source.
-  4 roll label-transform
-  ~ (compile-footer execution token, source to include textually,
-  ~  output memory start, current output point, final entry pointer)
+    ~ Invoke the provided body callback, if it's nonzero.
+    2 pick compilation-definition-compile-body @
+    dup { execute } { drop } if-else
 
-  ~ The boot source.
-  4 roll output-boot-source
-  ~ (compile-footer execution token, output memory start,
-  ~  current output point)
+    ~ Invoke the provided footer callback, if it's nonzero.
+    2 pick compilation-definition-compile-footer @
+    dup { execute } { drop } if-else
+
+    3roll drop
+
+    ~ (output memory start, current output point)
+    exit
+  } if
+
+  dup :forth-executable = {
+    drop
+    ~ (definition structure pointer, source to label-transform,
+    ~  source to log-load transform, boot source, output memory start,
+    ~  current output point)
+
+    ~ Invoke the provided header callback, if it's nonzero.
+    5 pick compilation-definition-compile-header @
+    dup { execute } { drop } if-else
+
+    elf-file-header
+    elf-program-header
 
-  ~ Invoke the provided footer callback.
-  3roll execute
-  ~ (output memory start, current output point)
-  ;
+    output-cold-start
+
+    ~ Warm start and the log-loaded source.
+    output-warm-start-header
+    4 roll log-load-transform
+    ~ (definition structure pointer, source to label-transform, boot source,
+    ~  output memory start, current output point)
+    output-warm-start-post-log-load-transform
+    output-warm-start-attach-boot-source
+    output-warm-start-footer
+
+    ~ The label-transformed source.
+    4 roll label-transform
+    ~ (definition structure pointer, boot source, output memory start,
+    ~  current output point, final entry pointer)
+
+    3unroll
+
+    ~ Invoke the provided body callback, if it's nonzero.
+    4 pick compilation-definition-compile-body @
+    dup { execute } { drop } if-else
+
+    3roll
+
+    ~ The boot source.
+    4 roll output-boot-source
+    ~ (definition structure pointer, output memory start,
+    ~  current output point)
+
+    ~ Invoke the provided footer callback, if it's nonzero.
+    2 pick compilation-definition-compile-footer @
+    dup { execute } { drop } if-else
+
+    3roll drop
+
+    ~ (output memory start, current output point)
+    exit
+  } if
+
+  ." Invalid executable type in compilation definition." 1 sys-exit ;
 
 
 ~   Given a compilation-definition structure which is a description of an
@@ -130,21 +200,22 @@
 ~
 ~ (definition structure pointer --)
 : enchant-from-definition
+  ~   We do this work here, rather than inside output-contents, because it
+  ~ would be wasteful to do it in every iteration of the label-loop.
   dup dup dup
   compilation-definition-boot-filenames @ 3unroll
   compilation-definition-dynamic-filenames @ 3unroll
   compilation-definition-static-filenames @ 3unroll
   read-inputs
-  ~ (definition structure pointer, source to precompile,
-  ~  source to copy to log, source to copy textually)
+  ~ (definition structure pointer, source to label-transform,
+  ~  source to log-load transform, boot source)
 
   ~   We need an execution token to pass to label-loop. There's no reason to
   ~ create a dictionary entry for it; we just allocate space for the
   ~ executable word body directly.
   here @
   docol ,
-  4 pick compilation-definition-compile-header @ literal
-  4 pick compilation-definition-compile-footer @ literal
+  5 roll literal
   4 roll literal
   3 roll literal
   swap literal
@@ -183,6 +254,11 @@
 ~
 ~ (definition structure pointer --)
 : inscribe-from-definition
+  ~   If we're inscribing something other than "evoke", we need to load
+  ~ evoke's source also, first.
+  s" evoke-executable-data" find dup { entry-to-execution-token execute } if
+  swap
+
   ~   We begin by constructing the full text of all the source that will be
   ~ run inside the scope of the hex transform. That necessarily includes not
   ~ only the compilation machinery, but the transformation system. Notably
@@ -190,17 +266,36 @@
   ~ "enchant", and having a stray unused copy of inscribe is harmless, so we
   ~ don't try to exclude it.
   here @ dup
-  ~ (definition structure pointer, hex-transformed source pointer,
-  ~  output point)
+  ~ (parent definition structure pointer, definition structure pointer,
+  ~  hex-transformed source pointer, output point)
+
+  3 pick 3 pick != {
+    3 pick compilation-definition-static-filenames @
+    dup { read-inputs-from-filename-list } { drop } if-else
+  } if
 
   2 pick compilation-definition-static-filenames @
-  read-inputs-from-filename-list
+  dup { read-inputs-from-filename-list } { drop } if-else
+
+  3 pick 3 pick != {
+    3 pick compilation-definition-dynamic-filenames @
+    dup { read-inputs-from-filename-list } { drop } if-else
+  } if
 
   2 pick compilation-definition-dynamic-filenames @
-  read-inputs-from-filename-list
+  dup { read-inputs-from-filename-list } { drop } if-else
+
+  3 pick 3 pick != {
+    3 pick compilation-definition-boot-filenames @
+    dup { read-inputs-from-filename-list } { drop } if-else
+  } if
 
   2 pick compilation-definition-boot-filenames @
-  read-inputs-from-filename-list
+  dup { read-inputs-from-filename-list } { drop } if-else
+
+  4 roll drop
+  ~ (definition structure pointer, hex-transformed source pointer,
+  ~  output point)
 
   ~   The top-level source file will try to look up its own filename, but this
   ~ is all on standard input, so it doesn't have one. We must deceive it!
diff --git a/evoke.e b/evoke.e
index 823866f..b7ecb1d 100644
--- a/evoke.e
+++ b/evoke.e
@@ -1,5 +1,5 @@
-~ echo 's" evoke.e" enchant' | ./evoke > evoke2 && chmod 755 evoke2
-~ echo 's" evoke.e" inscribe' | ./evoke > evoke.hex
+~ ./evoke evoke.e enchant > evoke2 && chmod 755 evoke2
+~ ./evoke evoke.e inscribe > evoke.hex
 
 ~ (output memory start, current output point
 ~  -- output memory start, current output point)
@@ -33,8 +33,11 @@
 
 : define-compilation
   allocate-compilation-definition
+  dup zero-compilation-definition
   ~ (definition)
 
+  dup :forth-executable swap compilation-definition-executable-type !
+
   [ current-input-file-name literal-string ]
   over compilation-definition-top-level-filename !
 
diff --git a/evoke.hex b/evoke.hex
index b1357d2..ca99be6 100644
--- a/evoke.hex
+++ b/evoke.hex
@@ -49,8 +49,8 @@
   00 00 00 08 00 00 00 00           ~ *virtual address
   00 00 00 00 00 00 00 00           ~ physical address (ignored)
 
-  48 f9 0a 00 00 00 00 00           ~ *size in file
-  48 f9 0a 00 00 00 00 00           ~ *size in memory
+  70 05 0b 00 00 00 00 00           ~ *size in file
+  70 05 0b 00 00 00 00 00           ~ *size in memory
 
   00 00 00 00 00 00 00 00           ~ segment alignment
 
@@ -114671,37 +114671,49 @@
   66 69 6e 69 74 69 6f 6e 2d 74 6f 70 2d 6c 65 76
   65 6c 2d 66 69 6c 65 6e 61 6d 65 20 3b 0a
 
-  ~ ": compilation-definition-static-filenames 8 + ;"
+  ~ ": compilation-definition-executable-type 8 + ;"
+  3a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2d 64 65
+  66 69 6e 69 74 69 6f 6e 2d 65 78 65 63 75 74 61
+  62 6c 65 2d 74 79 70 65 20 38 20 2b 20 3b 0a
+
+  ~ ": compilation-definition-static-filenames 2 8 * +"
+  ~ " ;"
   3a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2d 64 65
   66 69 6e 69 74 69 6f 6e 2d 73 74 61 74 69 63 2d
-  66 69 6c 65 6e 61 6d 65 73 20 38 20 2b 20 3b 0a
+  66 69 6c 65 6e 61 6d 65 73 20 32 20 38 20 2a 20
+  2b 20 3b 0a
 
-  ~ ": compilation-definition-dynamic-filenames 2 8 *"
+  ~ ": compilation-definition-dynamic-filenames 3 8 *"
   ~ " + ;"
   3a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2d 64 65
   66 69 6e 69 74 69 6f 6e 2d 64 79 6e 61 6d 69 63
-  2d 66 69 6c 65 6e 61 6d 65 73 20 32 20 38 20 2a
+  2d 66 69 6c 65 6e 61 6d 65 73 20 33 20 38 20 2a
   20 2b 20 3b 0a
 
-  ~ ": compilation-definition-boot-filenames 3 8 * +"
+  ~ ": compilation-definition-boot-filenames 4 8 * +"
   ~ " ;"
   3a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2d 64 65
   66 69 6e 69 74 69 6f 6e 2d 62 6f 6f 74 2d 66 69
-  6c 65 6e 61 6d 65 73 20 33 20 38 20 2a 20 2b 20
+  6c 65 6e 61 6d 65 73 20 34 20 38 20 2a 20 2b 20
   3b 0a
 
-  ~ ": compilation-definition-compile-header 4 8 * +"
+  ~ ": compilation-definition-compile-header 5 8 * +"
   ~ " ;"
   3a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2d 64 65
   66 69 6e 69 74 69 6f 6e 2d 63 6f 6d 70 69 6c 65
-  2d 68 65 61 64 65 72 20 34 20 38 20 2a 20 2b 20
+  2d 68 65 61 64 65 72 20 35 20 38 20 2a 20 2b 20
   3b 0a
 
-  ~ ": compilation-definition-compile-footer 5 8 * +"
+  ~ ": compilation-definition-compile-body 6 8 * + ;"
+  3a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2d 64 65
+  66 69 6e 69 74 69 6f 6e 2d 63 6f 6d 70 69 6c 65
+  2d 62 6f 64 79 20 36 20 38 20 2a 20 2b 20 3b 0a
+
+  ~ ": compilation-definition-compile-footer 7 8 * +"
   ~ " ;"
   3a 20 63 6f 6d 70 69 6c 61 74 69 6f 6e 2d 64 65
   66 69 6e 69 74 69 6f 6e 2d 63 6f 6d 70 69 6c 65
-  2d 66 6f 6f 74 65 72 20 35 20 38 20 2a 20 2b 20
+  2d 66 6f 6f 74 65 72 20 37 20 38 20 2a 20 2b 20
   3b 0a
 
   ~ ": allocate-compilation-definition"
@@ -114709,13 +114721,95 @@
   6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f
   6e 0a
 
-  ~ "  6 8 * allocate ;"
-  20 20 36 20 38 20 2a 20 61 6c 6c 6f 63 61 74 65
+  ~ "  8 8 * allocate ;"
+  20 20 38 20 38 20 2a 20 61 6c 6c 6f 63 61 74 65
   20 3b 0a
 
   ~ ""
   0a
 
+  ~ "s" :raw-executable" keyword"
+  73 22 20 3a 72 61 77 2d 65 78 65 63 75 74 61 62
+  6c 65 22 20 6b 65 79 77 6f 72 64 0a
+
+  ~ "s" :forth-executable" keyword"
+  73 22 20 3a 66 6f 72 74 68 2d 65 78 65 63 75 74
+  61 62 6c 65 22 20 6b 65 79 77 6f 72 64 0a
+
+  ~ ""
+  0a
+
+  ~ "~ (definition structure pointer --)"
+  7e 20 28 64 65 66 69 6e 69 74 69 6f 6e 20 73 74
+  72 75 63 74 75 72 65 20 70 6f 69 6e 74 65 72 20
+  2d 2d 29 0a
+
+  ~ ": zero-compilation-definition"
+  3a 20 7a 65 72 6f 2d 63 6f 6d 70 69 6c 61 74 69
+  6f 6e 2d 64 65 66 69 6e 69 74 69 6f 6e 0a
+
+  ~ "  dup compilation-definition-top-level-filename 0"
+  ~ " swap !"
+  20 20 64 75 70 20 63 6f 6d 70 69 6c 61 74 69 6f
+  6e 2d 64 65 66 69 6e 69 74 69 6f 6e 2d 74 6f 70
+  2d 6c 65 76 65 6c 2d 66 69 6c 65 6e 61 6d 65 20
+  30 20 73 77 61 70 20 21 0a
+
+  ~ "  dup compilation-definition-executable-type 0"
+  ~ " swap !"
+  20 20 64 75 70 20 63 6f 6d 70 69 6c 61 74 69 6f
+  6e 2d 64 65 66 69 6e 69 74 69 6f 6e 2d 65 78 65
+  63 75 74 61 62 6c 65 2d 74 79 70 65 20 30 20 73
+  77 61 70 20 21 0a
+
+  ~ "  dup compilation-definition-static-filenames 0"
+  ~ " swap !"
+  20 20 64 75 70 20 63 6f 6d 70 69 6c 61 74 69 6f
+  6e 2d 64 65 66 69 6e 69 74 69 6f 6e 2d 73 74 61
+  74 69 63 2d 66 69 6c 65 6e 61 6d 65 73 20 30 20
+  73 77 61 70 20 21 0a
+
+  ~ "  dup compilation-definition-dynamic-filenames 0"
+  ~ " swap !"
+  20 20 64 75 70 20 63 6f 6d 70 69 6c 61 74 69 6f
+  6e 2d 64 65 66 69 6e 69 74 69 6f 6e 2d 64 79 6e
+  61 6d 69 63 2d 66 69 6c 65 6e 61 6d 65 73 20 30
+  20 73 77 61 70 20 21 0a
+
+  ~ "  dup compilation-definition-boot-filenames 0"
+  ~ " swap !"
+  20 20 64 75 70 20 63 6f 6d 70 69 6c 61 74 69 6f
+  6e 2d 64 65 66 69 6e 69 74 69 6f 6e 2d 62 6f 6f
+  74 2d 66 69 6c 65 6e 61 6d 65 73 20 30 20 73 77
+  61 70 20 21 0a
+
+  ~ "  dup compilation-definition-compile-header 0"
+  ~ " swap !"
+  20 20 64 75 70 20 63 6f 6d 70 69 6c 61 74 69 6f
+  6e 2d 64 65 66 69 6e 69 74 69 6f 6e 2d 63 6f 6d
+  70 69 6c 65 2d 68 65 61 64 65 72 20 30 20 73 77
+  61 70 20 21 0a
+
+  ~ "  dup compilation-definition-compile-body 0 swap"
+  ~ " !"
+  20 20 64 75 70 20 63 6f 6d 70 69 6c 61 74 69 6f
+  6e 2d 64 65 66 69 6e 69 74 69 6f 6e 2d 63 6f 6d
+  70 69 6c 65 2d 62 6f 64 79 20 30 20 73 77 61 70
+  20 21 0a
+
+  ~ "  dup compilation-definition-compile-footer 0"
+  ~ " swap !"
+  20 20 64 75 70 20 63 6f 6d 70 69 6c 61 74 69 6f
+  6e 2d 64 65 66 69 6e 69 74 69 6f 6e 2d 63 6f 6d
+  70 69 6c 65 2d 66 6f 6f 74 65 72 20 30 20 73 77
+  61 70 20 21 0a
+
+  ~ "  drop ;"
+  20 20 64 72 6f 70 20 3b 0a
+
+  ~ ""
+  0a
+
   ~ ""
   0a
 
@@ -114825,47 +114919,54 @@
   69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 20 62 6f
   6f 74 20 73 6f 75 72 63 65 0a
 
-  ~ "~  filename list -- source to precompile, source"
-  ~ " to copy to log,"
+  ~ "~  filename list -- source to label transform,"
+  ~ " source to log-load transform,"
   7e 20 20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74
-  20 2d 2d 20 73 6f 75 72 63 65 20 74 6f 20 70 72
-  65 63 6f 6d 70 69 6c 65 2c 20 73 6f 75 72 63 65
-  20 74 6f 20 63 6f 70 79 20 74 6f 20 6c 6f 67 2c
-  0a
+  20 2d 2d 20 73 6f 75 72 63 65 20 74 6f 20 6c 61
+  62 65 6c 20 74 72 61 6e 73 66 6f 72 6d 2c 20 73
+  6f 75 72 63 65 20 74 6f 20 6c 6f 67 2d 6c 6f 61
+  64 20 74 72 61 6e 73 66 6f 72 6d 2c 0a
 
-  ~ "~  source to copy textually)"
-  7e 20 20 73 6f 75 72 63 65 20 74 6f 20 63 6f 70
-  79 20 74 65 78 74 75 61 6c 6c 79 29 0a
+  ~ "~  boot source)"
+  7e 20 20 62 6f 6f 74 20 73 6f 75 72 63 65 29 0a
 
   ~ ": read-inputs"
   3a 20 72 65 61 64 2d 69 6e 70 75 74 73 0a
 
-  ~ "  here @ dup"
-  20 20 68 65 72 65 20 40 20 64 75 70 0a
+  ~ "  2 pick {"
+  20 20 32 20 70 69 63 6b 20 7b 0a
 
-  ~ "  ~ (static source filename list, dynamic source"
-  ~ " filename list,"
-  20 20 7e 20 28 73 74 61 74 69 63 20 73 6f 75 72
+  ~ "    here @ dup"
+  20 20 20 20 68 65 72 65 20 40 20 64 75 70 0a
+
+  ~ "    ~ (static source filename list, dynamic"
+  ~ " source filename list,"
+  20 20 20 20 7e 20 28 73 74 61 74 69 63 20 73 6f
+  75 72 63 65 20 66 69 6c 65 6e 61 6d 65 20 6c 69
+  73 74 2c 20 64 79 6e 61 6d 69 63 20 73 6f 75 72
   63 65 20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74
-  2c 20 64 79 6e 61 6d 69 63 20 73 6f 75 72 63 65
-  20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 0a
+  2c 0a
 
-  ~ "  ~  boot source filename list, source to"
-  ~ " precompile, buffer point)"
-  20 20 7e 20 20 62 6f 6f 74 20 73 6f 75 72 63 65
-  20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 20
-  73 6f 75 72 63 65 20 74 6f 20 70 72 65 63 6f 6d
-  70 69 6c 65 2c 20 62 75 66 66 65 72 20 70 6f 69
-  6e 74 29 0a
+  ~ "    ~  boot source filename list, source to"
+  ~ " label-transform, buffer point)"
+  20 20 20 20 7e 20 20 62 6f 6f 74 20 73 6f 75 72
+  63 65 20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74
+  2c 20 73 6f 75 72 63 65 20 74 6f 20 6c 61 62 65
+  6c 2d 74 72 61 6e 73 66 6f 72 6d 2c 20 62 75 66
+  66 65 72 20 70 6f 69 6e 74 29 0a
 
-  ~ "  4 pick read-inputs-from-filename-list"
-  20 20 34 20 70 69 63 6b 20 72 65 61 64 2d 69 6e
-  70 75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65 6e 61
-  6d 65 2d 6c 69 73 74 0a
+  ~ "    4 pick read-inputs-from-filename-list"
+  20 20 20 20 34 20 70 69 63 6b 20 72 65 61 64 2d
+  69 6e 70 75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65
+  6e 61 6d 65 2d 6c 69 73 74 0a
 
-  ~ "  0 pack8 8 packalign here !"
-  20 20 30 20 70 61 63 6b 38 20 38 20 70 61 63 6b
-  61 6c 69 67 6e 20 68 65 72 65 20 21 0a
+  ~ "    0 pack8 8 packalign here !"
+  20 20 20 20 30 20 70 61 63 6b 38 20 38 20 70 61
+  63 6b 61 6c 69 67 6e 20 68 65 72 65 20 21 0a
+
+  ~ "  } { 0 } if-else"
+  20 20 7d 20 7b 20 30 20 7d 20 69 66 2d 65 6c 73
+  65 0a
 
   ~ "  ~ (static source filename list, dynamic source"
   ~ " filename list,"
@@ -114875,50 +114976,67 @@
   20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 0a
 
   ~ "  ~  boot source filename list, source to"
-  ~ " precompile)"
+  ~ " label-transform)"
   20 20 7e 20 20 62 6f 6f 74 20 73 6f 75 72 63 65
   20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 20
-  73 6f 75 72 63 65 20 74 6f 20 70 72 65 63 6f 6d
-  70 69 6c 65 29 0a
+  73 6f 75 72 63 65 20 74 6f 20 6c 61 62 65 6c 2d
+  74 72 61 6e 73 66 6f 72 6d 29 0a
 
   ~ ""
   0a
 
-  ~ "  here @ dup"
-  20 20 68 65 72 65 20 40 20 64 75 70 0a
+  ~ "  3 pick 3 pick || {"
+  20 20 33 20 70 69 63 6b 20 33 20 70 69 63 6b 20
+  7c 7c 20 7b 0a
 
-  ~ "  ~ (static source filename list, dynamic source"
-  ~ " filename list,"
-  20 20 7e 20 28 73 74 61 74 69 63 20 73 6f 75 72
+  ~ "    here @ dup"
+  20 20 20 20 68 65 72 65 20 40 20 64 75 70 0a
+
+  ~ "    ~ (static source filename list, dynamic"
+  ~ " source filename list,"
+  20 20 20 20 7e 20 28 73 74 61 74 69 63 20 73 6f
+  75 72 63 65 20 66 69 6c 65 6e 61 6d 65 20 6c 69
+  73 74 2c 20 64 79 6e 61 6d 69 63 20 73 6f 75 72
   63 65 20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74
-  2c 20 64 79 6e 61 6d 69 63 20 73 6f 75 72 63 65
-  20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 0a
+  2c 0a
 
-  ~ "  ~  boot source filename list, source to"
-  ~ " precompile, source to copy to log,"
-  20 20 7e 20 20 62 6f 6f 74 20 73 6f 75 72 63 65
-  20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 20
-  73 6f 75 72 63 65 20 74 6f 20 70 72 65 63 6f 6d
-  70 69 6c 65 2c 20 73 6f 75 72 63 65 20 74 6f 20
-  63 6f 70 79 20 74 6f 20 6c 6f 67 2c 0a
+  ~ "    ~  boot source filename list, source to"
+  ~ " label-transform,"
+  20 20 20 20 7e 20 20 62 6f 6f 74 20 73 6f 75 72
+  63 65 20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74
+  2c 20 73 6f 75 72 63 65 20 74 6f 20 6c 61 62 65
+  6c 2d 74 72 61 6e 73 66 6f 72 6d 2c 0a
 
-  ~ "  ~  buffer point)"
-  20 20 7e 20 20 62 75 66 66 65 72 20 70 6f 69 6e
+  ~ "    ~  source to log-load transform, buffer"
+  ~ " point)"
+  20 20 20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f
+  20 6c 6f 67 2d 6c 6f 61 64 20 74 72 61 6e 73 66
+  6f 72 6d 2c 20 62 75 66 66 65 72 20 70 6f 69 6e
   74 29 0a
 
-  ~ "  5 pick read-inputs-from-filename-list"
-  20 20 35 20 70 69 63 6b 20 72 65 61 64 2d 69 6e
-  70 75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65 6e 61
-  6d 65 2d 6c 69 73 74 0a
-
-  ~ "  4 pick read-inputs-from-filename-list"
-  20 20 34 20 70 69 63 6b 20 72 65 61 64 2d 69 6e
-  70 75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65 6e 61
-  6d 65 2d 6c 69 73 74 0a
+  ~ "    5 pick dup { read-inputs-from-filename-list }"
+  ~ " { drop } if-else"
+  20 20 20 20 35 20 70 69 63 6b 20 64 75 70 20 7b
+  20 72 65 61 64 2d 69 6e 70 75 74 73 2d 66 72 6f
+  6d 2d 66 69 6c 65 6e 61 6d 65 2d 6c 69 73 74 20
+  7d 20 7b 20 64 72 6f 70 20 7d 20 69 66 2d 65 6c
+  73 65 0a
+
+  ~ "    4 pick dup { read-inputs-from-filename-list }"
+  ~ " { drop } if-else"
+  20 20 20 20 34 20 70 69 63 6b 20 64 75 70 20 7b
+  20 72 65 61 64 2d 69 6e 70 75 74 73 2d 66 72 6f
+  6d 2d 66 69 6c 65 6e 61 6d 65 2d 6c 69 73 74 20
+  7d 20 7b 20 64 72 6f 70 20 7d 20 69 66 2d 65 6c
+  73 65 0a
+
+  ~ "    0 pack8 8 packalign here !"
+  20 20 20 20 30 20 70 61 63 6b 38 20 38 20 70 61
+  63 6b 61 6c 69 67 6e 20 68 65 72 65 20 21 0a
 
-  ~ "  0 pack8 8 packalign here !"
-  20 20 30 20 70 61 63 6b 38 20 38 20 70 61 63 6b
-  61 6c 69 67 6e 20 68 65 72 65 20 21 0a
+  ~ "  } { 0 } if-else"
+  20 20 7d 20 7b 20 30 20 7d 20 69 66 2d 65 6c 73
+  65 0a
 
   ~ "  ~ (static source filename list, dynamic source"
   ~ " filename list,"
@@ -114928,47 +115046,60 @@
   20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 0a
 
   ~ "  ~  boot source filename list, source to"
-  ~ " precompile, source to copy to log)"
+  ~ " label-transform,"
   20 20 7e 20 20 62 6f 6f 74 20 73 6f 75 72 63 65
   20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 20
-  73 6f 75 72 63 65 20 74 6f 20 70 72 65 63 6f 6d
-  70 69 6c 65 2c 20 73 6f 75 72 63 65 20 74 6f 20
-  63 6f 70 79 20 74 6f 20 6c 6f 67 29 0a
+  73 6f 75 72 63 65 20 74 6f 20 6c 61 62 65 6c 2d
+  74 72 61 6e 73 66 6f 72 6d 2c 0a
+
+  ~ "  ~  source to log-load transform)"
+  20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f 20 6c
+  6f 67 2d 6c 6f 61 64 20 74 72 61 6e 73 66 6f 72
+  6d 29 0a
 
   ~ ""
   0a
 
-  ~ "  here @ dup"
-  20 20 68 65 72 65 20 40 20 64 75 70 0a
-
-  ~ "  ~ (static source filename list, dynamic source"
-  ~ " filename list,"
-  20 20 7e 20 28 73 74 61 74 69 63 20 73 6f 75 72
-  63 65 20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74
-  2c 20 64 79 6e 61 6d 69 63 20 73 6f 75 72 63 65
-  20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 0a
+  ~ "  2 pick {"
+  20 20 32 20 70 69 63 6b 20 7b 0a
 
-  ~ "  ~  boot source filename list, source to"
-  ~ " precompile, source to copy to log,"
-  20 20 7e 20 20 62 6f 6f 74 20 73 6f 75 72 63 65
-  20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 20
-  73 6f 75 72 63 65 20 74 6f 20 70 72 65 63 6f 6d
-  70 69 6c 65 2c 20 73 6f 75 72 63 65 20 74 6f 20
-  63 6f 70 79 20 74 6f 20 6c 6f 67 2c 0a
+  ~ "    here @ dup"
+  20 20 20 20 68 65 72 65 20 40 20 64 75 70 0a
 
-  ~ "  ~  source to copy textually, buffer point)"
-  20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f 20 63
-  6f 70 79 20 74 65 78 74 75 61 6c 6c 79 2c 20 62
-  75 66 66 65 72 20 70 6f 69 6e 74 29 0a
+  ~ "    ~ (static source filename list, dynamic"
+  ~ " source filename list,"
+  20 20 20 20 7e 20 28 73 74 61 74 69 63 20 73 6f
+  75 72 63 65 20 66 69 6c 65 6e 61 6d 65 20 6c 69
+  73 74 2c 20 64 79 6e 61 6d 69 63 20 73 6f 75 72
+  63 65 20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74
+  2c 0a
 
-  ~ "  4 pick read-inputs-from-filename-list"
-  20 20 34 20 70 69 63 6b 20 72 65 61 64 2d 69 6e
-  70 75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65 6e 61
-  6d 65 2d 6c 69 73 74 0a
+  ~ "    ~  boot source filename list, source to"
+  ~ " label-transform,"
+  20 20 20 20 7e 20 20 62 6f 6f 74 20 73 6f 75 72
+  63 65 20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74
+  2c 20 73 6f 75 72 63 65 20 74 6f 20 6c 61 62 65
+  6c 2d 74 72 61 6e 73 66 6f 72 6d 2c 0a
+
+  ~ "    ~  source to log-load transform, boot source,"
+  ~ " buffer point)"
+  20 20 20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f
+  20 6c 6f 67 2d 6c 6f 61 64 20 74 72 61 6e 73 66
+  6f 72 6d 2c 20 62 6f 6f 74 20 73 6f 75 72 63 65
+  2c 20 62 75 66 66 65 72 20 70 6f 69 6e 74 29 0a
+
+  ~ "    4 pick read-inputs-from-filename-list"
+  20 20 20 20 34 20 70 69 63 6b 20 72 65 61 64 2d
+  69 6e 70 75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65
+  6e 61 6d 65 2d 6c 69 73 74 0a
+
+  ~ "    0 pack8 8 packalign here !"
+  20 20 20 20 30 20 70 61 63 6b 38 20 38 20 70 61
+  63 6b 61 6c 69 67 6e 20 68 65 72 65 20 21 0a
 
-  ~ "  0 pack8 8 packalign here !"
-  20 20 30 20 70 61 63 6b 38 20 38 20 70 61 63 6b
-  61 6c 69 67 6e 20 68 65 72 65 20 21 0a
+  ~ "  } { 0 } if-else"
+  20 20 7d 20 7b 20 30 20 7d 20 69 66 2d 65 6c 73
+  65 0a
 
   ~ "  ~ (static source filename list, dynamic source"
   ~ " filename list,"
@@ -114978,16 +115109,16 @@
   20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 0a
 
   ~ "  ~  boot source filename list, source to"
-  ~ " precompile, source to copy to log,"
+  ~ " label-transform,"
   20 20 7e 20 20 62 6f 6f 74 20 73 6f 75 72 63 65
   20 66 69 6c 65 6e 61 6d 65 20 6c 69 73 74 2c 20
-  73 6f 75 72 63 65 20 74 6f 20 70 72 65 63 6f 6d
-  70 69 6c 65 2c 20 73 6f 75 72 63 65 20 74 6f 20
-  63 6f 70 79 20 74 6f 20 6c 6f 67 2c 0a
+  73 6f 75 72 63 65 20 74 6f 20 6c 61 62 65 6c 2d
+  74 72 61 6e 73 66 6f 72 6d 2c 0a
 
-  ~ "  ~  source to copy textually)"
-  20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f 20 63
-  6f 70 79 20 74 65 78 74 75 61 6c 6c 79 29 0a
+  ~ "  ~  source to log-load transform, boot source)"
+  20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f 20 6c
+  6f 67 2d 6c 6f 61 64 20 74 72 61 6e 73 66 6f 72
+  6d 2c 20 62 6f 6f 74 20 73 6f 75 72 63 65 29 0a
 
   ~ ""
   0a
@@ -115004,25 +115135,20 @@
   0a
 
   ~ "~ (output memory start, current output point,"
+  ~ " definition structure pointer,"
   7e 20 28 6f 75 74 70 75 74 20 6d 65 6d 6f 72 79
   20 73 74 61 72 74 2c 20 63 75 72 72 65 6e 74 20
-  6f 75 74 70 75 74 20 70 6f 69 6e 74 2c 0a
-
-  ~ "~  compile-header execution token, compile-footer"
-  ~ " execution token,"
-  7e 20 20 63 6f 6d 70 69 6c 65 2d 68 65 61 64 65
-  72 20 65 78 65 63 75 74 69 6f 6e 20 74 6f 6b 65
-  6e 2c 20 63 6f 6d 70 69 6c 65 2d 66 6f 6f 74 65
-  72 20 65 78 65 63 75 74 69 6f 6e 20 74 6f 6b 65
-  6e 2c 0a
-
-  ~ "~  source to precompile, source to copy to log,"
-  ~ " source to include textually"
-  7e 20 20 73 6f 75 72 63 65 20 74 6f 20 70 72 65
-  63 6f 6d 70 69 6c 65 2c 20 73 6f 75 72 63 65 20
-  74 6f 20 63 6f 70 79 20 74 6f 20 6c 6f 67 2c 20
-  73 6f 75 72 63 65 20 74 6f 20 69 6e 63 6c 75 64
-  65 20 74 65 78 74 75 61 6c 6c 79 0a
+  6f 75 74 70 75 74 20 70 6f 69 6e 74 2c 20 64 65
+  66 69 6e 69 74 69 6f 6e 20 73 74 72 75 63 74 75
+  72 65 20 70 6f 69 6e 74 65 72 2c 0a
+
+  ~ "~  source to label-transform, source to log-load"
+  ~ " transform, boot source"
+  7e 20 20 73 6f 75 72 63 65 20 74 6f 20 6c 61 62
+  65 6c 2d 74 72 61 6e 73 66 6f 72 6d 2c 20 73 6f
+  75 72 63 65 20 74 6f 20 6c 6f 67 2d 6c 6f 61 64
+  20 74 72 61 6e 73 66 6f 72 6d 2c 20 62 6f 6f 74
+  20 73 6f 75 72 63 65 0a
 
   ~ "~  -- output memory start, current output point)"
   7e 20 20 2d 2d 20 6f 75 74 70 75 74 20 6d 65 6d
@@ -115034,192 +115160,420 @@
   3a 20 6f 75 74 70 75 74 2d 63 6f 6e 74 65 6e 74
   73 0a
 
-  ~ "  7 roll 7 roll"
-  20 20 37 20 72 6f 6c 6c 20 37 20 72 6f 6c 6c 0a
+  ~ "  6 roll 6 roll"
+  20 20 36 20 72 6f 6c 6c 20 36 20 72 6f 6c 6c 0a
 
-  ~ "  ~ (compile-header execution token,"
-  ~ " compile-footer execution token,"
-  20 20 7e 20 28 63 6f 6d 70 69 6c 65 2d 68 65 61
-  64 65 72 20 65 78 65 63 75 74 69 6f 6e 20 74 6f
-  6b 65 6e 2c 20 63 6f 6d 70 69 6c 65 2d 66 6f 6f
-  74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 74 6f
-  6b 65 6e 2c 0a
+  ~ "  ~ (definition structure pointer, source to"
+  ~ " label-transform,"
+  20 20 7e 20 28 64 65 66 69 6e 69 74 69 6f 6e 20
+  73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65
+  72 2c 20 73 6f 75 72 63 65 20 74 6f 20 6c 61 62
+  65 6c 2d 74 72 61 6e 73 66 6f 72 6d 2c 0a
 
-  ~ "  ~  source to precompile, source to copy to log,"
-  ~ " source to include textually,"
-  20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f 20 70
-  72 65 63 6f 6d 70 69 6c 65 2c 20 73 6f 75 72 63
-  65 20 74 6f 20 63 6f 70 79 20 74 6f 20 6c 6f 67
-  2c 20 73 6f 75 72 63 65 20 74 6f 20 69 6e 63 6c
-  75 64 65 20 74 65 78 74 75 61 6c 6c 79 2c 0a
+  ~ "  ~  source to log-load transform, boot source,"
+  ~ " output memory start,"
+  20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f 20 6c
+  6f 67 2d 6c 6f 61 64 20 74 72 61 6e 73 66 6f 72
+  6d 2c 20 62 6f 6f 74 20 73 6f 75 72 63 65 2c 20
+  6f 75 74 70 75 74 20 6d 65 6d 6f 72 79 20 73 74
+  61 72 74 2c 0a
 
-  ~ "  ~  output memory start, current output point)"
-  20 20 7e 20 20 6f 75 74 70 75 74 20 6d 65 6d 6f
-  72 79 20 73 74 61 72 74 2c 20 63 75 72 72 65 6e
-  74 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 29 0a
+  ~ "  ~  current output point)"
+  20 20 7e 20 20 63 75 72 72 65 6e 74 20 6f 75 74
+  70 75 74 20 70 6f 69 6e 74 29 0a
 
   ~ ""
   0a
 
-  ~ "  ~ Invoke the provided header callback."
-  20 20 7e 20 49 6e 76 6f 6b 65 20 74 68 65 20 70
-  72 6f 76 69 64 65 64 20 68 65 61 64 65 72 20 63
-  61 6c 6c 62 61 63 6b 2e 0a
+  ~ "  ~ Switch based on the executable type."
+  20 20 7e 20 53 77 69 74 63 68 20 62 61 73 65 64
+  20 6f 6e 20 74 68 65 20 65 78 65 63 75 74 61 62
+  6c 65 20 74 79 70 65 2e 0a
 
-  ~ "  7 roll execute"
-  20 20 37 20 72 6f 6c 6c 20 65 78 65 63 75 74 65
-  0a
+  ~ "  5 pick compilation-definition-executable-type"
+  ~ " @"
+  20 20 35 20 70 69 63 6b 20 63 6f 6d 70 69 6c 61
+  74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f 6e 2d
+  65 78 65 63 75 74 61 62 6c 65 2d 74 79 70 65 20
+  40 0a
 
-  ~ "  ~ (compile-footer execution token, source to"
-  ~ " precompile,"
-  20 20 7e 20 28 63 6f 6d 70 69 6c 65 2d 66 6f 6f
-  74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 74 6f
-  6b 65 6e 2c 20 73 6f 75 72 63 65 20 74 6f 20 70
-  72 65 63 6f 6d 70 69 6c 65 2c 0a
+  ~ "  ~ (definition structure pointer, source to"
+  ~ " label-transform,"
+  20 20 7e 20 28 64 65 66 69 6e 69 74 69 6f 6e 20
+  73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65
+  72 2c 20 73 6f 75 72 63 65 20 74 6f 20 6c 61 62
+  65 6c 2d 74 72 61 6e 73 66 6f 72 6d 2c 0a
 
-  ~ "  ~  source to copy to log, source to include"
-  ~ " textually, output memory start,"
-  20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f 20 63
-  6f 70 79 20 74 6f 20 6c 6f 67 2c 20 73 6f 75 72
-  63 65 20 74 6f 20 69 6e 63 6c 75 64 65 20 74 65
-  78 74 75 61 6c 6c 79 2c 20 6f 75 74 70 75 74 20
-  6d 65 6d 6f 72 79 20 73 74 61 72 74 2c 0a
+  ~ "  ~  source to log-load transform, boot source,"
+  ~ " output memory start,"
+  20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f 20 6c
+  6f 67 2d 6c 6f 61 64 20 74 72 61 6e 73 66 6f 72
+  6d 2c 20 62 6f 6f 74 20 73 6f 75 72 63 65 2c 20
+  6f 75 74 70 75 74 20 6d 65 6d 6f 72 79 20 73 74
+  61 72 74 2c 0a
 
-  ~ "  ~  current output point)"
+  ~ "  ~  current output point, executable type)"
   20 20 7e 20 20 63 75 72 72 65 6e 74 20 6f 75 74
-  70 75 74 20 70 6f 69 6e 74 29 0a
+  70 75 74 20 70 6f 69 6e 74 2c 20 65 78 65 63 75
+  74 61 62 6c 65 20 74 79 70 65 29 0a
 
   ~ ""
   0a
 
-  ~ "  elf-file-header"
-  20 20 65 6c 66 2d 66 69 6c 65 2d 68 65 61 64 65
-  72 0a
+  ~ "  dup :raw-executable = {"
+  20 20 64 75 70 20 3a 72 61 77 2d 65 78 65 63 75
+  74 61 62 6c 65 20 3d 20 7b 0a
 
-  ~ "  elf-program-header"
-  20 20 65 6c 66 2d 70 72 6f 67 72 61 6d 2d 68 65
-  61 64 65 72 0a
+  ~ "    drop 3roll drop 3roll drop 3roll drop"
+  20 20 20 20 64 72 6f 70 20 33 72 6f 6c 6c 20 64
+  72 6f 70 20 33 72 6f 6c 6c 20 64 72 6f 70 20 33
+  72 6f 6c 6c 20 64 72 6f 70 0a
+
+  ~ "  ~ (definition structure pointer, output memory"
+  ~ " start, current output point)"
+  20 20 7e 20 28 64 65 66 69 6e 69 74 69 6f 6e 20
+  73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65
+  72 2c 20 6f 75 74 70 75 74 20 6d 65 6d 6f 72 79
+  20 73 74 61 72 74 2c 20 63 75 72 72 65 6e 74 20
+  6f 75 74 70 75 74 20 70 6f 69 6e 74 29 0a
 
   ~ ""
   0a
 
-  ~ "  output-cold-start"
-  20 20 6f 75 74 70 75 74 2d 63 6f 6c 64 2d 73 74
-  61 72 74 0a
+  ~ "    ~ Invoke the provided header callback, if"
+  ~ " it's nonzero."
+  20 20 20 20 7e 20 49 6e 76 6f 6b 65 20 74 68 65
+  20 70 72 6f 76 69 64 65 64 20 68 65 61 64 65 72
+  20 63 61 6c 6c 62 61 63 6b 2c 20 69 66 20 69 74
+  27 73 20 6e 6f 6e 7a 65 72 6f 2e 0a
+
+  ~ "    2 pick compilation-definition-compile-header"
+  ~ " @"
+  20 20 20 20 32 20 70 69 63 6b 20 63 6f 6d 70 69
+  6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f
+  6e 2d 63 6f 6d 70 69 6c 65 2d 68 65 61 64 65 72
+  20 40 0a
+
+  ~ "    dup { execute } { drop } if-else"
+  20 20 20 20 64 75 70 20 7b 20 65 78 65 63 75 74
+  65 20 7d 20 7b 20 64 72 6f 70 20 7d 20 69 66 2d
+  65 6c 73 65 0a
 
   ~ ""
   0a
 
-  ~ "  ~ Warm start and the log-loaded source."
-  20 20 7e 20 57 61 72 6d 20 73 74 61 72 74 20 61
-  6e 64 20 74 68 65 20 6c 6f 67 2d 6c 6f 61 64 65
-  64 20 73 6f 75 72 63 65 2e 0a
+  ~ "    ~ Invoke the provided body callback, if it's"
+  ~ " nonzero."
+  20 20 20 20 7e 20 49 6e 76 6f 6b 65 20 74 68 65
+  20 70 72 6f 76 69 64 65 64 20 62 6f 64 79 20 63
+  61 6c 6c 62 61 63 6b 2c 20 69 66 20 69 74 27 73
+  20 6e 6f 6e 7a 65 72 6f 2e 0a
 
-  ~ "  output-warm-start-header"
-  20 20 6f 75 74 70 75 74 2d 77 61 72 6d 2d 73 74
-  61 72 74 2d 68 65 61 64 65 72 0a
+  ~ "    2 pick compilation-definition-compile-body @"
+  20 20 20 20 32 20 70 69 63 6b 20 63 6f 6d 70 69
+  6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f
+  6e 2d 63 6f 6d 70 69 6c 65 2d 62 6f 64 79 20 40
+  0a
 
-  ~ "  4 roll log-load-transform"
-  20 20 34 20 72 6f 6c 6c 20 6c 6f 67 2d 6c 6f 61
-  64 2d 74 72 61 6e 73 66 6f 72 6d 0a
+  ~ "    dup { execute } { drop } if-else"
+  20 20 20 20 64 75 70 20 7b 20 65 78 65 63 75 74
+  65 20 7d 20 7b 20 64 72 6f 70 20 7d 20 69 66 2d
+  65 6c 73 65 0a
 
-  ~ "  ~ (compile-footer execution token, source to"
-  ~ " precompile,"
-  20 20 7e 20 28 63 6f 6d 70 69 6c 65 2d 66 6f 6f
-  74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 74 6f
-  6b 65 6e 2c 20 73 6f 75 72 63 65 20 74 6f 20 70
-  72 65 63 6f 6d 70 69 6c 65 2c 0a
+  ~ ""
+  0a
 
-  ~ "  ~  source to include textually, output memory"
-  ~ " start, current output point)"
-  20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f 20 69
-  6e 63 6c 75 64 65 20 74 65 78 74 75 61 6c 6c 79
+  ~ "    ~ Invoke the provided footer callback, if"
+  ~ " it's nonzero."
+  20 20 20 20 7e 20 49 6e 76 6f 6b 65 20 74 68 65
+  20 70 72 6f 76 69 64 65 64 20 66 6f 6f 74 65 72
+  20 63 61 6c 6c 62 61 63 6b 2c 20 69 66 20 69 74
+  27 73 20 6e 6f 6e 7a 65 72 6f 2e 0a
+
+  ~ "    2 pick compilation-definition-compile-footer"
+  ~ " @"
+  20 20 20 20 32 20 70 69 63 6b 20 63 6f 6d 70 69
+  6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f
+  6e 2d 63 6f 6d 70 69 6c 65 2d 66 6f 6f 74 65 72
+  20 40 0a
+
+  ~ "    dup { execute } { drop } if-else"
+  20 20 20 20 64 75 70 20 7b 20 65 78 65 63 75 74
+  65 20 7d 20 7b 20 64 72 6f 70 20 7d 20 69 66 2d
+  65 6c 73 65 0a
+
+  ~ ""
+  0a
+
+  ~ "    3roll drop"
+  20 20 20 20 33 72 6f 6c 6c 20 64 72 6f 70 0a
+
+  ~ ""
+  0a
+
+  ~ "    ~ (output memory start, current output"
+  ~ " point)"
+  20 20 20 20 7e 20 28 6f 75 74 70 75 74 20 6d 65
+  6d 6f 72 79 20 73 74 61 72 74 2c 20 63 75 72 72
+  65 6e 74 20 6f 75 74 70 75 74 20 70 6f 69 6e 74
+  29 0a
+
+  ~ "    exit"
+  20 20 20 20 65 78 69 74 0a
+
+  ~ "  } if"
+  20 20 7d 20 69 66 0a
+
+  ~ ""
+  0a
+
+  ~ "  dup :forth-executable = {"
+  20 20 64 75 70 20 3a 66 6f 72 74 68 2d 65 78 65
+  63 75 74 61 62 6c 65 20 3d 20 7b 0a
+
+  ~ "    drop"
+  20 20 20 20 64 72 6f 70 0a
+
+  ~ "    ~ (definition structure pointer, source to"
+  ~ " label-transform,"
+  20 20 20 20 7e 20 28 64 65 66 69 6e 69 74 69 6f
+  6e 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e
+  74 65 72 2c 20 73 6f 75 72 63 65 20 74 6f 20 6c
+  61 62 65 6c 2d 74 72 61 6e 73 66 6f 72 6d 2c 0a
+
+  ~ "    ~  source to log-load transform, boot source,"
+  ~ " output memory start,"
+  20 20 20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f
+  20 6c 6f 67 2d 6c 6f 61 64 20 74 72 61 6e 73 66
+  6f 72 6d 2c 20 62 6f 6f 74 20 73 6f 75 72 63 65
   2c 20 6f 75 74 70 75 74 20 6d 65 6d 6f 72 79 20
-  73 74 61 72 74 2c 20 63 75 72 72 65 6e 74 20 6f
+  73 74 61 72 74 2c 0a
+
+  ~ "    ~  current output point)"
+  20 20 20 20 7e 20 20 63 75 72 72 65 6e 74 20 6f
   75 74 70 75 74 20 70 6f 69 6e 74 29 0a
 
-  ~ "  output-warm-start-post-log-load-transform"
-  20 20 6f 75 74 70 75 74 2d 77 61 72 6d 2d 73 74
-  61 72 74 2d 70 6f 73 74 2d 6c 6f 67 2d 6c 6f 61
-  64 2d 74 72 61 6e 73 66 6f 72 6d 0a
+  ~ ""
+  0a
 
-  ~ "  output-warm-start-attach-boot-source"
-  20 20 6f 75 74 70 75 74 2d 77 61 72 6d 2d 73 74
-  61 72 74 2d 61 74 74 61 63 68 2d 62 6f 6f 74 2d
-  73 6f 75 72 63 65 0a
+  ~ "    ~ Invoke the provided header callback, if"
+  ~ " it's nonzero."
+  20 20 20 20 7e 20 49 6e 76 6f 6b 65 20 74 68 65
+  20 70 72 6f 76 69 64 65 64 20 68 65 61 64 65 72
+  20 63 61 6c 6c 62 61 63 6b 2c 20 69 66 20 69 74
+  27 73 20 6e 6f 6e 7a 65 72 6f 2e 0a
 
-  ~ "  output-warm-start-footer"
-  20 20 6f 75 74 70 75 74 2d 77 61 72 6d 2d 73 74
-  61 72 74 2d 66 6f 6f 74 65 72 0a
+  ~ "    5 pick compilation-definition-compile-header"
+  ~ " @"
+  20 20 20 20 35 20 70 69 63 6b 20 63 6f 6d 70 69
+  6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f
+  6e 2d 63 6f 6d 70 69 6c 65 2d 68 65 61 64 65 72
+  20 40 0a
+
+  ~ "    dup { execute } { drop } if-else"
+  20 20 20 20 64 75 70 20 7b 20 65 78 65 63 75 74
+  65 20 7d 20 7b 20 64 72 6f 70 20 7d 20 69 66 2d
+  65 6c 73 65 0a
 
   ~ ""
   0a
 
-  ~ "  ~ The label-transformed source."
-  20 20 7e 20 54 68 65 20 6c 61 62 65 6c 2d 74 72
-  61 6e 73 66 6f 72 6d 65 64 20 73 6f 75 72 63 65
-  2e 0a
+  ~ "    elf-file-header"
+  20 20 20 20 65 6c 66 2d 66 69 6c 65 2d 68 65 61
+  64 65 72 0a
 
-  ~ "  4 roll label-transform"
-  20 20 34 20 72 6f 6c 6c 20 6c 61 62 65 6c 2d 74
-  72 61 6e 73 66 6f 72 6d 0a
+  ~ "    elf-program-header"
+  20 20 20 20 65 6c 66 2d 70 72 6f 67 72 61 6d 2d
+  68 65 61 64 65 72 0a
 
-  ~ "  ~ (compile-footer execution token, source to"
-  ~ " include textually,"
-  20 20 7e 20 28 63 6f 6d 70 69 6c 65 2d 66 6f 6f
-  74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 74 6f
-  6b 65 6e 2c 20 73 6f 75 72 63 65 20 74 6f 20 69
-  6e 63 6c 75 64 65 20 74 65 78 74 75 61 6c 6c 79
-  2c 0a
+  ~ ""
+  0a
 
-  ~ "  ~  output memory start, current output point,"
-  ~ " final entry pointer)"
-  20 20 7e 20 20 6f 75 74 70 75 74 20 6d 65 6d 6f
-  72 79 20 73 74 61 72 74 2c 20 63 75 72 72 65 6e
-  74 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 2c 20
-  66 69 6e 61 6c 20 65 6e 74 72 79 20 70 6f 69 6e
-  74 65 72 29 0a
+  ~ "    output-cold-start"
+  20 20 20 20 6f 75 74 70 75 74 2d 63 6f 6c 64 2d
+  73 74 61 72 74 0a
+
+  ~ ""
+  0a
+
+  ~ "    ~ Warm start and the log-loaded source."
+  20 20 20 20 7e 20 57 61 72 6d 20 73 74 61 72 74
+  20 61 6e 64 20 74 68 65 20 6c 6f 67 2d 6c 6f 61
+  64 65 64 20 73 6f 75 72 63 65 2e 0a
+
+  ~ "    output-warm-start-header"
+  20 20 20 20 6f 75 74 70 75 74 2d 77 61 72 6d 2d
+  73 74 61 72 74 2d 68 65 61 64 65 72 0a
+
+  ~ "    4 roll log-load-transform"
+  20 20 20 20 34 20 72 6f 6c 6c 20 6c 6f 67 2d 6c
+  6f 61 64 2d 74 72 61 6e 73 66 6f 72 6d 0a
+
+  ~ "    ~ (definition structure pointer, source to"
+  ~ " label-transform, boot source,"
+  20 20 20 20 7e 20 28 64 65 66 69 6e 69 74 69 6f
+  6e 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e
+  74 65 72 2c 20 73 6f 75 72 63 65 20 74 6f 20 6c
+  61 62 65 6c 2d 74 72 61 6e 73 66 6f 72 6d 2c 20
+  62 6f 6f 74 20 73 6f 75 72 63 65 2c 0a
+
+  ~ "    ~  output memory start, current output"
+  ~ " point)"
+  20 20 20 20 7e 20 20 6f 75 74 70 75 74 20 6d 65
+  6d 6f 72 79 20 73 74 61 72 74 2c 20 63 75 72 72
+  65 6e 74 20 6f 75 74 70 75 74 20 70 6f 69 6e 74
+  29 0a
+
+  ~ "    output-warm-start-post-log-load-transform"
+  20 20 20 20 6f 75 74 70 75 74 2d 77 61 72 6d 2d
+  73 74 61 72 74 2d 70 6f 73 74 2d 6c 6f 67 2d 6c
+  6f 61 64 2d 74 72 61 6e 73 66 6f 72 6d 0a
+
+  ~ "    output-warm-start-attach-boot-source"
+  20 20 20 20 6f 75 74 70 75 74 2d 77 61 72 6d 2d
+  73 74 61 72 74 2d 61 74 74 61 63 68 2d 62 6f 6f
+  74 2d 73 6f 75 72 63 65 0a
+
+  ~ "    output-warm-start-footer"
+  20 20 20 20 6f 75 74 70 75 74 2d 77 61 72 6d 2d
+  73 74 61 72 74 2d 66 6f 6f 74 65 72 0a
 
   ~ ""
   0a
 
-  ~ "  ~ The boot source."
-  20 20 7e 20 54 68 65 20 62 6f 6f 74 20 73 6f 75
-  72 63 65 2e 0a
+  ~ "    ~ The label-transformed source."
+  20 20 20 20 7e 20 54 68 65 20 6c 61 62 65 6c 2d
+  74 72 61 6e 73 66 6f 72 6d 65 64 20 73 6f 75 72
+  63 65 2e 0a
+
+  ~ "    4 roll label-transform"
+  20 20 20 20 34 20 72 6f 6c 6c 20 6c 61 62 65 6c
+  2d 74 72 61 6e 73 66 6f 72 6d 0a
+
+  ~ "    ~ (definition structure pointer, boot source,"
+  ~ " output memory start,"
+  20 20 20 20 7e 20 28 64 65 66 69 6e 69 74 69 6f
+  6e 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e
+  74 65 72 2c 20 62 6f 6f 74 20 73 6f 75 72 63 65
+  2c 20 6f 75 74 70 75 74 20 6d 65 6d 6f 72 79 20
+  73 74 61 72 74 2c 0a
 
-  ~ "  4 roll output-boot-source"
-  20 20 34 20 72 6f 6c 6c 20 6f 75 74 70 75 74 2d
-  62 6f 6f 74 2d 73 6f 75 72 63 65 0a
+  ~ "    ~  current output point, final entry"
+  ~ " pointer)"
+  20 20 20 20 7e 20 20 63 75 72 72 65 6e 74 20 6f
+  75 74 70 75 74 20 70 6f 69 6e 74 2c 20 66 69 6e
+  61 6c 20 65 6e 74 72 79 20 70 6f 69 6e 74 65 72
+  29 0a
 
-  ~ "  ~ (compile-footer execution token, output"
+  ~ ""
+  0a
+
+  ~ "    3unroll"
+  20 20 20 20 33 75 6e 72 6f 6c 6c 0a
+
+  ~ ""
+  0a
+
+  ~ "    ~ Invoke the provided body callback, if it's"
+  ~ " nonzero."
+  20 20 20 20 7e 20 49 6e 76 6f 6b 65 20 74 68 65
+  20 70 72 6f 76 69 64 65 64 20 62 6f 64 79 20 63
+  61 6c 6c 62 61 63 6b 2c 20 69 66 20 69 74 27 73
+  20 6e 6f 6e 7a 65 72 6f 2e 0a
+
+  ~ "    4 pick compilation-definition-compile-body @"
+  20 20 20 20 34 20 70 69 63 6b 20 63 6f 6d 70 69
+  6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f
+  6e 2d 63 6f 6d 70 69 6c 65 2d 62 6f 64 79 20 40
+  0a
+
+  ~ "    dup { execute } { drop } if-else"
+  20 20 20 20 64 75 70 20 7b 20 65 78 65 63 75 74
+  65 20 7d 20 7b 20 64 72 6f 70 20 7d 20 69 66 2d
+  65 6c 73 65 0a
+
+  ~ ""
+  0a
+
+  ~ "    3roll"
+  20 20 20 20 33 72 6f 6c 6c 0a
+
+  ~ ""
+  0a
+
+  ~ "    ~ The boot source."
+  20 20 20 20 7e 20 54 68 65 20 62 6f 6f 74 20 73
+  6f 75 72 63 65 2e 0a
+
+  ~ "    4 roll output-boot-source"
+  20 20 20 20 34 20 72 6f 6c 6c 20 6f 75 74 70 75
+  74 2d 62 6f 6f 74 2d 73 6f 75 72 63 65 0a
+
+  ~ "    ~ (definition structure pointer, output"
   ~ " memory start,"
-  20 20 7e 20 28 63 6f 6d 70 69 6c 65 2d 66 6f 6f
-  74 65 72 20 65 78 65 63 75 74 69 6f 6e 20 74 6f
-  6b 65 6e 2c 20 6f 75 74 70 75 74 20 6d 65 6d 6f
+  20 20 20 20 7e 20 28 64 65 66 69 6e 69 74 69 6f
+  6e 20 73 74 72 75 63 74 75 72 65 20 70 6f 69 6e
+  74 65 72 2c 20 6f 75 74 70 75 74 20 6d 65 6d 6f
   72 79 20 73 74 61 72 74 2c 0a
 
-  ~ "  ~  current output point)"
-  20 20 7e 20 20 63 75 72 72 65 6e 74 20 6f 75 74
-  70 75 74 20 70 6f 69 6e 74 29 0a
+  ~ "    ~  current output point)"
+  20 20 20 20 7e 20 20 63 75 72 72 65 6e 74 20 6f
+  75 74 70 75 74 20 70 6f 69 6e 74 29 0a
 
   ~ ""
   0a
 
-  ~ "  ~ Invoke the provided footer callback."
-  20 20 7e 20 49 6e 76 6f 6b 65 20 74 68 65 20 70
-  72 6f 76 69 64 65 64 20 66 6f 6f 74 65 72 20 63
-  61 6c 6c 62 61 63 6b 2e 0a
+  ~ "    ~ Invoke the provided footer callback, if"
+  ~ " it's nonzero."
+  20 20 20 20 7e 20 49 6e 76 6f 6b 65 20 74 68 65
+  20 70 72 6f 76 69 64 65 64 20 66 6f 6f 74 65 72
+  20 63 61 6c 6c 62 61 63 6b 2c 20 69 66 20 69 74
+  27 73 20 6e 6f 6e 7a 65 72 6f 2e 0a
 
-  ~ "  3roll execute"
-  20 20 33 72 6f 6c 6c 20 65 78 65 63 75 74 65 0a
+  ~ "    2 pick compilation-definition-compile-footer"
+  ~ " @"
+  20 20 20 20 32 20 70 69 63 6b 20 63 6f 6d 70 69
+  6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f
+  6e 2d 63 6f 6d 70 69 6c 65 2d 66 6f 6f 74 65 72
+  20 40 0a
 
-  ~ "  ~ (output memory start, current output point)"
-  20 20 7e 20 28 6f 75 74 70 75 74 20 6d 65 6d 6f
-  72 79 20 73 74 61 72 74 2c 20 63 75 72 72 65 6e
-  74 20 6f 75 74 70 75 74 20 70 6f 69 6e 74 29 0a
+  ~ "    dup { execute } { drop } if-else"
+  20 20 20 20 64 75 70 20 7b 20 65 78 65 63 75 74
+  65 20 7d 20 7b 20 64 72 6f 70 20 7d 20 69 66 2d
+  65 6c 73 65 0a
 
-  ~ "  ;"
-  20 20 3b 0a
+  ~ ""
+  0a
+
+  ~ "    3roll drop"
+  20 20 20 20 33 72 6f 6c 6c 20 64 72 6f 70 0a
+
+  ~ ""
+  0a
+
+  ~ "    ~ (output memory start, current output"
+  ~ " point)"
+  20 20 20 20 7e 20 28 6f 75 74 70 75 74 20 6d 65
+  6d 6f 72 79 20 73 74 61 72 74 2c 20 63 75 72 72
+  65 6e 74 20 6f 75 74 70 75 74 20 70 6f 69 6e 74
+  29 0a
+
+  ~ "    exit"
+  20 20 20 20 65 78 69 74 0a
+
+  ~ "  } if"
+  20 20 7d 20 69 66 0a
+
+  ~ ""
+  0a
+
+  ~ "  ." Invalid executable type in compilation"
+  ~ " definition." 1 sys-exit ;"
+  20 20 2e 22 20 49 6e 76 61 6c 69 64 20 65 78 65
+  63 75 74 61 62 6c 65 20 74 79 70 65 20 69 6e 20
+  63 6f 6d 70 69 6c 61 74 69 6f 6e 20 64 65 66 69
+  6e 69 74 69 6f 6e 2e 22 20 31 20 73 79 73 2d 65
+  78 69 74 20 3b 0a
 
   ~ ""
   0a
@@ -115259,6 +115613,22 @@
   3a 20 65 6e 63 68 61 6e 74 2d 66 72 6f 6d 2d 64
   65 66 69 6e 69 74 69 6f 6e 0a
 
+  ~ "  ~   We do this work here, rather than inside"
+  ~ " output-contents, because it"
+  20 20 7e 20 20 20 57 65 20 64 6f 20 74 68 69 73
+  20 77 6f 72 6b 20 68 65 72 65 2c 20 72 61 74 68
+  65 72 20 74 68 61 6e 20 69 6e 73 69 64 65 20 6f
+  75 74 70 75 74 2d 63 6f 6e 74 65 6e 74 73 2c 20
+  62 65 63 61 75 73 65 20 69 74 0a
+
+  ~ "  ~ would be wasteful to do it in every iteration"
+  ~ " of the label-loop."
+  20 20 7e 20 77 6f 75 6c 64 20 62 65 20 77 61 73
+  74 65 66 75 6c 20 74 6f 20 64 6f 20 69 74 20 69
+  6e 20 65 76 65 72 79 20 69 74 65 72 61 74 69 6f
+  6e 20 6f 66 20 74 68 65 20 6c 61 62 65 6c 2d 6c
+  6f 6f 70 2e 0a
+
   ~ "  dup dup dup"
   20 20 64 75 70 20 64 75 70 20 64 75 70 0a
 
@@ -115287,18 +115657,16 @@
   20 20 72 65 61 64 2d 69 6e 70 75 74 73 0a
 
   ~ "  ~ (definition structure pointer, source to"
-  ~ " precompile,"
+  ~ " label-transform,"
   20 20 7e 20 28 64 65 66 69 6e 69 74 69 6f 6e 20
   73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65
-  72 2c 20 73 6f 75 72 63 65 20 74 6f 20 70 72 65
-  63 6f 6d 70 69 6c 65 2c 0a
+  72 2c 20 73 6f 75 72 63 65 20 74 6f 20 6c 61 62
+  65 6c 2d 74 72 61 6e 73 66 6f 72 6d 2c 0a
 
-  ~ "  ~  source to copy to log, source to copy"
-  ~ " textually)"
-  20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f 20 63
-  6f 70 79 20 74 6f 20 6c 6f 67 2c 20 73 6f 75 72
-  63 65 20 74 6f 20 63 6f 70 79 20 74 65 78 74 75
-  61 6c 6c 79 29 0a
+  ~ "  ~  source to log-load transform, boot source)"
+  20 20 7e 20 20 73 6f 75 72 63 65 20 74 6f 20 6c
+  6f 67 2d 6c 6f 61 64 20 74 72 61 6e 73 66 6f 72
+  6d 2c 20 62 6f 6f 74 20 73 6f 75 72 63 65 29 0a
 
   ~ ""
   0a
@@ -115330,19 +115698,9 @@
   ~ "  docol ,"
   20 20 64 6f 63 6f 6c 20 2c 0a
 
-  ~ "  4 pick compilation-definition-compile-header @"
-  ~ " literal"
-  20 20 34 20 70 69 63 6b 20 63 6f 6d 70 69 6c 61
-  74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f 6e 2d
-  63 6f 6d 70 69 6c 65 2d 68 65 61 64 65 72 20 40
-  20 6c 69 74 65 72 61 6c 0a
-
-  ~ "  4 pick compilation-definition-compile-footer @"
-  ~ " literal"
-  20 20 34 20 70 69 63 6b 20 63 6f 6d 70 69 6c 61
-  74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f 6e 2d
-  63 6f 6d 70 69 6c 65 2d 66 6f 6f 74 65 72 20 40
-  20 6c 69 74 65 72 61 6c 0a
+  ~ "  5 roll literal"
+  20 20 35 20 72 6f 6c 6c 20 6c 69 74 65 72 61 6c
+  0a
 
   ~ "  4 roll literal"
   20 20 34 20 72 6f 6c 6c 20 6c 69 74 65 72 61 6c
@@ -115546,6 +115904,32 @@
   3a 20 69 6e 73 63 72 69 62 65 2d 66 72 6f 6d 2d
   64 65 66 69 6e 69 74 69 6f 6e 0a
 
+  ~ "  ~   If we're inscribing something other than"
+  ~ " "evoke", we need to load"
+  20 20 7e 20 20 20 49 66 20 77 65 27 72 65 20 69
+  6e 73 63 72 69 62 69 6e 67 20 73 6f 6d 65 74 68
+  69 6e 67 20 6f 74 68 65 72 20 74 68 61 6e 20 22
+  65 76 6f 6b 65 22 2c 20 77 65 20 6e 65 65 64 20
+  74 6f 20 6c 6f 61 64 0a
+
+  ~ "  ~ evoke's source also, first."
+  20 20 7e 20 65 76 6f 6b 65 27 73 20 73 6f 75 72
+  63 65 20 61 6c 73 6f 2c 20 66 69 72 73 74 2e 0a
+
+  ~ "  s" evoke-executable-data" find dup {"
+  ~ " entry-to-execution-token execute } if"
+  20 20 73 22 20 65 76 6f 6b 65 2d 65 78 65 63 75
+  74 61 62 6c 65 2d 64 61 74 61 22 20 66 69 6e 64
+  20 64 75 70 20 7b 20 65 6e 74 72 79 2d 74 6f 2d
+  65 78 65 63 75 74 69 6f 6e 2d 74 6f 6b 65 6e 20
+  65 78 65 63 75 74 65 20 7d 20 69 66 0a
+
+  ~ "  swap"
+  20 20 73 77 61 70 0a
+
+  ~ ""
+  0a
+
   ~ "  ~   We begin by constructing the full text of"
   ~ " all the source that will be"
   20 20 7e 20 20 20 57 65 20 62 65 67 69 6e 20 62
@@ -115593,21 +115977,48 @@
   ~ "  here @ dup"
   20 20 68 65 72 65 20 40 20 64 75 70 0a
 
-  ~ "  ~ (definition structure pointer,"
-  ~ " hex-transformed source pointer,"
-  20 20 7e 20 28 64 65 66 69 6e 69 74 69 6f 6e 20
-  73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65
-  72 2c 20 68 65 78 2d 74 72 61 6e 73 66 6f 72 6d
-  65 64 20 73 6f 75 72 63 65 20 70 6f 69 6e 74 65
-  72 2c 0a
+  ~ "  ~ (parent definition structure pointer,"
+  ~ " definition structure pointer,"
+  20 20 7e 20 28 70 61 72 65 6e 74 20 64 65 66 69
+  6e 69 74 69 6f 6e 20 73 74 72 75 63 74 75 72 65
+  20 70 6f 69 6e 74 65 72 2c 20 64 65 66 69 6e 69
+  74 69 6f 6e 20 73 74 72 75 63 74 75 72 65 20 70
+  6f 69 6e 74 65 72 2c 0a
 
-  ~ "  ~  output point)"
-  20 20 7e 20 20 6f 75 74 70 75 74 20 70 6f 69 6e
+  ~ "  ~  hex-transformed source pointer, output"
+  ~ " point)"
+  20 20 7e 20 20 68 65 78 2d 74 72 61 6e 73 66 6f
+  72 6d 65 64 20 73 6f 75 72 63 65 20 70 6f 69 6e
+  74 65 72 2c 20 6f 75 74 70 75 74 20 70 6f 69 6e
   74 29 0a
 
   ~ ""
   0a
 
+  ~ "  3 pick 3 pick != {"
+  20 20 33 20 70 69 63 6b 20 33 20 70 69 63 6b 20
+  21 3d 20 7b 0a
+
+  ~ "    3 pick"
+  ~ " compilation-definition-static-filenames @"
+  20 20 20 20 33 20 70 69 63 6b 20 63 6f 6d 70 69
+  6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f
+  6e 2d 73 74 61 74 69 63 2d 66 69 6c 65 6e 61 6d
+  65 73 20 40 0a
+
+  ~ "    dup { read-inputs-from-filename-list } { drop"
+  ~ " } if-else"
+  20 20 20 20 64 75 70 20 7b 20 72 65 61 64 2d 69
+  6e 70 75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65 6e
+  61 6d 65 2d 6c 69 73 74 20 7d 20 7b 20 64 72 6f
+  70 20 7d 20 69 66 2d 65 6c 73 65 0a
+
+  ~ "  } if"
+  20 20 7d 20 69 66 0a
+
+  ~ ""
+  0a
+
   ~ "  2 pick compilation-definition-static-filenames"
   ~ " @"
   20 20 32 20 70 69 63 6b 20 63 6f 6d 70 69 6c 61
@@ -115615,11 +116026,37 @@
   73 74 61 74 69 63 2d 66 69 6c 65 6e 61 6d 65 73
   20 40 0a
 
-  ~ "  read-inputs-from-filename-list"
-  20 20 72 65 61 64 2d 69 6e 70 75 74 73 2d 66 72
-  6f 6d 2d 66 69 6c 65 6e 61 6d 65 2d 6c 69 73 74
+  ~ "  dup { read-inputs-from-filename-list } { drop }"
+  ~ " if-else"
+  20 20 64 75 70 20 7b 20 72 65 61 64 2d 69 6e 70
+  75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65 6e 61 6d
+  65 2d 6c 69 73 74 20 7d 20 7b 20 64 72 6f 70 20
+  7d 20 69 66 2d 65 6c 73 65 0a
+
+  ~ ""
   0a
 
+  ~ "  3 pick 3 pick != {"
+  20 20 33 20 70 69 63 6b 20 33 20 70 69 63 6b 20
+  21 3d 20 7b 0a
+
+  ~ "    3 pick"
+  ~ " compilation-definition-dynamic-filenames @"
+  20 20 20 20 33 20 70 69 63 6b 20 63 6f 6d 70 69
+  6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f
+  6e 2d 64 79 6e 61 6d 69 63 2d 66 69 6c 65 6e 61
+  6d 65 73 20 40 0a
+
+  ~ "    dup { read-inputs-from-filename-list } { drop"
+  ~ " } if-else"
+  20 20 20 20 64 75 70 20 7b 20 72 65 61 64 2d 69
+  6e 70 75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65 6e
+  61 6d 65 2d 6c 69 73 74 20 7d 20 7b 20 64 72 6f
+  70 20 7d 20 69 66 2d 65 6c 73 65 0a
+
+  ~ "  } if"
+  20 20 7d 20 69 66 0a
+
   ~ ""
   0a
 
@@ -115630,11 +116067,37 @@
   64 79 6e 61 6d 69 63 2d 66 69 6c 65 6e 61 6d 65
   73 20 40 0a
 
-  ~ "  read-inputs-from-filename-list"
-  20 20 72 65 61 64 2d 69 6e 70 75 74 73 2d 66 72
-  6f 6d 2d 66 69 6c 65 6e 61 6d 65 2d 6c 69 73 74
+  ~ "  dup { read-inputs-from-filename-list } { drop }"
+  ~ " if-else"
+  20 20 64 75 70 20 7b 20 72 65 61 64 2d 69 6e 70
+  75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65 6e 61 6d
+  65 2d 6c 69 73 74 20 7d 20 7b 20 64 72 6f 70 20
+  7d 20 69 66 2d 65 6c 73 65 0a
+
+  ~ ""
   0a
 
+  ~ "  3 pick 3 pick != {"
+  20 20 33 20 70 69 63 6b 20 33 20 70 69 63 6b 20
+  21 3d 20 7b 0a
+
+  ~ "    3 pick compilation-definition-boot-filenames"
+  ~ " @"
+  20 20 20 20 33 20 70 69 63 6b 20 63 6f 6d 70 69
+  6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69 6f
+  6e 2d 62 6f 6f 74 2d 66 69 6c 65 6e 61 6d 65 73
+  20 40 0a
+
+  ~ "    dup { read-inputs-from-filename-list } { drop"
+  ~ " } if-else"
+  20 20 20 20 64 75 70 20 7b 20 72 65 61 64 2d 69
+  6e 70 75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65 6e
+  61 6d 65 2d 6c 69 73 74 20 7d 20 7b 20 64 72 6f
+  70 20 7d 20 69 66 2d 65 6c 73 65 0a
+
+  ~ "  } if"
+  20 20 7d 20 69 66 0a
+
   ~ ""
   0a
 
@@ -115644,11 +116107,31 @@
   62 6f 6f 74 2d 66 69 6c 65 6e 61 6d 65 73 20 40
   0a
 
-  ~ "  read-inputs-from-filename-list"
-  20 20 72 65 61 64 2d 69 6e 70 75 74 73 2d 66 72
-  6f 6d 2d 66 69 6c 65 6e 61 6d 65 2d 6c 69 73 74
+  ~ "  dup { read-inputs-from-filename-list } { drop }"
+  ~ " if-else"
+  20 20 64 75 70 20 7b 20 72 65 61 64 2d 69 6e 70
+  75 74 73 2d 66 72 6f 6d 2d 66 69 6c 65 6e 61 6d
+  65 2d 6c 69 73 74 20 7d 20 7b 20 64 72 6f 70 20
+  7d 20 69 66 2d 65 6c 73 65 0a
+
+  ~ ""
   0a
 
+  ~ "  4 roll drop"
+  20 20 34 20 72 6f 6c 6c 20 64 72 6f 70 0a
+
+  ~ "  ~ (definition structure pointer,"
+  ~ " hex-transformed source pointer,"
+  20 20 7e 20 28 64 65 66 69 6e 69 74 69 6f 6e 20
+  73 74 72 75 63 74 75 72 65 20 70 6f 69 6e 74 65
+  72 2c 20 68 65 78 2d 74 72 61 6e 73 66 6f 72 6d
+  65 64 20 73 6f 75 72 63 65 20 70 6f 69 6e 74 65
+  72 2c 0a
+
+  ~ "  ~  output point)"
+  20 20 7e 20 20 6f 75 74 70 75 74 20 70 6f 69 6e
+  74 29 0a
+
   ~ ""
   0a
 
@@ -116070,7 +116553,7 @@
   ~   This is the end of the long string literal. We now return you to the
   ~ normal hex-dump stuff.
 
-  00 00 00 00 00                    ~                     (alignment padding)
-~ label total-size at offset 0x00000000000af948 is here.
+  00 00 00                          ~                     (alignment padding)
+~ label total-size at offset 0x00000000000b0570 is here.
 
 ~ This is the end of the hex dump. Thanks for reading!
diff --git a/hello.e b/hello.e
index a19d076..593dc95 100644
--- a/hello.e
+++ b/hello.e
@@ -1,4 +1,6 @@
-~ cat labels.e elf.e hello.e | ./quine > hello && chmod 755 hello && ./hello
+~ ./evoke hello.e enchant > hello && chmod 755 hello && ./hello
+
+s" evoke.e" include drop
 
 : output-start-routine
   current-offset L!' cold-start
@@ -31,6 +33,21 @@
   current-offset L!' total-size
   ;
 
-x' all-contents label-loop
-1 3unroll sys-write bye
+
+: define-compilation
+  allocate-compilation-definition
+  dup zero-compilation-definition
+  ~ (definition)
+
+  :raw-executable over compilation-definition-executable-type !
+
+  [ current-input-file-name literal-string ]
+  over compilation-definition-top-level-filename !
+
+  x' all-contents over compilation-definition-compile-body !
+
+  s" hello-executable-data" variable ;
+define-compilation
+
+: latest-executable-data hello-executable-data ;
 
diff --git a/hex.e b/hex.e
index 8a57383..9c645f0 100644
--- a/hex.e
+++ b/hex.e
@@ -1,4 +1,7 @@
-~ cat hex.e | ./evoke > hex && chmod 755 hex
+~ ./evoke hex.e enchant > hex && chmod 755 hex
+~ ./evoke hex.e inscribe > hex.hex
+
+s" evoke.e" include drop
 
 ~ (buffer start, output point, label offset
 ~  -- buffer start, output point)
@@ -303,6 +306,20 @@
   ~ : This is the end of the hex dump.
   ;
 
-x' all-contents label-loop
-1 3unroll sys-write bye
+: define-compilation
+  allocate-compilation-definition
+  dup zero-compilation-definition
+  ~ (definition)
+
+  :raw-executable over compilation-definition-executable-type !
+
+  [ current-input-file-name literal-string ]
+  over compilation-definition-top-level-filename !
+
+  x' all-contents over compilation-definition-compile-body !
+
+  s" hex-executable-data" variable ;
+define-compilation
+
+: latest-executable-data hex-executable-data ;
 
diff --git a/inscribe-hex.e b/inscribe-hex.e
deleted file mode 100644
index 519fb16..0000000
--- a/inscribe-hex.e
+++ /dev/null
@@ -1,29 +0,0 @@
-~ cat inscribe-hex.e | ./evoke > hex.hex
-
-: prepare
-  here @ dup
-  s" language/static/core.e" pack-file-contents
-  s" language/static/linux.e" pack-file-contents
-  s" language/static/output.e" pack-file-contents
-  s" language/static/amd64.e" pack-file-contents
-  s" language/static/execution-support.e" pack-file-contents
-  s" language/static/log-load.e" pack-file-contents
-  s" language/dynamic/dynamic.e" pack-file-contents
-  s" language/dynamic/input.e" pack-file-contents
-  s" language/dynamic/interpret.e" pack-file-contents
-  s" language/dynamic/flow-control.e" pack-file-contents
-  s" language/dynamic/linux.e" pack-file-contents
-  s" language/dynamic/files.e" pack-file-contents
-  s" compilation/labels.e" pack-file-contents
-  s" compilation/elf.e" pack-file-contents
-  s" hex.e" pack-file-contents
-  0 pack8 8 packalign here !
-  s" hex-source" variable
-
-  1024 1024 * allocate s" hex-binary" variable
-  1024 1024 * allocate s" hex-metadata" variable ;
-
-prepare
-hex-metadata hex-binary dup hex-source hex-transform
-bye
-