rascal
rascal copied to clipboard
need `memo` strategy modifier for `visit` to avoid exponential running times.
Is your feature request related to a problem? Please describe.
If I write a recursive function over Tree, with case distinction over appl, amb, char and cycle then I must
use @memo to avoid exponential behavior in the presence of nested ambiguity. I.e. for syntax E = E + E, an input like 1 + 1 + 1 + 1 + 1 uses time with a factor of $2^3$ without @memo, and in general it is in $O(2^{n - 1})$ with $n$ the number of operators. With @memo we can remain in $O(n^3)$; a dramatical improvement.
However, using a visit saves more than half of the code for these kinds of functions. The recursion is very useful and very repetitive, exactly what visit is for. Since visit does not have an @memo modifier, it will behave exponentially.
Describe the solution you'd like
Extending the Strategy modifier for visit with an option to memo every currently existing strategy. For example:
memo bottom-up visit(x) {
...
}
Describe alternatives you've considered
Could also use tags instead:
@memo bottom-up visit(x) {
...
}
But that would be the first expression/statement kind that may have tags and I don't see a general applicability there yet,
Additional context
After this, it becomes weird that functions are tagged with @memo while visit is modified with memo. Since memo is a builtin function modifier we may choose to upgrade it to a modifier from a tag, just like java and public.
@memo has configuration bells and whistles for cache eviction policies; if we consider adding memo to visit we have to consider mapping these policies as well. Perhaps it is unnecessary, but it's best to remain consistent and predictable.