about summary refs log tree commit diff
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2026-10-05 19:54:39 -0700
committerIrene Knapp <ireneista@irenes.space>2026-10-05 19:54:39 -0700
commit39304d51c4a6d057e6515a9f75db2086940f6877 (patch)
treee7ed75c42d3a0bd877303e10cce9f7f9bd5d79fd
parentb8798f26ee09c4b30ffe033bd657a7f4c99210e5 (diff)
move to a struct-based definition of compilation inputs
the migration process was a pain - order of operations for the rebuild was rough to figure out - but the actual implementation is way easier than all that stack juggling

Force-Push: yes
Change-Id: I8bbe4dfb39e5f0ed69f9759e87ac6ab79ec7558b
-rw-r--r--README.txt4
-rw-r--r--compilation/top-level.e146
-rw-r--r--evoke.e90
-rw-r--r--evoke.hex803
4 files changed, 598 insertions, 445 deletions
diff --git a/README.txt b/README.txt
index ff3e8fa..be65a21 100644
--- a/README.txt
+++ b/README.txt
@@ -305,7 +305,7 @@ built-in library.
 the compiler. When you have a change you want to try it out, you can use your
 existing copy of Evocation to compile a new one, like this:
 
-  $ echo 's" evoke.e" enchant' | ./evoke > evoke2
+  $ echo 's" evoke.e" include drop enchant' | ./evoke > evoke2
   $ chmod 755 evoke2
 
   You can then run ./evoke2 and try out the new features you added. Fun,
@@ -384,7 +384,7 @@ can be metacircular while you're metacircular.)
 also works on Forth programs, including Evocation itself. To produce the
 hex-dump version of Evocation, do:
 
-  $ echo 's" evoke.e" inscribe' | ./evoke > evoke.hex
+  $ echo 's" evoke.e" include drop inscribe' | ./evoke > evoke.hex
 
   It should run to completion, producing output in evoke.hex. Passing
 evoke.hex through ./hex will give a binary that's byte-for-byte identical to
diff --git a/compilation/top-level.e b/compilation/top-level.e
index 669c074..7c714cb 100644
--- a/compilation/top-level.e
+++ b/compilation/top-level.e
@@ -15,6 +15,16 @@
 ~ different levels of abstraction.
 
 
+: 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 * + ;
+: allocate-compilation-definition
+  6 8 * allocate ;
+
+
 ~   This accepts a pointer to an existing buffer for file contents to be
 ~ appended to, and another pointer to the start of a packed list of filenames.
 ~ The filename list consists of null-terminated strings, all directly abutting
@@ -114,15 +124,18 @@
   ;
 
 
-~   Given a description of an executable, compile and output that executable
-~ as runnable binary, to standard output.
+~   Given a compilation-definition structure which is a description of an
+~ executable, compile and output that executable as runnable binary, to
+~ standard output.
 ~
-~ (static source filename list, dynamic source filename list,
-~  boot source filename list, compile-header word name,
-~  compile-footer word name --)
-: enchant-from-description
-  5 roll 5 roll 5 roll read-inputs
-  ~ (compile-header word name, compile-footer word name, source to precompile,
+~ (definition structure pointer --)
+: enchant-from-definition
+  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)
 
   ~   We need an execution token to pass to label-loop. There's no reason to
@@ -130,8 +143,8 @@
   ~ executable word body directly.
   here @
   docol ,
-  6 roll find entry-to-execution-token literal
-  5 roll find entry-to-execution-token literal
+  4 pick compilation-definition-compile-header @ literal
+  4 pick compilation-definition-compile-footer @ literal
   4 roll literal
   3 roll literal
   swap literal
@@ -143,20 +156,22 @@
   bye ;
 
 
-~   Given a filename containing the top-level source of an executable, compile
-~ and output that executable as runnable binary, to standard output.
+~   Look up the word "latest-executable-data" dynamically, thus taking the
+~ most recent copy of it at runtime, invoke it, and use the resulting value
+~ as the compilation definition for enchant-from-definition.
 ~
-~ (top-level source filename --)
+~   The typical way to use this word is immediately after including the
+~ top-level source file of the executable you want to enchant.
 : enchant
-  include drop
   s" latest-executable-data" find entry-to-execution-token execute
-  enchant-from-description ;
+  enchant-from-definition ;
 
 
-~   Given a filename containing the top-level source of an executable, compile
-~ and output that executable as a commented hex dump, to standard output.
-~ Processing the hex dump through "hex" will give an identical binary to what
-~ "enchant" would have produced, with the same inputs.
+~   Given a compilation-definition structure which is a description of an
+~ executable, compile and output that executable as commented hex dump, to
+~ standard output. Processing that hex dump through "hex" will give an
+~ identical binary to what "enchant" would have produced, with the same
+~ inputs.
 ~
 ~   Please notice that if the thing we're compiling is "evoke" and its list
 ~ of source files has changed, we'll be working with the new list, not
@@ -166,15 +181,8 @@
 ~ being compiled; see the description of "enchant", above, for more details
 ~ and discussion of the implications.
 ~
-~ (top-level source filename --)
-: inscribe
-  allocate-string-if-temporary
-  dup include drop
-  s" latest-executable-data" find entry-to-execution-token execute
-  ~ (top-level source filename, static source filename list,
-  ~  dynamic source filename list, boot source filename list,
-  ~  compile-header word name, compile-footer word name --)
-
+~ (definition structure pointer --)
+: inscribe-from-definition
   ~   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
@@ -182,52 +190,53 @@
   ~ "enchant", and having a stray unused copy of inscribe is harmless, so we
   ~ don't try to exclude it.
   here @ dup
-  ~ (top-level source filename, static source filename list,
-  ~  dynamic source filename list, boot source filename list,
-  ~  compile-header word name, compile-footer word name,
-  ~  hex-transformed source pointer, output point)
+  ~ (definition structure pointer, hex-transformed source pointer,
+  ~  output point)
 
-  6 pick read-inputs-from-filename-list
-  5 pick read-inputs-from-filename-list
-  4 pick read-inputs-from-filename-list
-  8 roll pack-file-contents
+  2 pick compilation-definition-static-filenames @
+  read-inputs-from-filename-list
+
+  2 pick compilation-definition-dynamic-filenames @
+  read-inputs-from-filename-list
+
+  2 pick compilation-definition-boot-filenames @
+  read-inputs-from-filename-list
+
+  ~   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!
+  s"  : current-input-file-name [ s" pack-raw-string
+  ~ Outputting quotation marks is, as always, a pain.
+  0x22 pack8 s"  " pack-raw-string
+  2 pick compilation-definition-top-level-filename @ pack-raw-string
+  0x22 pack8
+  s"  literal-string ] ; " pack-raw-string
+
+  ~ Having set that up, now we can include the actual top-level file.
+  2 pick compilation-definition-top-level-filename @
+  pack-file-contents
 
   ~   We need to create a call to "enchant" in the code under transformation.
   ~ That call doesn't need to be arrived at in exactly the same way as an
   ~ independent call would be, since it doesn't become part of the output, it
   ~ only needs to have the same effect.
   ~
