Ваша проблема не имеет никакого отношения к интернированию.
Первая проблема действительно связана с тем, что читатель всегда будет вводить символы в верхнем регистре, поэтому вам нужно вызвать (intern "FOO"), чтобы получить тот же результат, что и 'foo.
Проблема с EVAL вызвана тем, что LET вводит лексическое связывание, которое не видно внутри EVAL. Если вы действительно хотите, чтобы это работало, вам нужно объявить abc особенным, например:
(let ((abc 2))
(declare (special abc))
(eval '(1+ abc)))
Специальное объявление приведет к тому, что переменная будет иметь динамическое связывание вместо лексического связывания (последнее означает, что связывание ограничено локальным лексическим контекстом, т. Е. В форме LET. Со специальным объявлением переменная доступна для чего угодно что вызвано из этой формы).
Обратите внимание, что вы должны быть очень осторожны в использовании как специальных объявлений, так и eval, и вам, вероятно, следует сначала переосмыслить использование EVAL. Это очень редко, что вам действительно нужно использовать его. В большинстве случаев вы на самом деле ищете использование лямбда-функций.