No to ja się teraz wtrącę i po raz kolejny powtórzę o co chodzi w programowaniu funkcyjnym :)
Proszę bardzo; nie masz racji. :) A poważnie -- co uznasz za nieraczkujące programowanie funkcyjne?
Programowanie funkcyjne opiera się na niemutowalnych danych. Ale nie takich co rzucają exception przy próbie dodawania elementu, tylko zwracają nową kolekcję. Przykład jest np tutaj (Mapa z vavr.io): http://static.javadoc.io/io.vavr/vavr/0.9.2/io/vavr/collection/Map.html - metody albo zwracają dane z mapy albo zwracają nową mapę.
Funkcje wyższych rzędów i domknięcia są obecne w językach funkcyjnych, ale te funkcjonalności nie są sednem programowania funkcyjnego. Za wikipedią ( https://en.wikipedia.org/wiki/Functional_programming ):
In computer science, functional programming is a programming paradigm—a style of building the structure and elements of computer programs—that treats computation as the evaluation of mathematical functions and avoids changing-state and mutable data. It is a declarative programming paradigm, which means programming is done with expressions[1] or declarations[2] instead of statements. In functional code, the output value of a function depends only on the arguments that are passed to the function, so calling a function f twice with the same value for an argument x produces the same result f(x) each time; this is in contrast to procedures depending on a local or global state, which may produce different results at different times when called with the same arguments but a different program state. Eliminating side effects, i.e., changes in state that do not depend on the function inputs, can make it much easier to understand and predict the behavior of a program, which is one of the key motivations for the development of functional programming.
Jeżeli macie na myśli tylko funkcje wyższych rzędów albo domknięcia to napiszcie o tym wprost, zamiast wprowadzać własne kulawe definicje programowania funkcyjnego za każdym razem.
Dodam jeszcze, że funkcje wyższych rzędów to można mieć nawet i w C, bo co za problem przyjąć wskaźnik do funkcji i zwrócić wskaźnik do innej? Nie ma problemu. Z drugiej strony nie ma to wielkiego sensu jeśli nie ma domknięć. A w takiej Javie domknięcia istnieją od chyba Javy 1.1, czyli momentu w którym wprowadzono klasy anonimowe. W Javie 8 wprowadzono cukier składniowy dla klas anonimowych implementujących jedną metodę abstrakcyjną (SAM - single abstract method) - nazywa się go lambdami.
JavaScript miał funkcje wyższych rzędów i domknięcia od samego początku, ale jakoś nikt nie podniecał się że jest funkcyjny. Dopiero jak zaczęły wchodzić lambdy do Javy to nagle ludzie dostali owczego pędu, by nazywać przekazywanie funkcji programowaniem funkcyjnym. A JavaScript nadal potrzebuje dodatkowych bibliotek by móc programować funkcyjnie, jak np: https://facebook.github.io/immutable-js/
vpiotr