Browse Clojure Foundations for Java Developers

Glossary of Terms

Plain-English definitions of Clojure and functional programming terms used throughout the track.

If you are new to functional programming or Lisps, the vocabulary can be more intimidating than the ideas. Use this glossary as a quick reset when you hit a term like “persistent data structure,” “macroexpansion,” or “transducer” and want a short, practical definition.

When possible, read the glossary entry and then return to the lesson page that used the term. Most concepts land best when you see them in code and in a real workflow, not in isolation.

In this section

  • Key Concepts
    Core Clojure ideas used throughout the track: persistent collections, namespaces, vars, and REPL workflow.
    • Immutable Data Structures
      What immutable data structures are, why Clojure uses them everywhere, and how Java developers should reason about updates and structural sharing.
    • Namespaces
      What namespaces do in Clojure, how they differ from Java packages, and how to organize code without creating naming conflicts.
    • Vars and Bindings
      What vars and bindings are in Clojure, how `def`, `let`, and `binding` differ, and where Java developers usually get confused.
  • Functional Programming Terminology
    FP vocabulary in plain language: purity, immutability, composition, higher-order functions, and more.
    • Higher-Order Functions
      What higher-order functions are, why they matter in Clojure, and how Java developers should read patterns like `map`, `filter`, `reduce`, and returned functions.
    • Destructuring
      How Clojure destructuring binds names from vectors and maps, why it matters in everyday code, and where Java developers should be careful.
    • Currying and Partial Application
      How currying and partial application differ in Clojure, why `partial` is the common tool, and when Java developers should use each idea.
  • Concurrency Terms
    Concurrency vocabulary: coordination vs parallelism, contention, backpressure, idempotency, and related terms.
    • Concurrency vs. Parallelism
      What concurrency and parallelism actually mean in Clojure, why they are not the same thing, and how Java developers should choose the right tool.
    • Deadlocks and Race Conditions
      What deadlocks and race conditions are, how Clojure reduces some of the usual risks, and where Java developers still need to stay careful.
    • Software Transactional Memory (STM)
      What Clojure STM is, when to use refs and `dosync`, and how Java developers should think about coordinated state changes without explicit locks.
  • Miscellaneous Terms
    Extra terms that show up across the ecosystem: macros, transducers, protocols, and other recurring concepts.
    • Homoiconicity
      What homoiconicity means in Clojure, why code-as-data matters, and how Java developers should connect it to macros and metaprogramming.
    • Macros and Macro Expansion
      What Clojure macros actually do, how macro expansion works, and why Java developers should prefer functions unless code transformation is truly needed.
    • Lazy Evaluation
      What laziness means in Clojure sequences, where it helps, and what Java developers must watch for around chunking, side effects, and retained heads.
Revised on Friday, April 24, 2026