Не используйте EVAL для этого.
Определения P, Q0, Q1, Q2 выглядят хорошо.
Если мы можем определить DFA напрямую, вы можете просто удалить DFA-trans.
Предполагая, что Q0 является начальным состоянием, я думаю, вы можете просто сделать это
(define DFA (lambda () (Q0 x)))
И рассмотрите возможность использования COND вместо вложенного IF.