> -- Comdiv писал(а):
> Верно и обратное - любую императивную программу можно трактовать как чисто функциональную. К примеру, подпрограммы Форта, которые могут менять состояние всего стека можно трактовать как чистые функции, которые принимают на вход один параметр-стек и возвращают новое значение - изменённый стек, которое присваивается новой переменной, затеняющей старую. Но дело-то не в трактовках.
Провёл небольшое "расследование" по поводу. Дело, фактически, в трактовках. Кратко,конкатенативныеязыки отличаются отаппликативныхотсутствием операции аппликации ("применение" одного объекта к другому) и связанных абстракций (лямбда-абстракций и т.д.). В конкатенативном языке всё есть функция, принимающая единственный параметр-стек (состоящий из множества компонент) и возвращающая новый стек (с "потреблёнными" и "произведенными" компонентами). И по сути язык определяет композицию функций через конкатенацию (в аппликативном языке композиция функций -- через комбинаторы).
Императивные языки трактуются (в контексте, рядом с конкатенативными) как, упрощённо, произвольная последовательность действий по изменению (присваивание) переменных/состояний.

В вики по ссылкам выше нюансы приведены размыто (в английской -- аналогично). Однако, утверждается, что "каноническим" (и первым) конкатенативным языком считаетсяJoy(повлиял и на Factor). Его автор определил некую теорию по предметке, вот в его материалах более-менее разжёваны теоретические заморочки:
http://www.kevinalbrecht.com/code/joy-mirror/forth-joy.html
http://www.kevinalbrecht.com/code/joy-mirror/faq.html

Встречается и некая производная теория конкатенативных комбинаторов:
http://tunes.org/~iepos/joy.html

Нашлась неплохая статейка по тематике, и выступление на конференции того же автора:
http://evincarofautumn.blogspot.com/2012/02/why-concatenative-programming-matters.html
https://youtu.be/_IgqJr8jG8M

Автор по последним ссылкам выше есть разработчик конкатенативного языкаKitten-- концептуально язык любопытный. Если Factor есть "постфиксный Lisp", то Kitten скорее "постфиксный ML", со статической типизацией, с возможностью использовать переменные, с инфиксными операторами (алгебраические) и "нормальными" условными конструкциями:
http://kittenlang.org/intro/
## Код:
```
define reverse<T>
(List<T> -> List<T>):
  -> xs;
  match (xs head_tail)
  case some:
    unpair -> h, t;
    t reverse h append
  case none:
    []
```
