Age | Commit message (Collapse) | Author | |
---|---|---|---|
2017-04-15 | Perform custom word definition at the same level as conditional primitives | Adrian Kummerlaender | |
2017-04-15 | Add README.md, example | Adrian Kummerlaender | |
2017-04-14 | Convert structure to _dub_ build system | Adrian Kummerlaender | |
2017-04-14 | Simplify token handling in the context of word definitions | Adrian Kummerlaender | |
2017-04-14 | Clean up core processing loop | Adrian Kummerlaender | |
2017-04-13 | Implement deferred word, conditional resolution | Adrian Kummerlaender | |
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. | |||
2017-04-13 | Rename conditional primitive implementation to fit overall naming scheme | Adrian Kummerlaender | |
2017-04-12 | Introduce native boolean type | Adrian Kummerlaender | |
2017-04-12 | Expand conditional primitive to choose between `then` and `else` branch | Adrian Kummerlaender | |
i.e. `1 if true then false else` evaluates to `true`, `0 if true then false else` evaluates to `false`. | |||
2017-04-12 | Implement integer comparsion primitives | Adrian Kummerlaender | |
2017-04-12 | Modularize primitives implementation, add stack manipulators | Adrian Kummerlaender | |
2017-04-12 | Implementent conditional primitive | Adrian Kummerlaender | |
2017-04-12 | Modularize implementation | Adrian Kummerlaender | |
2017-04-12 | Catch undefined division, modulo operations | Adrian Kummerlaender | |
2017-04-12 | Implement basic empty stack handling, div, mod | Adrian Kummerlaender | |
2017-04-12 | Implement support for variables, mixed types in data stack | Adrian Kummerlaender | |
2017-04-11 | Play around with contractual programming | Adrian Kummerlaender | |
2017-04-11 | Simplify word definition, evaluation | Adrian Kummerlaender | |
2017-04-10 | Rewrite in D, support for word definitions | Adrian Kummerlaender | |
2017-03-31 | Implement primitives as lambda expressions in an unordered set | Adrian Kummerlaender | |
2017-03-30 | Implement swap, duplicate and delete words | Adrian Kummerlaender | |
2017-03-30 | Minimal stack calculator REPL implementation | Adrian Kummerlaender | |