Local strategy definitions can be lifted to the top-level if they do not contain free variables. For example,
foo(s) =
Bar(s, id)
; let f = !"foobar"
in foobar(f)
end
can be transformed to
f = !"foobar"
foo(s) =
Bar(s, id)
; foobar(f)
This transformation reduces the number of nested functions in the generated C code.
The optimization is part of the [[Stratego optimizer]] included in StrategoRelease093.
-----+++ Extension
The transformation can be extended by applying 'lambda lifting', i.e., also lift
definitions with free variables. For example,
foo(s) =
Bar(s, ?x)
; let f = ?"foobar"; !x
in foobar(f)
end
can be tranformed to
f(|x) = ?"foobar"; !x
foo(s) =
Bar(s, ?x)
; foobar(f(|x))
in which =x= is passed 'by value' to =f=, which has been extended with an extra
argument.
This abstraction does not work for 'by reference' variables as in the following
example:
foo(s) =
?Bar(x, y)
; let f = ?FooBar(x, z)
in y
end
; z
-- Main.EelcoVisser - 18 Aug 2003