-  ~   So, we can take the filename list pointers that will become parameters
-  ~ to "enchant" and pass them in directly, heedless of the fact they
-  ~ reference locations in the outer log.
-  s"  0x" pack-raw-string 7 roll pack-hex64
-  s"  0x" pack-raw-string 6 roll pack-hex64
-  s"  0x" pack-raw-string 5 roll pack-hex64
-  ~ (compile-header word name, compile-footer word name,
-  ~  hex-transformed source pointer, output point)
-
-  ~   We do not have that luxury with the two compile hooks; we need copies of
-  ~ them that are under the hex transform. We produce code that looks them up
-  ~ by name. Notice that this is possible because we included the top-level
-  ~ source in our full source text.
+  ~   With that said, though, since one way or another it's going to be
+  ~ looking up latest-executable-data dynamically, there's no reason to try
+  ~ any sophisticated means of passing individual fields or anything.
   ~
-  ~   Outputting quotation marks is, as always, a pain.
-  s"  s" pack-raw-string 0x22 pack8 s"  " pack-raw-string
-  4 roll pack-raw-string
-  0x22 pack8
-  s"  allocate-string" pack-raw-string
-
-  s"  s" pack-raw-string 0x22 pack8 s"  " pack-raw-string
-  3roll pack-raw-string
-  0x22 pack8
-  s"  allocate-string" pack-raw-string
-  ~ (hex-transformed source pointer, output point)
-
-  s"  enchant-from-description" pack-raw-string
-  ~ (hex-transformed source pointer, output point)
+  ~   It might seem as if that's an unnecessary level of indirection, but for
+  ~ the two compile hooks we specifically need to make sure the enchantment
+  ~ uses the copies of them that are under the hex transform. So, one way or
+  ~ another it's always relying on the code from the top-level source file.
+  s"  enchant" pack-raw-string
+  ~ (definition struction pointer, hex-transformed source pointer,
+  ~  output point)
   0 pack8 8 packalign here !
 
+  ~ That's everything we need from the definition.
+  swap drop
   ~ (hex-transformed source pointer)
+
   1024 1024 4 * * allocate
   1024 1024 8 * * allocate
   ~ (hex-transformed source pointer, binary buffer pointer,
@@ -235,3 +244,14 @@
 
   swap dup 4 roll hex-transform bye ;
 
+
+~   Look up the word "latest-executable-data" dynamically, thus taking the
+~ most recent copy of it at runtime, invoke it, and use the resulting value
+~ as the compilation definition for enchant-from-definition.
+~
+~   The typical way to use this word is immediately after including the
+~ top-level source file of the executable you want to inscribe.
+: inscribe
+  s" latest-executable-data" find entry-to-execution-token execute
+  inscribe-from-definition ;
+
diff --git a/evoke.e b/evoke.e
index 4726461..a51dfa9 100644
--- a/evoke.e
+++ b/evoke.e
@@ -1,40 +1,6 @@
 ~ echo 's" evoke.e" enchant' | ./evoke > evoke2 && chmod 755 evoke2
 ~ echo 's" evoke.e" inscribe' | ./evoke > evoke.hex
 
-: define-inputs
-  here @ dup
-  s" language/static/core.e" packstring
-  s" language/static/linux.e" packstring
-  s" language/static/output.e" packstring
-  s" language/static/amd64.e" packstring
-  s" language/static/execution-support.e" packstring
-  s" language/static/log-load.e" packstring
-  0 pack8 8 packalign here !
-  s" static-sources" variable
-
-  here @ dup
-  s" language/dynamic/dynamic.e" packstring
-  s" language/dynamic/input.e" packstring
-  s" language/dynamic/interpret.e" packstring
-  s" language/dynamic/flow-control.e" packstring
-  s" language/dynamic/linux.e" packstring
-  s" language/dynamic/files.e" packstring
-  s" language/dynamic/command-line.e" packstring
-  0 pack8 8 packalign here !
-  s" dynamic-sources" variable
-
-  here @ dup
-  s" compilation/labels.e" packstring
-  s" compilation/elf.e" packstring
-  s" compilation/transform.e" packstring
-  s" compilation/execution.e" packstring
-  s" compilation/top-level.e" packstring
-  s" language/boot-source-footer.e" packstring
-  0 pack8 8 packalign here !
-  s" boot-sources" variable ;
-define-inputs
-
-
 ~ (output memory start, current output point
 ~  -- output memory start, current output point)
 : compile-header
@@ -50,6 +16,7 @@ define-inputs
   ~ : blank-line
   0x08000000 L!' origin ;
 
+
 ~ (output memory start, current output point
 ~  -- output memory start, current output point)
 : compile-footer
@@ -67,15 +34,52 @@ define-inputs
   ;
 
 
-~ (-- static source filename list, dynamic source filename list,
-~  boot source filename list, compile-header word name,
-~  compile-footer word name)
-: evoke-executable-data
-  static-sources
-  dynamic-sources
-  boot-sources
-  s" compile-header"
-  s" compile-footer" ;
+: define-compilation
+  allocate-compilation-definition
+  ~ (definition)
+
+  [ current-input-file-name literal-string ]
+  over compilation-definition-top-level-filename !
+
+  here @ dup
+  s" language/static/core.e" packstring
+  s" language/static/linux.e" packstring
+  s" language/static/output.e" packstring
+  s" language/static/amd64.e" packstring
+  s" language/static/execution-support.e" packstring
+  s" language/static/log-load.e" packstring
+  0 pack8 8 packalign here !
+  over compilation-definition-static-filenames !
+
+  here @ dup
+  s" language/dynamic/dynamic.e" packstring
+  s" language/dynamic/input.e" packstring
+  s" language/dynamic/interpret.e" packstring
+  s" language/dynamic/flow-control.e" packstring
+  s" language/dynamic/linux.e" packstring
+  s" language/dynamic/files.e" packstring
+  s" language/dynamic/command-line.e" packstring
+  0 pack8 8 packalign here !
+  over compilation-definition-dynamic-filenames !
+
+  here @ dup
+  s" compilation/labels.e" packstring
+  s" compilation/elf.e" packstring
+  s" compilation/transform.e" packstring
+  s" compilation/execution.e" packstring
+  s" compilation/top-level.e" packstring
+  s" language/boot-source-footer.e" packstring
+  0 pack8 8 packalign here !
+  over compilation-definition-boot-filenames !
+
+  x' compile-header
+  over compilation-definition-compile-header !
+
+  x' compile-footer
+  over compilation-definition-compile-footer !
+
+  s" evoke-executable-data" variable ;
+define-compilation
 
 : latest-executable-data evoke-executable-data ;
 
diff --git a/evoke.hex b/evoke.hex
index d061b80..b97bb43 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)
 
