diff options
Diffstat (limited to 'transform.e')
| -rw-r--r-- | transform.e | 138 |
1 files changed, 138 insertions, 0 deletions
diff --git a/transform.e b/transform.e index a137c0c..d4c1c43 100644 --- a/transform.e +++ b/transform.e @@ -702,6 +702,7 @@ allocate-transform-state s" transform-state" variable dup s" L!'" stringcmp 0 = { drop -1 exit } if dup s" ," stringcmp 0 = { drop -1 exit } if + dup s" foo" stringcmp 0 = { drop 0 exit } if ~ DO NOT SUBMIT ~ If we get here, that's a problem. Emit an error message to make sure ~ it's easy to diagnose. We also return a comically large negative value, ~ to make sure things fail as quickly as possible afterwards. @@ -1896,6 +1897,131 @@ allocate-transform-state s" transform-state" variable ; make-immediate +~ Not to be outdone by the label transform, the log-load transform also +~ offers alternates of all the high-level flow-control words: if, unless, +~ if-else, forever, and while. Unlike the label transform, we also need to +~ implement alternates of { and }, because their values need to be on the +~ stack at log-load "immediate" time, not at transform time. +~ +~ Anyway, most of the implementation is deferred to pre-packaged words in +~ log-load.e. +: log-load-left-curly-brace-alternate + log-load-roll-log-address + + swap-transform-variables + L@' log-load-left-curly-brace + swap-transform-variables + + offset-to-target-address-space , ~ log-load-left-curly-brace + + ~ It pushes a start pointer onto the stack. + 1 transform-apply-stack-delta + + log-load-unroll-log-address + ; make-immediate + + +: log-load-right-curly-brace-alternate + log-load-roll-log-address + + swap-transform-variables + L@' log-load-right-curly-brace + swap-transform-variables + + offset-to-target-address-space , ~ log-load-right-curly-brace + + ~ It pushes a length value onto the stack. + 1 transform-apply-stack-delta + + log-load-unroll-log-address + ; make-immediate + + +~ (start pointer, length --) +: log-load-if-alternate + log-load-roll-log-address + + swap-transform-variables + L@' log-load-if + swap-transform-variables + + offset-to-target-address-space , ~ log-load-if + + ~ It pops the start and length. + -2 transform-apply-stack-delta + + log-load-unroll-log-address + ; make-immediate + + +~ (start pointer, length) +: label-unless-alternate + log-load-roll-log-address + + swap-transform-variables + L@' log-load-unless + swap-transform-variables + + offset-to-target-address-space , ~ log-load-unless + + ~ It pops the start and length. + -2 transform-apply-stack-delta + + log-load-unroll-log-address + ; make-immediate + + +~ (true start, true length, false start, false length) +: log-load-if-else-alternate + log-load-roll-log-address + + swap-transform-variables + L@' log-load-if-else + swap-transform-variables + + offset-to-target-address-space , ~ log-load-if-else + + ~ It pops two pairs of start and length. + -4 transform-apply-stack-delta + + log-load-unroll-log-address + ; make-immediate + + +~ (start, length --) +: log-load-forever-alternate + log-load-roll-log-address + + swap-transform-variables + L@' log-load-forever + swap-transform-variables + + offset-to-target-address-space , ~ log-load-forever + + ~ It pops the start and length. + -2 transform-apply-stack-delta + + log-load-unroll-log-address + ; make-immediate + + +~ (test start, test length, body start, body length --) +: log-load-while-alternate + log-load-roll-log-address + + swap-transform-variables + L@' log-load-while + swap-transform-variables + + offset-to-target-address-space , ~ log-load-while + + ~ It pops two pairs of start and length. + -4 transform-apply-stack-delta + + log-load-unroll-log-address + ; make-immediate + + ~ This implements the log-load transform for a single word. It is directly ~ analogous to "interpret", and reading interpret.e may help in understanding ~ it, though it's meant to still make sense on its own. @@ -1945,6 +2071,18 @@ allocate-transform-state s" transform-state" variable swap drop ' log-load-dot-string-alternate swap } if dup s" L@'" stringcmp 0 = { swap drop ' log-load-L@'-alternate swap } if dup s" L!'" stringcmp 0 = { swap drop ' log-load-L!'-alternate swap } if + dup s" {" stringcmp 0 = { + swap drop ' log-load-left-curly-brace-alternate swap } if + dup s" }" stringcmp 0 = { + swap drop ' log-load-right-curly-brace-alternate swap } if + dup s" if" stringcmp 0 = { swap drop ' log-load-if-alternate swap } if + dup s" unless" stringcmp 0 = { + swap drop ' log-load-unless-alternate swap } if + dup s" if-else" stringcmp 0 = { + swap drop ' log-load-if-else-alternate swap } if + dup s" forever" stringcmp 0 = { + swap drop ' log-load-forever-alternate swap } if + dup s" while" stringcmp 0 = { swap drop ' log-load-while-alternate swap } if ~ (name as stack string, 0 or alternate entry pointer, name pointer) ~ If we have an alternate, we want to run that now, regardless of what |