Organizing computation with functions
Functional programming decomposes a problem into transformations from inputs to outputs. Functions can be stored, passed to other functions, and returned as results. Higher-order operations let one traversal apply different transformation rules, separating the structure of a calculation from the particular action performed on each element.
Making state changes explicit
A pure function depends only on its inputs and makes no external state changes. Real programs still need files, screens, and user interaction. A practical design can keep most calculations pure while isolating these effects. Functional style therefore need not imply that every part of an application is effect-free.
References: [1]
Working with immutable data
Immutable data cannot be modified in place after creation; an update produces a new logical value. Clojure combines immutable collections with first-class functions without forcing complete purity. This arrangement makes it clearer which version of a value a computation uses and reduces accidental changes to data another calculation is reading.
References: [2]
Composition and execution costs
Mapping, filtering, and folding express transformation, selection, and accumulation and can form a processing pipeline. Their allocation and evaluation costs depend on the language and implementation. Functional programs still require performance analysis; the defining choice is to express computation through composable functions rather than primarily through repeated shared-state updates.