-  98 eb 0a 00 00 00 00 00           ~ *size in file
-  98 eb 0a 00 00 00 00 00           ~ *size in memory
+  d0 ee 0a 00 00 00 00 00           ~ *size in file
+  d0 ee 0a 00 00 00 00 00           ~ *size in memory
 
   00 00 00 00 00 00 00 00           ~ segment alignment
 
@@ -114306,6 +114306,59 @@
   ~ ""
   0a
 
+  ~ ": compilation-definition-top-level-filename ;"
+  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 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 + ;"
+  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
+
+  ~ ": compilation-definition-dynamic-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 64 79 6e 61 6d 69 63
+  2d 66 69 6c 65 6e 61 6d 65 73 20 32 20 38 20 2a
+  20 2b 20 3b 0a
+
+  ~ ": compilation-definition-boot-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 62 6f 6f 74 2d 66 69
+  6c 65 6e 61 6d 65 73 20 33 20 38 20 2a 20 2b 20
+  3b 0a
+
+  ~ ": compilation-definition-compile-header 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 63 6f 6d 70 69 6c 65
+  2d 68 65 61 64 65 72 20 34 20 38 20 2a 20 2b 20
+  3b 0a
+
+  ~ ": compilation-definition-compile-footer 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 66 6f 6f 74 65 72 20 35 20 38 20 2a 20 2b 20
+  3b 0a
+
+  ~ ": allocate-compilation-definition"
+  3a 20 61 6c 6c 6f 63 61 74 65 2d 63 6f 6d 70 69
+  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
+  20 3b 0a
+
+  ~ ""
+  0a
+
+  ~ ""
+  0a
+
   ~ "~   This accepts a pointer to an existing buffer"
   ~ " for file contents to be"
   7e 20 20 20 54 68 69 73 20 61 63 63 65 70 74 73
@@ -114814,56 +114867,71 @@
   ~ ""
   0a
 
-  ~ "~   Given a description of an executable, compile"
-  ~ " and output that executable"
-  7e 20 20 20 47 69 76 65 6e 20 61 20 64 65 73 63
-  72 69 70 74 69 6f 6e 20 6f 66 20 61 6e 20 65 78
-  65 63 75 74 61 62 6c 65 2c 20 63 6f 6d 70 69 6c
-  65 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61
-  74 20 65 78 65 63 75 74 61 62 6c 65 0a
+  ~ "~   Given a compilation-definition structure"
+  ~ " which is a description of an"
+  7e 20 20 20 47 69 76 65 6e 20 61 20 63 6f 6d 70
+  69 6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69
+  6f 6e 20 73 74 72 75 63 74 75 72 65 20 77 68 69
+  63 68 20 69 73 20 61 20 64 65 73 63 72 69 70 74
+  69 6f 6e 20 6f 66 20 61 6e 0a
 
-  ~ "~ as runnable binary, to standard output."
-  7e 20 61 73 20 72 75 6e 6e 61 62 6c 65 20 62 69
-  6e 61 72 79 2c 20 74 6f 20 73 74 61 6e 64 61 72
-  64 20 6f 75 74 70 75 74 2e 0a
+  ~ "~ executable, compile and output that executable"
+  ~ " as runnable binary, to"
+  7e 20 65 78 65 63 75 74 61 62 6c 65 2c 20 63 6f
+  6d 70 69 6c 65 20 61 6e 64 20 6f 75 74 70 75 74
+  20 74 68 61 74 20 65 78 65 63 75 74 61 62 6c 65
+  20 61 73 20 72 75 6e 6e 61 62 6c 65 20 62 69 6e
+  61 72 79 2c 20 74 6f 0a
+
+  ~ "~ standard output."
+  7e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75
+  74 2e 0a
 
   ~ "~"
   7e 0a
 
-  ~ "~ (static source filename list, dynamic source"
-  ~ " filename list,"
-  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
+  ~ "~ (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
 
-  ~ "~  boot source filename list, compile-header word"
-  ~ " name,"
-  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 63 6f
-  6d 70 69 6c 65 2d 68 65 61 64 65 72 20 77 6f 72
-  64 20 6e 61 6d 65 2c 0a
+  ~ ": enchant-from-definition"
+  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
 
-  ~ "~  compile-footer word name --)"
-  7e 20 20 63 6f 6d 70 69 6c 65 2d 66 6f 6f 74 65
-  72 20 77 6f 72 64 20 6e 61 6d 65 20 2d 2d 29 0a
+  ~ "  dup dup dup"
+  20 20 64 75 70 20 64 75 70 20 64 75 70 0a
 
-  ~ ": enchant-from-description"
-  3a 20 65 6e 63 68 61 6e 74 2d 66 72 6f 6d 2d 64
-  65 73 63 72 69 70 74 69 6f 6e 0a
+  ~ "  compilation-definition-boot-filenames @"
+  ~ " 3unroll"
+  20 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 20 33 75 6e 72 6f 6c
+  6c 0a
 
-  ~ "  5 roll 5 roll 5 roll read-inputs"
-  20 20 35 20 72 6f 6c 6c 20 35 20 72 6f 6c 6c 20
-  35 20 72 6f 6c 6c 20 72 65 61 64 2d 69 6e 70 75
-  74 73 0a
+  ~ "  compilation-definition-dynamic-filenames @"
+  ~ " 3unroll"
+  20 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 20 33 75 6e
+  72 6f 6c 6c 0a
+
+  ~ "  compilation-definition-static-filenames @"
+  ~ " 3unroll"
+  20 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 20 33 75 6e 72
+  6f 6c 6c 0a
 
-  ~ "  ~ (compile-header word name, compile-footer"
-  ~ " word name, source to precompile,"
-  20 20 7e 20 28 63 6f 6d 70 69 6c 65 2d 68 65 61
-  64 65 72 20 77 6f 72 64 20 6e 61 6d 65 2c 20 63
-  6f 6d 70 69 6c 65 2d 66 6f 6f 74 65 72 20 77 6f
-  72 64 20 6e 61 6d 65 2c 20 73 6f 75 72 63 65 20
-  74 6f 20 70 72 65 63 6f 6d 70 69 6c 65 2c 0a
+  ~ "  read-inputs"
+  20 20 72 65 61 64 2d 69 6e 70 75 74 73 0a
+
+  ~ "  ~ (definition structure pointer, source to"
+  ~ " precompile,"
+  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
 
   ~ "  ~  source to copy to log, source to copy"
   ~ " textually)"
@@ -114902,15 +114970,19 @@
   ~ "  docol ,"
   20 20 64 6f 63 6f 6c 20 2c 0a
 
-  ~ "  6 roll find entry-to-execution-token literal"
-  20 20 36 20 72 6f 6c 6c 20 66 69 6e 64 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 6c 69 74 65 72 61 6c 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
 
