summary refs log tree commit diff
path: root/dynamic.e
diff options
context:
space:
mode:
authorIrene Knapp <ireneista@irenes.space>2026-05-21 22:39:21 -0700
committerIrene Knapp <ireneista@irenes.space>2026-05-21 22:39:21 -0700
commitff9b791acf12688caec27e8ca883f3eefac8891d (patch)
tree7e26d0fb0e3194f59d116618b30838194c0ea387 /dynamic.e
parent5183b72b296b82a6a39f8412a3de2ac77be92c73 (diff)
whew, okay, lots of interpret stuff implemented now
not fully tried though

Force-Push: yes
Change-Id: I19b39f2b982fde66863c710b6d458c3bd12bdf4a
Diffstat (limited to 'dynamic.e')
-rw-r--r--dynamic.e35
1 files changed, 35 insertions, 0 deletions
diff --git a/dynamic.e b/dynamic.e
index 0adc5c6..2edcc13 100644
--- a/dynamic.e
+++ b/dynamic.e
@@ -399,3 +399,38 @@
 
   here ! ;
 
+
+~   Although we will eventually define the word "'" to give us the symbol of
+~ a word, it will rely on being able to compile a literal. Rather than do lots
+~ of string processing later, we choose to define this word now to avoid
+~ having to look up the word "lit" as part of that.
+~
+~   It may be slightly surprising that the construction "lit lit" works as
+~ expected, given that ie. "lit 5" will break, as will "lit [", so it's worth
+~ explaining why it does.
+~
+~   In most respects "lit" is just an ordinary word, which compilation turns
+~ into a pointer to its codeword. That's what happens to most words, if
+~ they're not a special syntax nor flagged as immediate. It just happens to be
+~ a word that it rarely makes sense to use directly, since its purpose is to
+~ be generated as part of the output when compiling number literals. The
+~ special behavior around number literals is that when "interpret" sees ie.
+~ "5", it first compiles "lit", then appends the numeric value 5 as the
+~ following item in the compiled word body.
+~
+~   The job of "lit" when it's later executed is to push the appropriate value
+~ onto the stack and ensure that it doesn't get executed as code. So, whatever
+~ you put immediately after it gets treated as a value, even if it's a
+~ pointer.
+~
+~   The reason that writing "lit 5" in Evocation syntax crashes is that it
+~ gets turned into "lit lit 5" when compiled, which treats the second "lit" as
+~ a value then tries to use "5" as a codeword pointer. So you can use "lit"
+~ to quote whatever you want, it's just if it's already a special syntax you
+~ might need to go behind "interpret"'s back to get it into the compiled
+~ output. In practice, this is likely the only place that needs to happen, but
+~ the mechanism is documented for the sake of whatever comes up in the future.
+~
+~ (value -- )
+: literal lit lit , , ;
+