FWIW, it’s pretty easy to pull out the first conditional (cond, case, or if) when you have code in fully expanded form (which turns them all into ifs). However, that just puts you in a position of checking whether a predicate is #t or #f, which isn’t much easier than discovering whether a program returns 'C or 'D. Ultimately, your MimicBot idea is better :-)
Since I don’t think you’re going down the predicate route, I’ll tell you the sort of strategy I was going to use against it.
The predicate (eq? 1 1) evaluates to true, except when eq? is shadowed. Just curious—would it have worked?
Nice. But no. My first attempt was a static analyzer, and the first thing it did was a syntax expansion, putting all code into fully expanded form) and attaching lexical information to each identifier that let me see what was from the base package and what was redefined.
FWIW, it’s pretty easy to pull out the first conditional (cond, case, or if) when you have code in fully expanded form (which turns them all into ifs). However, that just puts you in a position of checking whether a predicate is
#t
or#f
, which isn’t much easier than discovering whether a program returns'C
or'D
. Ultimately, your MimicBot idea is better :-)