-  ~ "  5 roll find entry-to-execution-token literal"
-  20 20 35 20 72 6f 6c 6c 20 66 69 6e 64 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 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
 
   ~ "  4 roll literal"
   20 20 34 20 72 6f 6c 6c 20 6c 69 74 65 72 61 6c
@@ -114949,36 +115021,50 @@
   ~ ""
   0a
 
-  ~ "~   Given a filename containing the top-level"
-  ~ " source of an executable, compile"
-  7e 20 20 20 47 69 76 65 6e 20 61 20 66 69 6c 65
-  6e 61 6d 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20
-  74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 73 6f
-  75 72 63 65 20 6f 66 20 61 6e 20 65 78 65 63 75
-  74 61 62 6c 65 2c 20 63 6f 6d 70 69 6c 65 0a
+  ~ "~   Look up the word "latest-executable-data""
+  ~ " dynamically, thus taking the"
+  7e 20 20 20 4c 6f 6f 6b 20 75 70 20 74 68 65 20
+  77 6f 72 64 20 22 6c 61 74 65 73 74 2d 65 78 65
+  63 75 74 61 62 6c 65 2d 64 61 74 61 22 20 64 79
+  6e 61 6d 69 63 61 6c 6c 79 2c 20 74 68 75 73 20
+  74 61 6b 69 6e 67 20 74 68 65 0a
+
+  ~ "~ most recent copy of it at runtime, invoke it,"
+  ~ " and use the resulting value"
+  7e 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f
+  70 79 20 6f 66 20 69 74 20 61 74 20 72 75 6e 74
+  69 6d 65 2c 20 69 6e 76 6f 6b 65 20 69 74 2c 20
+  61 6e 64 20 75 73 65 20 74 68 65 20 72 65 73 75
+  6c 74 69 6e 67 20 76 61 6c 75 65 0a
 
-  ~ "~ and output that executable as runnable binary,"
-  ~ " to standard output."
-  7e 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61
-  74 20 65 78 65 63 75 74 61 62 6c 65 20 61 73 20
-  72 75 6e 6e 61 62 6c 65 20 62 69 6e 61 72 79 2c
-  20 74 6f 20 73 74 61 6e 64 61 72 64 20 6f 75 74
-  70 75 74 2e 0a
+  ~ "~ as the compilation definition for"
+  ~ " enchant-from-definition."
+  7e 20 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 61
+  74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20
+  66 6f 72 20 65 6e 63 68 61 6e 74 2d 66 72 6f 6d
+  2d 64 65 66 69 6e 69 74 69 6f 6e 2e 0a
 
   ~ "~"
   7e 0a
 
-  ~ "~ (top-level source filename --)"
-  7e 20 28 74 6f 70 2d 6c 65 76 65 6c 20 73 6f 75
-  72 63 65 20 66 69 6c 65 6e 61 6d 65 20 2d 2d 29
-  0a
+  ~ "~   The typical way to use this word is"
+  ~ " immediately after including the"
+  7e 20 20 20 54 68 65 20 74 79 70 69 63 61 6c 20
+  77 61 79 20 74 6f 20 75 73 65 20 74 68 69 73 20
+  77 6f 72 64 20 69 73 20 69 6d 6d 65 64 69 61 74
+  65 6c 79 20 61 66 74 65 72 20 69 6e 63 6c 75 64
+  69 6e 67 20 74 68 65 0a
+
+  ~ "~ top-level source file of the executable you"
+  ~ " want to enchant."
+  7e 20 74 6f 70 2d 6c 65 76 65 6c 20 73 6f 75 72
+  63 65 20 66 69 6c 65 20 6f 66 20 74 68 65 20 65
+  78 65 63 75 74 61 62 6c 65 20 79 6f 75 20 77 61
+  6e 74 20 74 6f 20 65 6e 63 68 61 6e 74 2e 0a
 
   ~ ": enchant"
   3a 20 65 6e 63 68 61 6e 74 0a
 
-  ~ "  include drop"
-  20 20 69 6e 63 6c 75 64 65 20 64 72 6f 70 0a
-
   ~ "  s" latest-executable-data" find"
   ~ " entry-to-execution-token execute"
   20 20 73 22 20 6c 61 74 65 73 74 2d 65 78 65 63
@@ -114987,9 +115073,9 @@
   74 69 6f 6e 2d 74 6f 6b 65 6e 20 65 78 65 63 75
   74 65 0a
 
-  ~ "  enchant-from-description ;"
+  ~ "  enchant-from-definition ;"
   20 20 65 6e 63 68 61 6e 74 2d 66 72 6f 6d 2d 64
-  65 73 63 72 69 70 74 69 6f 6e 20 3b 0a
+  65 66 69 6e 69 74 69 6f 6e 20 3b 0a
 
   ~ ""
   0a
@@ -114997,36 +115083,40 @@
   ~ ""
   0a
 
-  ~ "~   Given a filename containing the top-level"
-  ~ " source of an executable, compile"
-  7e 20 20 20 47 69 76 65 6e 20 61 20 66 69 6c 65
-  6e 61 6d 65 20 63 6f 6e 74 61 69 6e 69 6e 67 20
-  74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 73 6f
-  75 72 63 65 20 6f 66 20 61 6e 20 65 78 65 63 75
-  74 61 62 6c 65 2c 20 63 6f 6d 70 69 6c 65 0a
+  ~ "~   Given a compilation-definition structure"
+  ~ " which is a description of an"
+  7e 20 20 20 47 69 76 65 6e 20 61 20 63 6f 6d 70
+  69 6c 61 74 69 6f 6e 2d 64 65 66 69 6e 69 74 69
+  6f 6e 20 73 74 72 75 63 74 75 72 65 20 77 68 69
+  63 68 20 69 73 20 61 20 64 65 73 63 72 69 70 74
+  69 6f 6e 20 6f 66 20 61 6e 0a
+
+  ~ "~ executable, compile and output that executable"
+  ~ " as commented hex dump, to"
+  7e 20 65 78 65 63 75 74 61 62 6c 65 2c 20 63 6f
+  6d 70 69 6c 65 20 61 6e 64 20 6f 75 74 70 75 74
+  20 74 68 61 74 20 65 78 65 63 75 74 61 62 6c 65
+  20 61 73 20 63 6f 6d 6d 65 6e 74 65 64 20 68 65
+  78 20 64 75 6d 70 2c 20 74 6f 0a
 
