introduce EVAL

this mostly duplicates the code, because calling something that introspects
its caller is a bit icky