diff options
| author | Irene Knapp <ireneista@irenes.space> | 2026-05-21 22:39:21 -0700 |
|---|---|---|
| committer | Irene Knapp <ireneista@irenes.space> | 2026-05-21 22:39:21 -0700 |
| commit | ff9b791acf12688caec27e8ca883f3eefac8891d (patch) | |
| tree | 7e26d0fb0e3194f59d116618b30838194c0ea387 /dynamic.e | |
| parent | 5183b72b296b82a6a39f8412a3de2ac77be92c73 (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.e | 35 |
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 , , ; + |