-  ~ "~ and output that executable as a commented hex"
-  ~ " dump, to standard output."
-  7e 20 61 6e 64 20 6f 75 74 70 75 74 20 74 68 61
-  74 20 65 78 65 63 75 74 61 62 6c 65 20 61 73 20
-  61 20 63 6f 6d 6d 65 6e 74 65 64 20 68 65 78 20
-  64 75 6d 70 2c 20 74 6f 20 73 74 61 6e 64 61 72
-  64 20 6f 75 74 70 75 74 2e 0a
+  ~ "~ standard output. Processing that hex dump"
+  ~ " through "hex" will give an"
+  7e 20 73 74 61 6e 64 61 72 64 20 6f 75 74 70 75
+  74 2e 20 50 72 6f 63 65 73 73 69 6e 67 20 74 68
+  61 74 20 68 65 78 20 64 75 6d 70 20 74 68 72 6f
+  75 67 68 20 22 68 65 78 22 20 77 69 6c 6c 20 67
+  69 76 65 20 61 6e 0a
 
-  ~ "~ Processing the hex dump through "hex" will give"
-  ~ " an identical binary to what"
-  7e 20 50 72 6f 63 65 73 73 69 6e 67 20 74 68 65
-  20 68 65 78 20 64 75 6d 70 20 74 68 72 6f 75 67
-  68 20 22 68 65 78 22 20 77 69 6c 6c 20 67 69 76
-  65 20 61 6e 20 69 64 65 6e 74 69 63 61 6c 20 62
-  69 6e 61 72 79 20 74 6f 20 77 68 61 74 0a
+  ~ "~ identical binary to what "enchant" would have"
+  ~ " produced, with the same"
+  7e 20 69 64 65 6e 74 69 63 61 6c 20 62 69 6e 61
+  72 79 20 74 6f 20 77 68 61 74 20 22 65 6e 63 68
+  61 6e 74 22 20 77 6f 75 6c 64 20 68 61 76 65 20
+  70 72 6f 64 75 63 65 64 2c 20 77 69 74 68 20 74
+  68 65 20 73 61 6d 65 0a
 
-  ~ "~ "enchant" would have produced, with the same"
-  ~ " inputs."
-  7e 20 22 65 6e 63 68 61 6e 74 22 20 77 6f 75 6c
-  64 20 68 61 76 65 20 70 72 6f 64 75 63 65 64 2c
-  20 77 69 74 68 20 74 68 65 20 73 61 6d 65 20 69
-  6e 70 75 74 73 2e 0a
+  ~ "~ inputs."
+  7e 20 69 6e 70 75 74 73 2e 0a
 
   ~ "~"
   7e 0a
@@ -115087,53 +115177,14 @@
   ~ "~"
   7e 0a
 
-  ~ "~ (top-level source filename --)"
-  7e 20 28 74 6f 70 2d 6c 65 76 65 6c 20 73 6f 75
-  72 63 65 20 66 69 6c 65 6e 61 6d 65 20 2d 2d 29
-  0a
-
-  ~ ": inscribe"
-  3a 20 69 6e 73 63 72 69 62 65 0a
-
-  ~ "  allocate-string-if-temporary"
-  20 20 61 6c 6c 6f 63 61 74 65 2d 73 74 72 69 6e
-  67 2d 69 66 2d 74 65 6d 70 6f 72 61 72 79 0a
-
-  ~ "  dup include drop"
-  20 20 64 75 70 20 69 6e 63 6c 75 64 65 20 64 72
-  6f 70 0a
-
-  ~ "  s" latest-executable-data" find"
-  ~ " entry-to-execution-token execute"
-  20 20 73 22 20 6c 61 74 65 73 74 2d 65 78 65 63
-  75 74 61 62 6c 65 2d 64 61 74 61 22 20 66 69 6e
-  64 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 0a
-
-  ~ "  ~ (top-level source filename, static source"
-  ~ " filename list,"
-  20 20 7e 20 28 74 6f 70 2d 6c 65 76 65 6c 20 73
-  6f 75 72 63 65 20 66 69 6c 65 6e 61 6d 65 2c 20
-  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 0a
-
-  ~ "  ~  dynamic source filename list, boot source"
-  ~ " filename list,"
-  20 20 7e 20 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 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 0a
-
-  ~ "  ~  compile-header word name, compile-footer"
-  ~ " word name --)"
-  20 20 7e 20 20 63 6f 6d 70 69 6c 65 2d 68 65 61
-  64 65 72 20 77 6f 72 64 20 6e 61 6d 65 2c 20 63
-  6f 6d 70 69 6c 65 2d 66 6f 6f 74 65 72 20 77 6f
-  72 64 20 6e 61 6d 65 20 2d 2d 29 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
 
-  ~ ""
-  0a
+  ~ ": inscribe-from-definition"
+  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
 
   ~ "  ~   We begin by constructing the full text of"
   ~ " all the source that will be"
@@ -115182,55 +115233,138 @@
   ~ "  here @ dup"
   20 20 68 65 72 65 20 40 20 64 75 70 0a
 
-  ~ "  ~ (top-level source filename, static source"
-  ~ " filename list,"
-  20 20 7e 20 28 74 6f 70 2d 6c 65 76 65 6c 20 73
-  6f 75 72 63 65 20 66 69 6c 65 6e 61 6d 65 2c 20
-  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 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
 
-  ~ "  ~  dynamic source filename list, boot source"
-  ~ " filename list,"
-  20 20 7e 20 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 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 0a
-
-  ~ "  ~  compile-header word name, compile-footer"
-  ~ " word name,"
-  20 20 7e 20 20 63 6f 6d 70 69 6c 65 2d 68 65 61
-  64 65 72 20 77 6f 72 64 20 6e 61 6d 65 2c 20 63
-  6f 6d 70 69 6c 65 2d 66 6f 6f 74 65 72 20 77 6f
-  72 64 20 6e 61 6d 65 2c 0a
-
-  ~ "  ~  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
+  ~ "  ~  output point)"
+  20 20 7e 20 20 6f 75 74 70 75 74 20 70 6f 69 6e
   74 29 0a
 
   ~ ""
   0a
 
