Alternative method of lazy evaluation #2
Merged
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
I removed all the force and delays in clarsec/monad.
I added a new way to handle forward references, all the logic is isolated into a macro called m-lazy.
Examples of using m-lazy:
Ex1.
(def foo)
(def bar (m-lazy foo))
(def foo identifier)
(parse bar "tada")
Ex2.
(def recur1
(<|> (symb "foo")
(braces (m-lazy recur1))))
Ex3. function call with an argument
(defn recur2 [x](|> %28symb x%29
%28braces %28m-lazy %28recur2 x%29%29%29))
How does it work?
m-lazy converts symbol references to var references
E.g. in (m-lazy foo) symbol foo is converted to var namespace/foo
The var is dereferenced during parsing stage, as oppose to monad binding phase.
Hope you like it :)
Cheers, Jason