diff options
Diffstat (limited to 'source/00_content/commits/slang')
-rw-r--r-- | source/00_content/commits/slang/2017_04_13_21_51_d2126fe52fd3c002631e66fa7d6e2d5cd8862bea.md | 21 |
1 files changed, 21 insertions, 0 deletions
diff --git a/source/00_content/commits/slang/2017_04_13_21_51_d2126fe52fd3c002631e66fa7d6e2d5cd8862bea.md b/source/00_content/commits/slang/2017_04_13_21_51_d2126fe52fd3c002631e66fa7d6e2d5cd8862bea.md new file mode 100644 index 0000000..ad39eee --- /dev/null +++ b/source/00_content/commits/slang/2017_04_13_21_51_d2126fe52fd3c002631e66fa7d6e2d5cd8862bea.md @@ -0,0 +1,21 @@ +# Implement deferred word, conditional resolution + +Due to the non-trivial way tokens were previously processed the compiler could not safely perform tail-call elimination. Thus the _slang_ evaluation depth was restricted by the maximum call stack size. + +This issue is mitigated by introducing deferred word resolution - i.e. pushing expanded tokens onto a buffer stack and processing them in an explicit loop. + +This change ties into the implementation of the language's conditional primitive. The previous implementation did implicitly not support direct nesting of conditional expressions such as: + + truthA if + mainBranch + truthB if + secondaryMainBranch + then else + then + alternativeBranch + else + +This issue is now made explicit by disallowing direct nesting of conditionals as depicted above. Appropriate exceptions are generated when required and the conditional primitive is reimplemented in a more robust fashion under the assumption that this rule holds. Note that nesting is still fully supported iff. the nested conditional is contained in a deferredly evaluated word. As a positive side effect this will make it slightly harder to generate unreadable code by forcing developers to write simpler words. + +The main change of the conditional primitive lies in deferring branch token processing until the conditional expression is concluded by `else`. This is achieved by capturing non-dropped tokens in an internal buffer akin to how the word definition operator `ยง` is implemented. +The branch buffer is discharged after `else` is evaluated. Discharging is triggered via the newly introduced `result` method of the primitive evaluation module. This avenue for injecting tokens into the processing stream may be used by further primitives in the future. |