-  ~ "  6 pick read-inputs-from-filename-list"
-  20 20 36 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
+  ~ "  2 pick compilation-definition-static-filenames"
+  ~ " @"
+  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
+  73 74 61 74 69 63 2d 66 69 6c 65 6e 61 6d 65 73
+  20 40 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
+  ~ "  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
+  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
+  ~ ""
+  0a
+
+  ~ "  2 pick compilation-definition-dynamic-filenames"
+  ~ " @"
+  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
+  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
+  0a
+
+  ~ ""
+  0a
+
+  ~ "  2 pick compilation-definition-boot-filenames @"
+  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
+  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
+  0a
+
+  ~ ""
+  0a
+
+  ~ "  ~   The top-level source file will try to look"
+  ~ " up its own filename, but this"
+  20 20 7e 20 20 20 54 68 65 20 74 6f 70 2d 6c 65
+  76 65 6c 20 73 6f 75 72 63 65 20 66 69 6c 65 20
+  77 69 6c 6c 20 74 72 79 20 74 6f 20 6c 6f 6f 6b
+  20 75 70 20 69 74 73 20 6f 77 6e 20 66 69 6c 65
+  6e 61 6d 65 2c 20 62 75 74 20 74 68 69 73 0a
+
+  ~ "  ~ is all on standard input, so it doesn't have"
+  ~ " one. We must deceive it!"
+  20 20 7e 20 69 73 20 61 6c 6c 20 6f 6e 20 73 74
+  61 6e 64 61 72 64 20 69 6e 70 75 74 2c 20 73 6f
+  20 69 74 20 64 6f 65 73 6e 27 74 20 68 61 76 65
+  20 6f 6e 65 2e 20 57 65 20 6d 75 73 74 20 64 65
+  63 65 69 76 65 20 69 74 21 0a
+
+  ~ "  s"  : current-input-file-name [ s""
+  ~ " pack-raw-string"
+  20 20 73 22 20 20 3a 20 63 75 72 72 65 6e 74 2d
+  69 6e 70 75 74 2d 66 69 6c 65 2d 6e 61 6d 65 20
+  5b 20 73 22 20 70 61 63 6b 2d 72 61 77 2d 73 74
+  72 69 6e 67 0a
+
+  ~ "  ~ Outputting quotation marks is, as always, a"
+  ~ " pain."
+  20 20 7e 20 4f 75 74 70 75 74 74 69 6e 67 20 71
+  75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73 20 69
+  73 2c 20 61 73 20 61 6c 77 61 79 73 2c 20 61 20
+  70 61 69 6e 2e 0a
+
+  ~ "  0x22 pack8 s"  " pack-raw-string"
+  20 20 30 78 32 32 20 70 61 63 6b 38 20 73 22 20
+  20 22 20 70 61 63 6b 2d 72 61 77 2d 73 74 72 69
+  6e 67 0a
+
+  ~ "  2 pick"
+  ~ " compilation-definition-top-level-filename @"
+  ~ " pack-raw-string"
+  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
+  74 6f 70 2d 6c 65 76 65 6c 2d 66 69 6c 65 6e 61
+  6d 65 20 40 20 70 61 63 6b 2d 72 61 77 2d 73 74
+  72 69 6e 67 0a
+
+  ~ "  0x22 pack8"
+  20 20 30 78 32 32 20 70 61 63 6b 38 0a
 
-  ~ "  8 roll pack-file-contents"
-  20 20 38 20 72 6f 6c 6c 20 70 61 63 6b 2d 66 69
-  6c 65 2d 63 6f 6e 74 65 6e 74 73 0a
+  ~ "  s"  literal-string ] ; " pack-raw-string"
+  20 20 73 22 20 20 6c 69 74 65 72 61 6c 2d 73 74
+  72 69 6e 67 20 5d 20 3b 20 22 20 70 61 63 6b 2d
+  72 61 77 2d 73 74 72 69 6e 67 0a
+
+  ~ ""
+  0a
+
+  ~ "  ~ Having set that up, now we can include the"
+  ~ " actual top-level file."
+  20 20 7e 20 48 61 76 69 6e 67 20 73 65 74 20 74
+  68 61 74 20 75 70 2c 20 6e 6f 77 20 77 65 20 63
+  61 6e 20 69 6e 63 6c 75 64 65 20 74 68 65 20 61
+  63 74 75 61 6c 20 74 6f 70 2d 6c 65 76 65 6c 20
+  66 69 6c 65 2e 0a
+
+  ~ "  2 pick"
+  ~ " compilation-definition-top-level-filename @"
+  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
+  74 6f 70 2d 6c 65 76 65 6c 2d 66 69 6c 65 6e 61
+  6d 65 20 40 0a
+
+  ~ "  pack-file-contents"
+  20 20 70 61 63 6b 2d 66 69 6c 65 2d 63 6f 6e 74
+  65 6e 74 73 0a
 
   ~ ""
   0a
@@ -115267,159 +115401,79 @@
   ~ "  ~"
   20 20 7e 0a
 
