Кажется будто в программировании существуют два отдельных языка, которые по-привычке смешивают в один язык.

1) Вычисляющий язык. Его код живёт внутри короба с определёнными снаружи входами и выходами. Внутри короба не существует ввода/вывода и времени. Программа может вычисляться лениво, а может и энергично. Программа может вычислять инструкции строго последовательно, а может напоминать граф-клубок узлов-инструкций, где путь вычисления совсем необязательно задаётся явно. Есть лишь вход и ожидаемый выход для конкретной коробки. Чем-то напоминает предикаты в Prolog и функции в Haskell.

2) Управляющий язык. Его код живёт внутри кольца-цикла, где инструкции исполняются последовательно и вычисляются энергично. Внутри кольца время существует и движется только в одну сторону. Код на этом языке занимается вводом-выводом, перемалывает принятые данные с помощью коробок описаных первым языком, сохраняет состояние, отправляет данные вовне. На этом же языке описываются компоненты системы и как они друг с другом связаны. Чем-то напоминает Erlang с его receive-after-end и send. Чем-то напоминает supervisor конфиг, а также конфиг сервиса в kubernetes.

Если эти два языка разделить и использовать вместе, может получиться что-то интересное. Два языка решают разные задачи, и мозг решает разные проблемы когда пишет и читает код на этих двух языках. Это породит совершенно разные абстракции. Возможно получится что-то более удобное, более эффективное с точки зрения человеческого интерфейса.