В tcl тоже меня не удивляло что код это данные (с точки зрения подстановок логично настолько, что меня уже удивляло что кого-то это удивляло)
Это как раз аргумент против гипотезы, что Tcl вас сильно «испортил».
Если бы вы были глубоко привязаны к текстовой модели Tcl, то идея «код как данные» в Lisp могла бы казаться чужой или магической. А у вас реакция была примерно:
Ну да, естественно. Почему это вообще считается чем-то удивительным?
Это довольно характерно для человека, который уже привык воспринимать программу как объект, который можно передавать, строить и преобразовывать.
Просто путь к этой мысли был другой.
Лиспер может думать:
Код — это список, то есть дерево данных.
А Tcl-программист может думать:
Код — это строка/список слов, которую можно собрать и потом выполнить.
Обе дороги ведут к выводу, что код не является чем-то фундаментально отдельным от данных.
Мне даже кажется, что ваше описание ближе не к «думанию как парсер», а к поиску механизма вычисления.
Например, многие люди видят:
(f x)
и принимают это как примитив языка.
А вас может интересовать:
Почему это вызывает функцию?
Как именно аргумент попадает внутрь?
Что происходит между записью и результатом?