-  ~ "  ~   So, we can take the filename list pointers"
-  ~ " that will become parameters"
-  20 20 7e 20 20 20 53 6f 2c 20 77 65 20 63 61 6e
-  20 74 61 6b 65 20 74 68 65 20 66 69 6c 65 6e 61
-  6d 65 20 6c 69 73 74 20 70 6f 69 6e 74 65 72 73
-  20 74 68 61 74 20 77 69 6c 6c 20 62 65 63 6f 6d
-  65 20 70 61 72 61 6d 65 74 65 72 73 0a
-
-  ~ "  ~ to "enchant" and pass them in directly,"
-  ~ " heedless of the fact they"
-  20 20 7e 20 74 6f 20 22 65 6e 63 68 61 6e 74 22
-  20 61 6e 64 20 70 61 73 73 20 74 68 65 6d 20 69
-  6e 20 64 69 72 65 63 74 6c 79 2c 20 68 65 65 64
-  6c 65 73 73 20 6f 66 20 74 68 65 20 66 61 63 74
-  20 74 68 65 79 0a
-
-  ~ "  ~ reference locations in the outer log."
-  20 20 7e 20 72 65 66 65 72 65 6e 63 65 20 6c 6f
-  63 61 74 69 6f 6e 73 20 69 6e 20 74 68 65 20 6f
-  75 74 65 72 20 6c 6f 67 2e 0a
-
-  ~ "  s"  0x" pack-raw-string 7 roll pack-hex64"
-  20 20 73 22 20 20 30 78 22 20 70 61 63 6b 2d 72
-  61 77 2d 73 74 72 69 6e 67 20 37 20 72 6f 6c 6c
-  20 70 61 63 6b 2d 68 65 78 36 34 0a
-
-  ~ "  s"  0x" pack-raw-string 6 roll pack-hex64"
-  20 20 73 22 20 20 30 78 22 20 70 61 63 6b 2d 72
-  61 77 2d 73 74 72 69 6e 67 20 36 20 72 6f 6c 6c
-  20 70 61 63 6b 2d 68 65 78 36 34 0a
-
-  ~ "  s"  0x" pack-raw-string 5 roll pack-hex64"
-  20 20 73 22 20 20 30 78 22 20 70 61 63 6b 2d 72
-  61 77 2d 73 74 72 69 6e 67 20 35 20 72 6f 6c 6c
-  20 70 61 63 6b 2d 68 65 78 36 34 0a
-
-  ~ "  ~ (compile-header word name, compile-footer"
-  ~ " word name,"
-  20 20 7e 20 28 63 6f 6d 70 69 6c 65 2d 68 65 61
-  64 65 72 20 77 6f 72 64 20 6e 61 6d 65 2c 20 63
-  6f 6d 70 69 6c 65 2d 66 6f 6f 74 65 72 20 77 6f
-  72 64 20 6e 61 6d 65 2c 0a
-
-  ~ "  ~  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
-
-  ~ "  ~   We do not have that luxury with the two"
-  ~ " compile hooks; we need copies of"
-  20 20 7e 20 20 20 57 65 20 64 6f 20 6e 6f 74 20
-  68 61 76 65 20 74 68 61 74 20 6c 75 78 75 72 79
-  20 77 69 74 68 20 74 68 65 20 74 77 6f 20 63 6f
-  6d 70 69 6c 65 20 68 6f 6f 6b 73 3b 20 77 65 20
-  6e 65 65 64 20 63 6f 70 69 65 73 20 6f 66 0a
-
-  ~ "  ~ them that are under the hex transform. We"
-  ~ " produce code that looks them up"
-  20 20 7e 20 74 68 65 6d 20 74 68 61 74 20 61 72
-  65 20 75 6e 64 65 72 20 74 68 65 20 68 65 78 20
-  74 72 61 6e 73 66 6f 72 6d 2e 20 57 65 20 70 72
-  6f 64 75 63 65 20 63 6f 64 65 20 74 68 61 74 20
-  6c 6f 6f 6b 73 20 74 68 65 6d 20 75 70 0a
-
-  ~ "  ~ by name. Notice that this is possible because"
-  ~ " we included the top-level"
-  20 20 7e 20 62 79 20 6e 61 6d 65 2e 20 4e 6f 74
-  69 63 65 20 74 68 61 74 20 74 68 69 73 20 69 73
-  20 70 6f 73 73 69 62 6c 65 20 62 65 63 61 75 73
-  65 20 77 65 20 69 6e 63 6c 75 64 65 64 20 74 68
-  65 20 74 6f 70 2d 6c 65 76 65 6c 0a
-
-  ~ "  ~ source in our full source text."
-  20 20 7e 20 73 6f 75 72 63 65 20 69 6e 20 6f 75
-  72 20 66 75 6c 6c 20 73 6f 75 72 63 65 20 74 65
-  78 74 2e 0a
+  ~ "  ~   With that said, though, since one way or"
+  ~ " another it's going to be"
+  20 20 7e 20 20 20 57 69 74 68 20 74 68 61 74 20
+  73 61 69 64 2c 20 74 68 6f 75 67 68 2c 20 73 69
+  6e 63 65 20 6f 6e 65 20 77 61 79 20 6f 72 20 61
+  6e 6f 74 68 65 72 20 69 74 27 73 20 67 6f 69 6e
+  67 20 74 6f 20 62 65 0a
+
+  ~ "  ~ looking up latest-executable-data"
+  ~ " dynamically, there's no reason to try"
+  20 20 7e 20 6c 6f 6f 6b 69 6e 67 20 75 70 20 6c
+  61 74 65 73 74 2d 65 78 65 63 75 74 61 62 6c 65
+  2d 64 61 74 61 20 64 79 6e 61 6d 69 63 61 6c 6c
+  79 2c 20 74 68 65 72 65 27 73 20 6e 6f 20 72 65
+  61 73 6f 6e 20 74 6f 20 74 72 79 0a
+
+  ~ "  ~ any sophisticated means of passing individual"
+  ~ " fields or anything."
+  20 20 7e 20 61 6e 79 20 73 6f 70 68 69 73 74 69
+  63 61 74 65 64 20 6d 65 61 6e 73 20 6f 66 20 70
+  61 73 73 69 6e 67 20 69 6e 64 69 76 69 64 75 61
+  6c 20 66 69 65 6c 64 73 20 6f 72 20 61 6e 79 74
+  68 69 6e 67 2e 0a
 
   ~ "  ~"
   20 20 7e 0a
 
-  ~ "  ~   Outputting quotation marks is, as always, a"
-  ~ " pain."
-  20 20 7e 20 20 20 4f 75 74 70 75 74 74 69 6e 67
-  20 71 75 6f 74 61 74 69 6f 6e 20 6d 61 72 6b 73
-  20 69 73 2c 20 61 73 20 61 6c 77 61 79 73 2c 20
-  61 20 70 61 69 6e 2e 0a
-
-  ~ "  s"  s" pack-raw-string 0x22 pack8 s"  ""
-  ~ " pack-raw-string"
-  20 20 73 22 20 20 73 22 20 70 61 63 6b 2d 72 61
-  77 2d 73 74 72 69 6e 67 20 30 78 32 32 20 70 61
-  63 6b 38 20 73 22 20 20 22 20 70 61 63 6b 2d 72
-  61 77 2d 73 74 72 69 6e 67 0a
-
-  ~ "  4 roll pack-raw-string"
-  20 20 34 20 72 6f 6c 6c 20 70 61 63 6b 2d 72 61
-  77 2d 73 74 72 69 6e 67 0a
-
-  ~ "  0x22 pack8"
-  20 20 30 78 32 32 20 70 61 63 6b 38 0a
-
-  ~ "  s"  allocate-string" pack-raw-string"
-  20 20 73 22 20 20 61 6c 6c 6f 63 61 74 65 2d 73
-  74 72 69 6e 67 22 20 70 61 63 6b 2d 72 61 77 2d
-  73 74 72 69 6e 67 0a
-
-  ~ ""
-  0a
-
-  ~ "  s"  s" pack-raw-string 0x22 pack8 s"  ""
-  ~ " pack-raw-string"
-  20 20 73 22 20 20 73 22 20 70 61 63 6b 2d 72 61
-  77 2d 73 74 72 69 6e 67 20 30 78 32 32 20 70 61
-  63 6b 38 20 73 22 20 20 22 20 70 61 63 6b 2d 72
-  61 77 2d 73 74 72 69 6e 67 0a
-
-  ~ "  3roll pack-raw-string"
-  20 20 33 72 6f 6c 6c 20 70 61 63 6b 2d 72 61 77
-  2d 73 74 72 69 6e 67 0a
-
-  ~ "  0x22 pack8"
-  20 20 30 78 32 32 20 70 61 63 6b 38 0a
-
-  ~ "  s"  allocate-string" pack-raw-string"
-  20 20 73 22 20 20 61 6c 6c 6f 63 61 74 65 2d 73
-  74 72 69 6e 67 22 20 70 61 63 6b 2d 72 61 77 2d
-  73 74 72 69 6e 67 0a
-
-  ~ "  ~ (hex-transformed source pointer, output"
-  ~ " point)"
-  20 20 7e 20 28 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
-
-  ~ "  s"  enchant-from-description" pack-raw-string"
-  20 20 73 22 20 20 65 6e 63 68 61 6e 74 2d 66 72
-  6f 6d 2d 64 65 73 63 72 69 70 74 69 6f 6e 22 20
-  70 61 63 6b 2d 72 61 77 2d 73 74 72 69 6e 67 0a
-
-  ~ "  ~ (hex-transformed source pointer, output"
-  ~ " point)"
-  20 20 7e 20 28 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
+  ~ "  ~   It might seem as if that's an unnecessary"
+  ~ " level of indirection, but for"
+  20 20 7e 20 20 20 49 74 20 6d 69 67 68 74 20 73
+  65 65 6d 20 61 73 20 69 66 20 74 68 61 74 27 73
+  20 61 6e 20 75 6e 6e 65 63 65 73 73 61 72 79 20
+  6c 65 76 65 6c 20 6f 66 20 69 6e 64 69 72 65 63
+  74 69 6f 6e 2c 20 62 75 74 20 66 6f 72 0a
+
+  ~ "  ~ the two compile hooks we specifically need to"
+  ~ " make sure the enchantment"
+  20 20 7e 20 74 68 65 20 74 77 6f 20 63 6f 6d 70
+  69 6c 65 20 68 6f 6f 6b 73 20 77 65 20 73 70 65
+  63 69 66 69 63 61 6c 6c 79 20 6e 65 65 64 20 74
+  6f 20 6d 61 6b 65 20 73 75 72 65 20 74 68 65 20
+  65 6e 63 68 61 6e 74 6d 65 6e 74 0a
+
+  ~ "  ~ uses the copies of them that are under the"
+  ~ " hex transform. So, one way or"
+  20 20 7e 20 75 73 65 73 20 74 68 65 20 63 6f 70
+  69 65 73 20 6f 66 20 74 68 65 6d 20 74 68 61 74
+  20 61 72 65 20 75 6e 64 65 72 20 74 68 65 20 68
+  65 78 20 74 72 61 6e 73 66 6f 72 6d 2e 20 53 6f
+  2c 20 6f 6e 65 20 77 61 79 20 6f 72 0a
+
+  ~ "  ~ another it's always relying on the code from"
+  ~ " the top-level source file."
+  20 20 7e 20 61 6e 6f 74 68 65 72 20 69 74 27 73
+  20 61 6c 77 61 79 73 20 72 65 6c 79 69 6e 67 20
+  6f 6e 20 74 68 65 20 63 6f 64 65 20 66 72 6f 6d
+  20 74 68 65 20 74 6f 70 2d 6c 65 76 65 6c 20 73
+  6f 75 72 63 65 20 66 69 6c 65 2e 0a
+
+  ~ "  s"  enchant" pack-raw-string"
+  20 20 73 22 20 20 65 6e 63 68 61 6e 74 22 20 70
+  61 63 6b 2d 72 61 77 2d 73 74 72 69 6e 67 0a
+
+  ~ "  ~ (definition struction 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 69 6f 6e 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
 
   ~ "  0 pack8 8 packalign here !"
