Я по прежнему считаю что подход tcl мог сломать моё понимание программирования или это от плохого опыта. Объясняю:
Когда вы учите обычные языки программирования вы не начинаете с изучения парсера и фаз подстановки. Это не первый и не второй / третий урок. Tcl другой, он отличается от многих языков отсутствием абстрактного синтаксического дерева. Всё в нём конструкция "команда аргумент", подстановки и eval.
Такие вещи как if, else это на самом деле не часть языка, а просто команды, как и все остальные. Команда If - она принимает на вход код который нужно выполнить (или не выполнить) и выполняет его. Весь этот код - просто аргумент. И делает это только непосредственно тогда, когда ей передаётся управление. Даже попытка посчитать что-то приведёт к обращению к функции. Нельзя написать print (2 + 2), нужно например (puts) print [+ 2 2]. Сначала выполняется + 2 2 и программа становится print 4, потом выполняется print 4. В скобках особенный режим работы, чтобы выполнить что-то и подставить результат.
Оно из-за этого показалось мне каким-то ...понятным, что-ли. Вело себя как я представлял Но...
Поскольку скобки и парсер - основный примитив, то ему и учат с самого начала. И постоянно представляешь "уровни вложенности, состояние парсера сейчас, подстановка, это выполнится так". Почти ассоциируешь себя с парсером, его режимами.
Похоже это отличается от нормального мышления "вневременным деревом". Большинство языков строят AST и не дадут соединять свои слова как попало. Из-за этого например людям кажется странным что код может быть данными, а данные кодом (как в tcl и lisp), но с точки зрения парсера и подстановок это просто логично и так оно работает.
Процессоры обычно тоже не строят синтаксическое дерево машинных комманд или как минимум на поверхности и у них код это данные часто.
Результат - постоянное сейчас, отслеживать разную фигню и путаться в ней.