Также вам скорее всего нужен (eval .. t)
а не просто eval. На самом деле t или nil зависит от того, каково значение lexical-binding.
Елисповский дебаггер не очень, так что, к сожалению, могу только посоветовать въехать в slime (м.б. еще в стикеры sly) и посмотреть, как все это сделано там, и имитировать. Но это займет много времени. Мой поинт в том, что вы переизобретаете то, что изобретено, и над чем уже много думали.
Помимо нежелательного вытаскивания переменных есть еще много проблем. Отображать значения прямо в буфере, где написан код, плохая идея. Что если несколько биндов на одной строке, или если они длинные? Значения вообще говоря не будут правильно вычисляться если они не в топ-левел форме. Есть непредсказуемое (за счет макросов) число способов вводить локальные переменные — с таким подходом придется писать отдельный обработчик для них всех т.е. реимплементировать eval. Поэтому люди просто вычисляют как есть и смотрят через дебаггер. Это надежно и дает кучу других возможностей. Другой вариант — подсунуть лямбду в форму, которая будет сообщать, что она видит, но все равно сами названия переменных придется откуда-то брать, а это в общем случае невозможно автоматизировать; это такой сомнительный гибрид между сишным стилем и лисповским.