@@ -115429,11 +115483,24 @@
   ~ ""
   0a
 
+  ~ "  ~ That's everything we need from the"
+  ~ " definition."
+  20 20 7e 20 54 68 61 74 27 73 20 65 76 65 72 79
+  74 68 69 6e 67 20 77 65 20 6e 65 65 64 20 66 72
+  6f 6d 20 74 68 65 20 64 65 66 69 6e 69 74 69 6f
+  6e 2e 0a
+
+  ~ "  swap drop"
+  20 20 73 77 61 70 20 64 72 6f 70 0a
+
   ~ "  ~ (hex-transformed source pointer)"
   20 20 7e 20 28 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 29 0a
 
+  ~ ""
+  0a
+
   ~ "  1024 1024 4 * * allocate"
   20 20 31 30 32 34 20 31 30 32 34 20 34 20 2a 20
   2a 20 61 6c 6c 6f 63 61 74 65 0a
@@ -115464,6 +115531,68 @@
   ~ ""
   0a
 
+  ~ ""
+  0a
+
+  ~ "~   Look up the word "latest-executable-data""
+  ~ " dynamically, thus taking the"
+  7e 20 20 20 4c 6f 6f 6b 20 75 70 20 74 68 65 20
+  77 6f 72 64 20 22 6c 61 74 65 73 74 2d 65 78 65
+  63 75 74 61 62 6c 65 2d 64 61 74 61 22 20 64 79
+  6e 61 6d 69 63 61 6c 6c 79 2c 20 74 68 75 73 20
+  74 61 6b 69 6e 67 20 74 68 65 0a
+
+  ~ "~ most recent copy of it at runtime, invoke it,"
+  ~ " and use the resulting value"
+  7e 20 6d 6f 73 74 20 72 65 63 65 6e 74 20 63 6f
+  70 79 20 6f 66 20 69 74 20 61 74 20 72 75 6e 74
+  69 6d 65 2c 20 69 6e 76 6f 6b 65 20 69 74 2c 20
+  61 6e 64 20 75 73 65 20 74 68 65 20 72 65 73 75
+  6c 74 69 6e 67 20 76 61 6c 75 65 0a
+
+  ~ "~ as the compilation definition for"
+  ~ " enchant-from-definition."
+  7e 20 61 73 20 74 68 65 20 63 6f 6d 70 69 6c 61
+  74 69 6f 6e 20 64 65 66 69 6e 69 74 69 6f 6e 20
+  66 6f 72 20 65 6e 63 68 61 6e 74 2d 66 72 6f 6d
+  2d 64 65 66 69 6e 69 74 69 6f 6e 2e 0a
+
+  ~ "~"
+  7e 0a
+
+  ~ "~   The typical way to use this word is"
+  ~ " immediately after including the"
+  7e 20 20 20 54 68 65 20 74 79 70 69 63 61 6c 20
+  77 61 79 20 74 6f 20 75 73 65 20 74 68 69 73 20
+  77 6f 72 64 20 69 73 20 69 6d 6d 65 64 69 61 74
+  65 6c 79 20 61 66 74 65 72 20 69 6e 63 6c 75 64
+  69 6e 67 20 74 68 65 0a
+
+  ~ "~ top-level source file of the executable you"
+  ~ " want to inscribe."
+  7e 20 74 6f 70 2d 6c 65 76 65 6c 20 73 6f 75 72
+  63 65 20 66 69 6c 65 20 6f 66 20 74 68 65 20 65
+  78 65 63 75 74 61 62 6c 65 20 79 6f 75 20 77 61
+  6e 74 20 74 6f 20 69 6e 73 63 72 69 62 65 2e 0a
+
+  ~ ": inscribe"
+  3a 20 69 6e 73 63 72 69 62 65 0a
+
+  ~ "  s" latest-executable-data" find"
+  ~ " entry-to-execution-token execute"
+  20 20 73 22 20 6c 61 74 65 73 74 2d 65 78 65 63
+  75 74 61 62 6c 65 2d 64 61 74 61 22 20 66 69 6e
+  64 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 0a
+
+  ~ "  inscribe-from-definition ;"
+  20 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 20 3b 0a
+
+  ~ ""
+  0a
+
   ~ "~   This file should be included in executables"
   ~ " that use boot-source, as the"
   7e 20 20 20 54 68 69 73 20 66 69 6c 65 20 73 68
@@ -115511,7 +115640,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 0x00000000000aeb98 is here.
+  00                                ~                     (alignment padding)
+~ label total-size at offset 0x00000000000aeed0 is here.
 
 ~ This is the end of the hex dump. Thanks for reading!