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.

References: [1] [2]

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.

References: [1] [2]