Fact-checked by Grok 2 weeks ago

Clojure

Clojure is a dynamic, language and a modern dialect of , designed by and first released in 2007. It is licensed under the 1.0 (EPL). It primarily targets the (JVM) for execution, compiling to JVM while offering seamless interoperability with libraries and frameworks to leverage existing ecosystems. Clojure's design prioritizes simplicity, robustness, and performance through a minimal syntax inherited from , enabling code-as-data principles and a powerful system for . It promotes immutability with persistent data structures—such as vectors, maps, and sets—as defaults, which facilitate safe sharing of data across threads and reduce bugs from mutable state. For concurrency in multicore environments, Clojure provides built-in primitives including (STM) for coordinated updates, asynchronous agents for independent state changes, and atoms for simple, atomic modifications. Beyond the core JVM implementation, Clojure supports dynamic development via a REPL (Read-Eval-Print Loop) environment, allowing interactive code evaluation and rapid iteration during program growth. Variants extend its applicability: ClojureCLR targets the .NET , while ClojureScript compiles to for browser and platforms, bringing Clojure's features like and macros to web and mobile development with optimizations from Google's Closure Compiler. These elements combine to make Clojure a practical tool for building scalable, maintainable software in domains requiring high concurrency and expressiveness.

Overview

Key Characteristics

Clojure is a dynamic, and a dialect of , developed by and first released in 2007. It primarily executes on the (JVM), compiling to JVM while sharing the platform's , garbage collection, and threading model for robust performance. Clojure provides seamless interoperability with , enabling direct invocation of Java methods, access to libraries, and integration with the extensive Java ecosystem without bridging overhead. At its core, Clojure emphasizes paradigms, where functions are first-class objects that can be passed as arguments, returned from other functions, and stored in data structures. It supports higher-order functions, such as and , which operate on collections to promote declarative and composable code. Immutable data structures, including persistent vectors, maps, and sets, form a foundational aspect of the language, ensuring that data transformations create new versions without modifying originals, which aids in reasoning about code and managing state. Drawing from Lisp traditions, Clojure includes powerful macros that allow programmatic extension of the language's syntax, enabling domain-specific languages and reducing boilerplate through compile-time code generation. Multimethods provide flexible polymorphism by dispatching on arbitrary criteria via a user-defined function, extending beyond single inheritance models. Protocols define named sets of methods with signatures, facilitating multiple dispatch and efficient implementation for custom types while integrating with Java interfaces. Clojure's development workflow is REPL-driven, utilizing a Read-Eval-Print Loop environment for interactive evaluation of code expressions in a live , which supports incremental development, immediate feedback, and exploration without full recompilation cycles. This approach, combined with on-the-fly , enables dynamic growth and modification of running programs.

Design Philosophy

Clojure's design philosophy, articulated by its creator , centers on addressing contemporary challenges, particularly the difficulties of concurrency and in multi-core environments. sought to create a language that promotes robust, maintainable code by prioritizing paradigms over traditional mutable state models, which often lead to race conditions and complexity in concurrent systems. This approach draws from the recognition that pervasive mutation hinders , leading to the adoption of immutability as a foundational principle to enable safe data sharing across threads without locks. At the core of Clojure's tenets is a strong preference for immutable data structures, such as persistent vectors, maps, and sets, which facilitate thread-safe operations through structural sharing rather than in-place modifications. Mutability is made explicit and controlled via specialized mechanisms like refs for coordinated, transactional updates using (STM); atoms for independent, changes; and agents for asynchronous, independent updates, all of which minimize side effects and ensure . This philosophy avoids the pitfalls of unchecked mutation, allowing developers to reason about programs more predictably by treating as a sequence of immutable values over time. Hickey further emphasizes the principle of "simple made easy," distinguishing between "easy" solutions that rely on familiarity and convenience—which may introduce hidden —and "simple" ones that are straightforward, composable, and free of entanglements. In practice, this means favoring functional over imperative side effects and modular designs that separate concerns like from value. Clojure integrates deeply with host platforms like the JVM, compiling to and providing seamless access to existing libraries via interop syntax, thereby leveraging mature ecosystems without duplicating low-level infrastructure. In rejecting object-oriented , which views as a source of fragility due to its logical implications and partial overrides that complicate reasoning, Clojure opts for through protocols and . Protocols define named sets of functions for polymorphism, allowing types to implement behaviors without hierarchical dependencies, while provide efficient, extensible data types that support this model. This shift promotes flexibility and , aligning with the language's goal of by avoiding the "mud" of inheritance-based designs.

History

Origins and Creation

Rich Hickey, a software developer with over two decades of experience in languages including C++, , and , created Clojure during a self-funded beginning in 2005. Prior to this, Hickey had explored Lisp integration with mainstream platforms through projects like dotLisp, an interpreted Lisp with interoperability for the .NET released in 2003, and jfli, a embedding the (JVM) in released in 2004; these efforts, along with two others, represented unsuccessful attempts to bridge Lisp's expressiveness with Java or .NET ecosystems. Hickey's motivations for Clojure stemmed from a desire for a Lisp dialect on the JVM that addressed Java's concurrency limitations in multithreaded environments, drawing influences from C#, , and to prioritize immutable data and avoid mutable state pitfalls. He developed the language privately from 2005 to 2007, focusing on persistent data structures and a concurrency model using to enable safe, coordinated changes without locks. Clojure's first public release occurred on October 16, 2007, initially announced to a small before being open-sourced. In 2012, departed from , the company he co-founded to support Clojure development, to pursue independent work as an advisor to the language's core team. By 2025, his involvement in the Clojure community remains limited but notable, including a to open Clojure/conj, the annual conference, scheduled for November 13 in .

Major Milestones

Clojure achieved a significant milestone with the release of version 1.0 on , 2009, which marked the language's first stable and after two years of open-source development, establishing a solid foundation for practical use on the (JVM). This release solidified Clojure's core syntax, concurrency primitives like atoms and agents, and immutable data structures, enabling broader adoption in production environments. In , the formation of the Clojure/core team formalized , transitioning from Rich Hickey's solo stewardship to a collaborative group of maintainers responsible for core library evolution and release decisions. That same year, the inaugural Clojure/conj conference took place in October in Raleigh-Durham, , fostering the burgeoning community through talks on language features and practical applications, and setting the stage for annual gatherings. The event highlighted Clojure's growing momentum, with subsequent editions expanding internationally. The ecosystem expanded notably in 2011 with the launch of ClojureScript on July 22, a targeting runtimes that brought Clojure's functional paradigm to , enabling seamless code sharing between server and client sides. This development, led by David Nolen, addressed the need for a dialect in browser environments and spurred innovations in reactive user interfaces. A pivotal advancement came in 2015 with Clojure 1.7, released on June 30, which introduced transducers as a composable for efficient , transformations like and filtering from specific collection types to reduce overhead in iterative operations. Transducers represented a refinement in performance-oriented design, influencing libraries for and parallel computation. By 2025, the community had matured further, exemplified by international events like reClojure on May 26 in , which featured sessions on integrating large language models (LLMs) with Clojure for enhanced developer workflows while preserving the language's library-centric ethos. The State of ClojureScript 2025 survey, launched in , captured evolving trends in frontend tooling and , reflecting sustained interest in cross-platform . Concurrently, prominent open-source projects such as Metabase, an analytics platform with over 44,000 stars, and Penpot, a rivaling with around 40,000 stars, underscored Clojure's role in scalable, collaborative software.

Language Design

Syntax and Semantics

Clojure's syntax is based on S-expressions, which are nested, parenthesized lists that form the core structure of the language. These expressions use prefix notation, where the or precedes its arguments, such as (+ 1 2) for , enabling uniform treatment of code elements. This structure supports arbitrary nesting, allowing complex expressions like (* (+ 1 2) 3) to evaluate step-by-step from the innermost form outward. A key feature of Clojure's syntax is its homoiconicity, meaning that code is represented as data structures within the language itself. S-expressions read into lists, symbols, and other literals, which can then be manipulated programmatically, facilitating techniques such as macros. For instance, the reader parses (def x 5) into a list containing the symbol def, the symbol x, and the number 5, treating the entire form as a manipulable . Clojure employs an eager model by default, where expressions are evaluated from left to right, and each form yields a single value upon completion. Self-evaluating literals like numbers, strings, keywords, and booleans return themselves without further , while symbols resolve to their bound values or vars, and lists invoke functions or special forms after evaluating their arguments. Special forms, such as if or let, alter this process with custom rules to or without full evaluation of all branches. For efficiency in handling potentially infinite or large collections, Clojure supports lazy sequences, which defer computation until elements are accessed, using constructs like lazy-seq to create virtual sequences that cache results on demand. The language provides rich literal syntax for immutable data structures, promoting paradigms. Vectors are denoted by square brackets, e.g., [1 2 3], offering ordered, indexed access; maps use curly braces for key-value pairs, e.g., {:key "value"}; sets employ hash notation for unique elements, e.g., #{1 2 3}; and , typically quoted to prevent immediate , use parentheses, e.g., '(1 2 3). Keywords, prefixed with a colon like :key or namespaced as :ns/key, serve as efficient, self-evaluating identifiers often used in maps for lookups. Modularity in Clojure is achieved through its system, which maps symbols to vars or classes and supports dynamic creation and modification at runtime. The [ns](/page/NS) macro declares a namespace at the top of a file, e.g., (ns myapp.core), automatically requiring core namespaces and importing Java classes. For dependencies, require loads another namespace without referring its vars, as in (require 'myapp.utils), while use loads and refers public vars for direct access, e.g., (use 'myapp.utils). This system ensures unambiguous symbol resolution across libraries. Error handling in Clojure relies on exceptions, seamlessly integrated with the Java Virtual Machine's exception mechanism. The try special form catches exceptions by class, binding them to a name for processing, as in (try (risky-operation) (catch java.lang.Exception e (str "Error: " (.getMessage e)))), with an optional finally clause for cleanup. Clojure enhances this with ex-info, which throws exceptions carrying a map of data via ex-data for retrieval, e.g., (throw (ex-info "Validation failed" {:type :invalid :field :name})), enabling structured error information without altering the underlying Java semantics.

Core Features

Clojure's core features emphasize powerful abstractions for metaprogramming and polymorphism, enabling expressive and extensible code. One of the language's foundational mechanisms is its hygienic macro system, which allows developers to extend the compiler programmatically and create domain-specific languages (DSLs). Macros are defined using the defmacro special form, which takes the macro name, parameters, and a body that generates code as data; during compilation, the macro expands into equivalent Clojure forms, preserving hygiene to prevent unintended variable capture through scoped bindings accessible via the &env parameter. For instance, the built-in when macro expands (when test & body) to (if test (do @body)), demonstrating how macros can simplify conditional expressions while avoiding the pitfalls of non-hygienic systems like Common Lisp. This capability facilitates the creation of DSLs, such as the threading macro ->, which transforms nested function calls like ((assoc (assoc {} :a 1) :b 2)) into a linear flow (-> {} (assoc :a 1) (assoc :b 2)) for improved readability. Beyond macros, Clojure provides advanced polymorphism through multimethods, which enable based on arbitrary hierarchies rather than solely on types. Multimethods are declared with defmulti, specifying a dispatch function that computes a value from arguments—such as a , keyword, or custom attribute—and methods are added via defmethod for specific dispatch values, falling back to a :default implementation if no match is found. This extends traditional type-based polymorphism by supporting criteria and user-defined hierarchies managed with functions like derive (e.g., (derive ::rectangle ::shape) establishes ) and queried via isa? or ancestors. An example is a speak multimethod dispatching on a :species keyword in a : (defmethod speak :dog [pet] "Woof!"), allowing flexible behavior decoupled from object-oriented hierarchies. Protocols offer another layer of abstraction, functioning as named sets of method signatures defined with defprotocol, similar to Java interfaces but with greater flexibility for runtime extension. Unlike static Java interfaces, which require compile-time decisions and can lead to the expression problem, Clojure protocols support dynamic polymorphism and can be implemented for existing types without modifying their definitions. Implementations occur directly in defrecord or deftype declarations, via anonymous reify objects, or externally using extend or extend-type for third-party classes; since Clojure 1.10, metadata-based extensions further simplify this with :extend-via-metadata true. For example, a Stringable protocol with a to-string method can be extended to Java's String class: (extend-type String Stringable (to-string [s] (.toUpperCase s))), yielding "HELLO" for ((to-string "hello")). Closely integrated with protocols are records, created via defrecord, which define efficient, immutable data types with named fields that behave like while supporting type-specific methods. These records generate a implementing protocols and standard Clojure interfaces such as IPersistentMap for keyword access (e.g., (:field record-instance)) and checks, making them extensible for modeling without the overhead of plain maps. Unlike deftype, which provides a minimal constructor-focused type with optional mutable fields, defrecord emphasizes map-like semantics and immutability, including a map->RecordName constructor for initialization from maps and reader literal support like #my.[Record](/page/Record){:a 1} since Clojure 1.3. A typical definition might be (defrecord [Person](/page/Person) [name age] Stringable (to-string [_] (str name " (" age ")")) ), allowing protocol methods directly in the record for concise, performant abstractions. Transducers, introduced in Clojure 1.7, represent a composable approach to data transformation protocols that operate on individual elements independently of input or output contexts, such as collections or channels. They are built by composing reducing functions with comp, like (comp (filter odd?) (map inc) (take 3)), and applied via transduce for folding (e.g., (transduce xf + (range 10)) computes the sum of the first three odd increments) or eduction for lazy iteration without intermediate allocations. This design avoids the creation of temporary sequences in chained operations—unlike (->> (range 10) (filter odd?) (map inc) (take 3) (reduce +))—enabling reuse across contexts and higher efficiency for large datasets or streaming data. The spec library, integrated into Clojure core since version 1.9, provides tools for specifying, validating, and generating data structures to enhance reliability and testing. Specifications are defined with s/def using predicates (e.g., (s/def ::positive-number pos?)), validated via s/valid? or s/conform for explanatory errors, and extended to functions with s/fdef for argument/return specs like :args (s/cat :low int? :high int?) :ret int?. It supports generative testing through integration with clojure.test.check, where s/gen produces sample data (e.g., generating random even integers for even?), and instrumentation tools like s/instrument for runtime checks. This system fosters precise documentation and robust code by treating specs as a shared "lingua franca" for data shapes, with features like multi-specs for composite structures such as orders or decks.

Concurrency Model

Clojure's concurrency model is built on the principle of immutability as the default for structures, which allows safe across threads without the risks associated with mutable . Core persistent structures, such as vectors and maps, employ structural to create new versions efficiently when updates are needed, reusing unchanged portions of the original structure to minimize memory overhead and enable O(log n) performance for operations like or . This approach facilitates value-based reasoning, where threads can read and transform independently, reducing contention and enabling parallelism without explicit in many cases. To manage state changes in concurrent environments, Clojure provides coordination that avoid traditional . Atoms offer synchronous, independent updates to a single location using compare-and-set semantics, ensuring atomicity for uncoordinated modifications like counters. Refs enable synchronous, coordinated changes across multiple identities through (STM), where transactions (dosync blocks) provide snapshot isolation and automatic retries on conflicts, leveraging for consistency without locks. Agents support asynchronous updates to individual locations by queuing actions and applying them sequentially on a , ideal for independent, non-conflicting changes such as or notifications. For explicit parallelism, Clojure integrates to execute computations asynchronously on threads from Java's framework, allowing results to be retrieved via blocking or delivery mechanisms. The core.async library extends this with channels inspired by (CSP), enabling non-blocking communication between go blocks that park and resume efficiently, supporting multiple producers and consumers with buffering options to handle varying workloads. These primitives promote composable asynchronous flows, such as multiplexing inputs with alts! or incorporating timeouts to prevent deadlocks. By prioritizing immutability and transactional coordination over locks, Clojure's model fosters thread-safe programs through value semantics rather than imperative , leading to lower overhead in concurrent operations. This design scales well to multi-core systems while maintaining predictability and ease of .

Extensible Data Notation

Specification

Extensible Data Notation (EDN) is a language-neutral serialization format derived as a of Clojure's reader syntax, designed for extensible and human-readable interchange of structured . It enables the representation of Clojure structures in a textual form that is both parsable and extensible without requiring full language evaluation, making it suitable for configuration files, , and transfer between systems. Unlike general-purpose formats, EDN prioritizes immutability and simplicity, encoding values in with no top-level enclosing element to support streaming. EDN supports a core set of literals that mirror Clojure's basic data types. These include nil for null values, booleans true and false, strings enclosed in double quotes (e.g., "hello world" with support for escapes like \n), characters prefixed by a backslash (e.g., \space or \u0041 for ), numbers in integer (e.g., 42, -0, or 42N for arbitrary precision), floating-point (e.g., 3.14 or 3.14M for exact decimals), and ratio forms (e.g., 22/7), keywords starting with a colon (e.g., :foo or :namespace/bar), and symbols as identifiers (e.g., my-function or ns/foo). Collections are represented as lists in parentheses (e.g., (1 2 3)), vectors in square brackets (e.g., [1 2 3]), maps as key-value pairs in curly braces (e.g., {:key "value"}), and sets of unique elements in hash-marked braces (e.g., #{1 2 3}). Elements are separated by whitespace or commas, ensuring readability while maintaining compactness for common structures. To enable extensibility, EDN incorporates tagged literals in the form #tag value, where the tag is a identifying a custom type or extension, allowing representation of domain-specific data without altering the core format. Built-in tags include #inst for instants formatted per RFC 3339 (e.g., #inst "2010-11-09T00:00:00.000Z"), which parses to a java.util.Date, and #uuid for universally unique identifiers (e.g., #uuid "550e8400-e29b-41d4-a716-446655440000"). Custom tags, such as #myapp/person, can be defined by applications via reader conditional mappings, but undefined tags default to a safe tagged-literal wrapper without execution. Parsing EDN adheres to strict rules that ensure safety: the reader processes text into immutable data structures without evaluating or executing any code, distinguishing it from full Clojure reader syntax that could interpret macros or functions. This design renders EDN suitable for untrusted input, as it avoids side effects or arbitrary , with readers required to enforce immutability for all values. Equality for built-in types is defined semantically, while tagged elements rely on their custom implementations. Compared to JSON, EDN offers greater expressiveness through support for namespaces in symbols and keywords, as well as tagged extensions for rich types like dates and UUIDs, but it is generally less compact due to verbose literal forms and lack of schema enforcement. The official specification is maintained at the EDN GitHub repository, with reader and writer functions provided in Clojure's core clojure.edn namespace for seamless integration.

Applications and Extensions

Extensible Data Notation (EDN) finds practical application in various aspects of Clojure development, particularly for handling structured data in a human-readable, format. In , EDN is commonly used in files like deps.edn to specify project dependencies, paths, and aliases for the Clojure CLI, enabling declarative setup without the need for external parsing tools. For API data transfer, EDN serves as a format for exchanging Clojure data structures between services, leveraging its subset of Clojure literals to ensure interoperability while avoiding full code execution risks. In database contexts, such as , EDN facilitates for and queries; for instance, transaction data like [{:person/name "Anna" :person/email "[email protected]"}] is directly submitted as EDN to create entities, and pull patterns in queries are expressed in EDN for retrieving structured results. EDN's extensibility is achieved through tagged literals, allowing domain-specific custom types by associating tags with reader functions. For example, a tag like #myapp/[User](/page/User) can map to a custom constructor for user objects, defined in a data_readers.clj file as {:myapp/[User](/page/User) myapp.core/user-constructor}. This mechanism supports seamless integration of application-specific data types without altering the core format. Additionally, reader conditionals, introduced in Clojure 1.7, enable multi-platform support in shared .cljc files; constructs like #?(:clj clojure-version :cljs cljs-version) conditionally include platform-specific literals during reading, facilitating code sharing across JVM, JavaScript, and other environments. Within the Clojure ecosystem, EDN integrates with libraries for enhanced data handling. Prismatic Schema uses EDN-compatible data structures to define and validate shapes, such as {:a {:b s/Str :c s/Int}}, allowing schemas to be serialized in EDN for configuration or API contracts while providing runtime checks via s/validate. For bridging to JSON-based systems, the Cheshire library parses JSON into Clojure data structures that align with EDN literals, as in (cheshire/parse-string "{\"foo\":\"bar\"}" true) yielding {:foo "bar"}, enabling efficient conversion for web APIs without custom middleware. A key advantage is EDN's direct integration with Clojure's reader via clojure.edn/read-string, which processes data without additional parsing overhead, promoting its use in REPL-driven workflows and internal data pipelines. Despite these strengths, EDN has limitations as a text-based format, making it unsuitable for binary data like images or large byte arrays, where encoding would inflate sizes inefficiently. In such cases, serves as a complementary alternative, extending EDN concepts with compression via shared dictionaries and native binary support (e.g., for bytes), reducing sizes for network transfer while maintaining type fidelity across languages.

Implementations

JVM Implementation

Clojure is designed as a hosted language on the (JVM), leveraging the platform's , garbage collection, and threading model while compiling all Clojure functions directly to JVM . This hosting approach enables seamless integration with the ecosystem, allowing Clojure code to execute within the same runtime environment as Java applications. The generates on-the-fly during development or via ahead-of-time (AOT) for production deployment, which can produce standalone JAR files without requiring exposure or accelerate startup times by pre-compiling namespaces. For scenarios requiring custom Java classes, such as implementing interfaces or extending base classes, the gen-class facilitates the generation of named classes during AOT . Java interoperability is a core strength of Clojure's JVM implementation, enabling direct invocation of Java methods and access to libraries without wrappers or adapters. Instance methods are called using the dot special form, such as (.method obj args), while static methods can be imported for use as functions via the import macro, allowing syntax like (ImportedStaticMethod args). To optimize performance by avoiding —which occurs when the JVM cannot resolve method signatures at —Clojure supports type hints, denoted by ^Type on arguments, return values, or vars, guiding the to emit direct linkages. These hints are particularly useful in performance-critical sections, where enabling *warn-on-reflection* during helps identify and eliminate reflective calls. Classpath management in Clojure is handled through the clojure.java.classpath namespace, which provides utilities for inspecting and dynamically loading resources from the JVM classpath. The classpath function returns a sequence of java.io.File objects representing JAR files and directories on the current classpath, facilitating runtime discovery of dependencies. Dynamic class loading follows standard JVM conventions, using Class/forName or clojure.java.io/resource to access classes and assets without restarting the application. Performance optimizations in the JVM implementation emphasize efficient use of JVM primitives and low-overhead operations. Clojure offers full support for JVM primitive types (e.g., ) through type hints and dedicated numeric functions, enabling high-performance numeric computations without overhead. The *unchecked-math* dynamic variable, when set to true, disables checks on primitive arithmetic operations, allowing faster execution akin to native primitives while risking silent wrapping on . Additionally, direct linking—achieved via type hints and avoiding —ensures the JVM's Just-In-Time () can inline and optimize method calls effectively. Clojure versions 1.12.x require 8 or later, with 1.12.0 introducing method values that allow qualified methods (e.g., String/startsWith) to be treated as first-class functions in higher-order contexts, reducing boilerplate and improving interop .

Alternative Platforms

Clojure has been adapted to several non-JVM platforms to extend its applicability beyond the , enabling deployment in web browsers, .NET environments, native executables, and other virtual machines. These implementations often prioritize specific use cases like scripting or while maintaining core Clojure idioms such as immutable data structures and . However, they typically support a subset of the full JVM feature set, with variations in performance, library compatibility, and interop capabilities. ClojureScript compiles Clojure source code to , targeting environments for both web browsers and runtimes. It leverages the Google Closure compiler's advanced optimization mode to produce efficient, minified output, allowing seamless integration with ecosystems and tools. This enables developers to build interactive web applications, such as single-page apps with frameworks like or Re-frame, while benefiting from Clojure's REPL-driven development workflow in browser consoles. ClojureCLR provides a native implementation of Clojure on the (CLR), the execution engine for the .NET Framework and later .NET versions. It supports interoperation with C# and other .NET languages through seamless access to CLR types and libraries, making it suitable for Windows-centric or enterprise .NET applications. Although less actively maintained than the JVM version, recent efforts have ported it to .NET 8, ensuring compatibility with modern .NET features like cross-platform support. Babashka offers a native, fast-starting Clojure interpreter designed for scripting and (CLI) tools, compiled via GraalVM's native-image technology. It uses the (SCI) to execute a significant portion of Clojure code without requiring a full JVM, achieving startup times under 10 milliseconds on typical hardware. This makes it ideal for ad-hoc scripts, automation tasks, and portable executables that replace scripting in environments like pipelines. Clojerl is an experimental port of Clojure to the Erlang (BEAM), integrating Clojure's syntax and semantics with BEAM's actor-based concurrency model for building distributed, fault-tolerant systems. It supports core Clojure features like persistent data structures and higher-order functions while allowing interop with Erlang/ modules for lightweight processes and hot code swapping. This implementation appeals to developers seeking Clojure's expressiveness in , applications, or leveraging OTP behaviors. As of 2025, experimental efforts are underway to target (WASM) as a compilation destination for Clojure, primarily through intermediate steps like bytecode-to-WASM translation via tools such as TeaVM or direct JavaScript-to-WASM conversion from ClojureScript. Libraries like wasm.cljc enable WASM module generation and integration within Clojure projects, but these ports remain in early stages with limited runtime support and no full-featured REPL. They hold promise for high-performance, sandboxed execution in browsers or but lack the maturity for production use. These alternative platforms involve trade-offs compared to the JVM implementation, including reduced access to certain Java libraries, partial support for dynamic features like , and platform-specific interop challenges that can affect code portability. For instance, EDN remains consistent across ports for data interchange, but full concurrency primitives may require adaptation to the host VM's model. Overall, they expand Clojure's reach while emphasizing targeted optimizations over comprehensive equivalence.

Tools and Ecosystem

Development Environments

Clojure development environments prioritize seamless integration with the Read-Eval-Print Loop (REPL), enabling interactive programming where code can be evaluated and modified in without restarting the application. This REPL-centric approach aligns with Clojure's dynamic nature, allowing developers to experiment iteratively and leverage the language's concurrency features during development. Popular editors and extend this philosophy through plugins that support structural editing, code evaluation, and project navigation tailored to Clojure's Lisp-like syntax. A key enabler for many of these environments is clojure-lsp, an implementation of the (LSP) for Clojure, which provides features like autocompletion, static analysis, diagnostics, and refactoring across multiple editors as of its latest release in August 2025. Emacs, augmented by the plugin, provides a robust environment for Clojure development via nREPL integration, facilitating interactive evaluation of code forms directly from the editor. enhances this with features like navigation and , while structural editing is commonly achieved using Paredit, which ensures balanced parentheses and integrity during edits. This setup is particularly valued for its extensibility and deep integration with Clojure's ecosystem, making it suitable for complex, long-running REPL sessions. can leverage clojure-lsp for advanced LSP features. IntelliJ IDEA, paired with the plugin, offers advanced static analysis capabilities that index Clojure code for efficient symbol lookup and navigation across namespaces. Cursive supports type checking through integration with Typed Clojure and provides refactoring tools, such as safe renaming and extract method, to maintain code quality in large projects. Its structural editing mimics Paredit behaviors, ensuring edits preserve code structure, and it excels in environments requiring robust build integration and support. Cursive integrates with clojure-lsp for enhanced language server functionality. Visual Studio Code extensions, notably Calva, enable a REPL-driven workflow by connecting to nREPL servers for inline evaluation and result display directly within the editor. Calva supports structural editing inspired by Paredit, allowing selection and manipulation of S-expressions, and includes features like pretty-printing results and Jack-in for quick REPL startup. This makes it accessible for developers familiar with VS Code's ecosystem, emphasizing productivity through keyboard-centric interactions and customizable keybindings. Calva uses clojure-lsp as its backend for LSP features. As of 2025, emerging trends in Clojure environments incorporate AI-assisted tools, highlighted in reClojure conference talks, where large language models (LLMs) enhance REPL workflows by generating snippets based on project context and serving as intelligent assistants for and refactoring. These integrations leverage Clojure's REPL as a source of truth, providing context-aware suggestions that align with the language's dynamic evaluation model, as demonstrated in sessions on LLM-powered and alternatives.

Build and Dependency Management

Clojure's build and dependency management has evolved to emphasize simplicity and integration with the ecosystem, primarily through the introduction of the deps.edn file in 2018 alongside Clojure 1.9. This EDN-based configuration enables declarative specification of dependencies, source paths, and repositories without relying on external tools like or , allowing the Clojure CLI to automatically resolve and download libraries from Maven Central or Clojars. For example, a basic deps.edn might declare dependencies as {:deps {org.clojure/clojure {:mvn/version "1.12.3"}}} and paths via :paths ["src" "resources"], which the CLI uses to construct the . The Clojure CLI, accessible via the clj and clojure scripts, serves as the primary interface for dependency resolution, REPL startup, scripting, and building artifacts like uberjars. It supports running interactive REPL sessions with clj -M, executing scripts via clj -M -m namespace, and creating standalone JARs using libraries like tools.build invoked through CLI aliases in deps.edn. This tool-centric approach avoids the overhead of full build systems for many tasks, though it integrates seamlessly with JVM-based workflows. For native image compilation, Clojure projects leverage via tools like Babashka, which compiles a subset of Clojure to fast-starting executables for scripting and CLI applications, extending beyond the JVM for performance-critical deployments. While the CLI and deps.edn represent the modern standard, legacy tools like Leiningen persist for projects requiring extensive plugins for testing, deployment, and packaging. Leiningen uses a project.clj file for configuration and automates tasks such as dependency resolution and creation, remaining viable for its mature despite being superseded by the CLI for new projects. Similarly, Boot offers an alternative build system focused on incremental, task-based workflows using Clojure code for automation, though its adoption has waned by 2025 in favor of the lighter CLI tooling, with development frozen for several years. In 2025, Clojure 1.12.x releases have enhanced the CLI with improved interactive dependency management, including functions like add-lib and add-libs for dynamically loading libraries without JVM restarts, alongside security fixes such as addressing CVE-2024-22871 for infinite hashCode() in sequences to prevent denial-of-service risks. These updates also bolster support for modular library handling via sync-deps, enabling finer-grained control over project modules during development.

Community and Development

Contribution Process

The Clojure project is governed by a small core team, primarily employed at , with serving as the creator and lead maintainer since the language's inception; following his retirement from full-time employment in 2023, Hickey continues to direct development as an independent contributor. Alex Miller acts as the release manager, handling ticket triage and coordinating releases alongside other team members such as Stu Halloway and Michael Fogus. This structure ensures deliberate evolution, prioritizing simplicity, immutability, and compatibility with existing codebases. Issue tracking occurs primarily through the instance at clojure..net, where users and contributors file defects, enhancements, or feature requests in the CLJ project; detailed guidelines for creating effective tickets emphasize including reproducible examples, priority levels, and labels to facilitate . Community discussions, including problem reporting and enhancement requests, take place on the Ask Clojure forum at ask.clojure.org, where high-voted or relevant questions may be escalated to by the core team. Contributions to the core language require signing the Clojure Contributor Agreement, which assigns joint copyright to and the contributor to maintain consistent licensing under the ; potential contributors are encouraged to review existing tickets on before proposing new ones. Code changes are submitted as patches generated from the official repository at github.com/clojure/clojure, attached directly to relevant issues rather than as pull requests, allowing for version control via while centralizing review. Tickets suitable for newcomers often involve documentation improvements or minor fixes, though no formal "beginner" label exists; the process begins with drafting a patch against the latest development branch and testing it locally using . The review process is managed by the core team, starting with triage by Alex Miller to assess feasibility and alignment with Clojure's design principles, followed by technical evaluation and potential iterations on the ; approval requires consensus among key maintainers, including , with a strong emphasis on preserving to avoid breaking existing applications. Patches marked as "prescreened" or "ok to apply" may be integrated during alpha or beta phases, but final decisions rest with the team to ensure thoughtful changes that enhance expressiveness without introducing complexity. This rigorous , detailed in the official documentation, typically spans weeks to months depending on maintainer availability and patch quality. As of 2025, the project has placed increased emphasis on security fixes, exemplified by the rapid response to CVE-2024-22871—a in affecting versions up to 1.12.0-alpha5—which was patched in subsequent releases to mitigate infinite loops during deserialization of malicious inputs. Additionally, development practices have incorporated more community-driven specifications, drawing input from forums and contrib libraries to refine tools like clojure.spec for better validation and generative testing in production environments.

Events and Resources

The Clojure community organizes several annual conferences that foster knowledge sharing and networking among developers. Clojure/conj, the flagship event since 2010, celebrated its 2025 edition (marking 15 years since the first) on November 12–14, 2025, in , featuring workshops, talks on Clojure and ClojureScript, and topics for over 400 in-person attendees and . reClojure, a community-driven conference in the , occurred on May 26, 2025, in , emphasizing practical applications of Clojure. Clojure South, the largest Clojure event in organized by , returned on October 6–7, 2025, in , , after a six-year hiatus, with workshops and presentations for regional enthusiasts. Regional meetups provide ongoing engagement opportunities tailored to local interests. Clojurians group hosts frequent events, including technical talks, dojos, hackdays, and an annual conference, supporting both newcomers and experienced users through in-person and online sessions. Scicloj, focused on applications of Clojure, organizes meetups and workshops, such as Kira Howe's session on reproducible data analysis at BobKonf 2025 in on March 14. Official resources on clojure.org offer foundational learning materials, including the "Getting Started" guide for installation and REPL interaction, and the "Rationale" section explaining Clojure's design principles like JVM integration and emphasis. Popular books include Clojure for the Brave and True by Daniel Higginbotham, a beginner-friendly introduction to and Clojure ecosystem tools, available since 2015 and recommended on the official site. Online platforms sustain daily community interaction. The Clojure Deref newsletter, a weekly roundup of ecosystem , links, and events (ongoing since 2021, with regular issues in 2025), keeps subscribers informed on developments like calls for papers. Podcasts such as defn, ClojureStream, and The REPL explore topics from core language features to advanced applications, with episodes updated regularly in 2025. The Clojurians workspace serves as the primary chat hub with channels for Clojure, ClojureScript, and tools like , while a dedicated server offers an alternative for threaded discussions and . In 2025, highlights include reClojure talks on integrating large language models (LLMs) with Clojure, such as Kapil Reddy's presentation on framework-free development using LLMs and Clojure's REPL-driven workflow. The State of Clojure survey, an annual community assessment, gauges adoption trends, tool usage, and challenges; the 2024 edition informed ecosystem growth.

Adoption and Impact

Notable Users

Several prominent technology companies have adopted Clojure for building scalable and reliable systems. employs Clojure for internal tools, including frameworks. Apple utilizes Clojure for developing internal tools that support engineering workflows, leveraging its interactive development capabilities to enhance productivity across teams. applies Clojure in tasks within its Earth Science Data Information System (ESDIS), facilitating access and processing of datasets for scientific research. In the sector, has integrated Clojure extensively into its infrastructure, powering approximately 1,000 that handle , detection, and customer services with a on principles for maintainability. The company also actively supports the Clojure community by organizing events such as Clojure South 2025 in , , to foster knowledge sharing and innovation. Open-source projects demonstrate Clojure's versatility in application development. Metabase, an , is primarily implemented in Clojure to manage database queries and visualization logic, enabling over 80,000 organizations to perform tasks efficiently. Penpot, a collaborative , uses Clojure and ClojureScript for its backend and frontend, supporting SVG-based prototyping and real-time collaboration akin to commercial alternatives like . Logseq, a privacy-focused application, relies on ClojureScript for its core logic, allowing users to build interconnected knowledge graphs through outliner-style editing. For web and data-intensive applications, deploys Clojure in systems to process high-volume traffic, such as during peak sales events, where it reduces code complexity and improves deployment speed compared to traditional stacks. incorporates Clojure into its pipelines, using it for the core orchestration of build and testing workflows to ensure reliable automation across diverse software projects. As of 2025, Clojure's adoption in and has grown through the , which provides libraries like scicloj.ml for idiomatic model training and evaluation, enabling data scientists to prototype neural networks and directly in Clojure. Additionally, integrations with large language models (LLMs) have been highlighted in recent talks, showcasing how Clojure's REPL facilitates interactive experimentation with -driven code generation and agentic workflows. The State of ClojureScript 2025 survey, ongoing as of October 2025 with results expected in January 2026, further indicates continued interest in Clojure's and applications.

Surveys and Influence

The State of Clojure 2024 survey, conducted annually since 2010, indicates steady growth in the language's adoption, with 73% of respondents using it professionally across industries such as , , and healthcare. This marks an increase in hobbyist and educational use compared to prior years, alongside rapid uptake of the then-latest release (Clojure 1.12.0, adopted by 58% of users as of late 2024). In the Developer Survey 2023, Clojure ranked among the most admired programming languages, alongside and , reflecting strong developer preference among its users for its functional paradigms and concurrency features. Updated trends in the 2025 survey continue to highlight Clojure's niche appeal, emphasizing its specialized rather than mass-market position. Clojure's standing in language rankings underscores its enduring relevance in 2025. It placed 43rd in TestDevLab's Top 50 Programming Languages report, praised for its concepts, immutable data structures, and suitability for and back-end services on the JVM. The language also features in lists of worth learning, such as Built In's 18 New Programming Languages for 2025, where it is noted for enabling concurrent computations and integrating seamlessly with ecosystems. Clojure has influenced subsequent languages, particularly in concurrency and immutability models. Elixir, created by José Valim, draws significant inspiration from Clojure for its approach to concurrency-oriented programming, with Valim citing it as one of the top three influences alongside and Erlang. Clojure's emphasis on persistent data structures and functional purity has also contributed to the broader revival of on the JVM, complementing Scala's hybrid object-functional style and encouraging immutable designs in applications. Developers frequently praise Clojure's REPL-driven workflow for enabling interactive, iterative development with immediate feedback, allowing evaluation of code in a live application context without full recompilation. This approach, rooted in traditions, enhances productivity by supporting exploratory programming and , as detailed in official guides. Despite these strengths, Clojure's adoption remains niche, partly due to its Lisp-like syntax featuring heavy parentheses and prefix notation, which presents a barrier for developers accustomed to more conventional imperative languages. However, this same syntax enables powerful capabilities, making Clojure timeless for tackling complex, data-intensive problems in specialized domains.

Release History

Major Versions

Clojure 1.0, released on May 4, 2009, represented the initial stable release of the language, featuring its core Lisp-inspired syntax using S-expressions for code as and robust interoperation with , including direct access to Java libraries and classes without wrappers. Clojure 1.3, released on September 23, 2011, added protocols and records to enhance capabilities, allowing developers to define polymorphic behaviors and structured types that integrate efficiently with the host while maintaining immutability. The release of Clojure 1.7 on June 30, 2015, introduced transducers as a composable approach to data processing that avoids intermediate allocations for better performance in sequences and reader conditionals to support conditional reading for multi-platform codebases like Clojure and ClojureScript. Clojure 1.8, released on January 19, 2016, paved the way for integrating spec by including foundational enhancements like direct linking for faster compilation and execution, alongside new string utilities and socket REPL support, setting the stage for advanced specification and testing tools. Version 1.10, released on December 17, 2018, significantly enhanced error messages through phase-specific reporting during read, macroexpansion, compilation, and , while incorporating direct linking optimizations from prior work to reduce startup times and improve runtime efficiency. Clojure 1.11, released on March 22, 2022, improved indexing to enable faster loading and querying of namespaces without full , along with refinements to handling for better dynamic behavior and a new clojure.math for mathematical operations.

Recent Releases

Clojure 1.11.2, released on March 8, 2024, addressed key stability issues, including a fix for CVE-2024-22871, a denial-of-service vulnerability related to infinite sequences causing infinite recursion in hashCode computations. This release also resolved problems in functions like iterate, cycle, and repeat to prevent such infinite loops. Clojure 1.12.0, released on September 5, 2024, introduced several enhancements for Java interoperability and development workflow. Notable additions include support for Java method values using qualified method syntax (e.g., Class/method), array class literals (e.g., String/2), and improved handling of functional interfaces and suppliers. The release also added interactive library management via add-lib and add-libs for dynamic dependency addition without JVM restarts, along with a new clojure.java.process namespace for process control. Optimizations were made to drop, partition, and PersistentVector for better performance, while lazy-seq and delay were updated to use locks instead of synchronized blocks to avoid issues with virtual threads on JDK 21. This version marks the last to target Java 8 bytecode, with future releases planning a shift to a newer LTS baseline. Clojure 1.12.1, released on June 2, 2025, focused on bug fixes and refinements to 1.12.0 features. It reverted unintended changes in qualified semantics for invocation positions where fields and methods share names, fixed unnecessary conversions of objects implementing both IFn and FunctionalInterface, and added support for the new array class syntax in gen-class. Additional tweaks included optimizing add-libs for tool invocations and adding missing :added metadata to 1.12 functions. These updates enhanced reliability in compilation and interop scenarios. Clojure 1.12.2, released on August 25, 2025, delivered performance improvements and further bug resolutions. It optimized Ref handling in LockingTransaction to reduce RetryEx object creation, improved LazySeq serialization by realizing values beforehand and avoiding IFn serialization, and fixed compiler errors for qualified instance method expressions missing instances. The release also removed serialization support for Iterate to prevent errors in persistent data handling. Clojure 1.12.3, released on September 25, 2025, provided final patches for the 1.12 series, primarily fixing nested compilation issues in the for keyword and call sites. This minor update ensures more robust in complex expressions. Looking ahead, discussions on enhancing Clojure with dependent types, which would allow types to depend on values for stronger specifications, have been ongoing but remain stalled since early explorations in related projects like Typed Clojure.

References

  1. [1]
    A history of Clojure | Proceedings of the ACM on Programming ...
    Jun 12, 2020 · Initially designed in 2005 and released in 2007, Clojure is a dialect of Lisp, but is not a direct descendant of any prior Lisp.
  2. [2]
    Rationale - Clojure
    Clojure meets its goals by: embracing an industry-standard, open platform - the JVM; modernizing a venerable language - Lisp; fostering functional programming ...Dynamic Development · History · On State and IdentityMissing: key | Show results with:key
  3. [3]
    Functional Programming - Clojure
    Clojure is a functional programming language. It provides the tools to avoid mutable state, provides functions as first-class objects, and emphasizes recursive ...
  4. [4]
    Clojure - Getting Started
    Clojure is a dynamic development environment where you interact with your program while you write it, growing and adding to it while it's running.Install Clojure · Programming at the REPL · Learn Clojure guide · Editors
  5. [5]
    Clojure
    Clojure is a robust, practical, and fast programming language with a set of useful features that together form a simple, coherent, and powerful tool.Overview · Getting Started · Releases · Clojure CLR
  6. [6]
    ClojureScript - Rationale
    ### Summary of ClojureScript
  7. [7]
    Clojure as a Dialect of Lisp
    Clojure is a member of the Lisp family of languages. Many of the features of Lisp have made it into other languages, but Lisp's approach to code-as-data and ...
  8. [8]
    Hosted on the JVM - Clojure
    Clojure is designed to be a hosted language, sharing the JVM type system, GC, threads etc. It compiles all functions to JVM bytecode. Clojure is a great ...Missing: interoperability | Show results with:interoperability
  9. [9]
    Java Interop - Clojure
    Clojure supports the creation, reading and modification of Java arrays. It is recommended that you limit use of arrays to interop with Java libraries that ...The Dot special form · Support for Java in Clojure... · Support for Java Primitives
  10. [10]
    Data Structures - Clojure
    Clojure provides full support for JVM primitive values by default, allowing high performance, idiomatic Clojure code for numeric applications.Numbers · Collections · Clojure Collection Hashes
  11. [11]
    Macros - Clojure
    Clojure has a programmatic macro system which allows the compiler to be extended by user code. Macros can be used to define syntactic constructs which would ...
  12. [12]
    Multimethods and Hierarchies - Clojure
    A Clojure multimethod is a combination of a dispatching function, and one or more methods. When a multimethod is defined, using defmulti, a dispatching function ...
  13. [13]
    Protocols - Clojure
    A protocol is a named set of named methods and their signatures, defined using defprotocol. (defprotocol AProtocol "A doc string for AProtocol abstraction"
  14. [14]
    Programming at the REPL: Introduction - Clojure
    A Clojure REPL (Read-Eval-Print Loop) is a programming environment that allows interaction with a running program, evaluating code one expression at a time.Missing: key | Show results with:key
  15. [15]
    Dynamic Development - Clojure
    Clojure is dynamic, allowing interaction and program growth. It uses a REPL, and code is automatically compiled on the fly.Missing: key | Show results with:key<|separator|>
  16. [16]
    [PDF] Clojure's approach to concurrency Rich Hickey
    Philosophy. • Things don't change in place. • Becomes obvious once you incorporate time as a dimension. • Place includes time. • The future is a function of the ...
  17. [17]
    Values and Change: Clojure's approach to Identity and State
    Jun 29, 2008 · Concurrency. Dealing with concurrency means giving up the illusion of omnipotence. A program must recognize there will be other participants ...Imperative programming · Object Oriented programming... · Clojure programming
  18. [18]
    Simple Made Easy - InfoQ
    Oct 20, 2011 · Simple Made Easy ; Summary. Rich Hickey emphasizes simplicity's virtues over easiness', showing that while many choose easiness they may end up ...
  19. [19]
    Transcript of Hickey's "Simple Made Easy (2011)" talk - GitHub Gist
    Transcript of Hickey's "Simple Made Easy (2011)" talk. Raw. transcript.txt. 00:04 All right, who's ready for some more category theory? You're all in the wrong ...
  20. [20]
    Runtime Polymorphism - Clojure
    Clojure does not support implementation inheritance. Multimethods are defined using defmulti, which takes the name of the multimethod and the dispatch function.
  21. [21]
    Rich Hickey Q&A - gigamonkeys
    However, while CLOS allows you to build complex class hierarchies, Clojure's types and protocols do not. ... Hickey: One way to think about inheritance and ...
  22. [22]
    Clojure Governance and How It Got That Way
    Feb 17, 2012 · That guy was Rich Hickey, and his idea was to combine the power of Lisp with the reach of a modern managed runtime. He started with Jfli, ...
  23. [23]
    Clojure/Conj 2025
    Clojure/conj is the oldest gathering of the Clojure community, and the next edition will be November 12-14, 2025, in Charlotte, NC at the Charlotte Convention ...
  24. [24]
    Clojure 1.0 Released - Hacker News
    May 4, 2009 · I believe 18 months between first public release and 1.0. Though rhickey said he worked on Clojure for a year+ before the first public release ...
  25. [25]
    [PDF] A History of Clojure - ∑ Xah Code
    Transducers were introduced in Clojure by Rich Hickey. At Ableton we implemented them in C++ and released them as part of our Open Source modern C++ toolkit ...
  26. [26]
    Introducing ClojureScript - Clojure
    Introducing ClojureScript. 22 July 2011. Alessandra Sierra. The Clojure team is proud to introduce an important addition to the ... Follow the Quick Start ...
  27. [27]
    Clojure 1.7 is now available
    Jun 30, 2015 · Transducers are composable algorithmic transformations. They are independent from the context of their input and output sources and specify only ...
  28. [28]
    reClojure 2025: Talks
    This talk introduces a novel approach that preserves Clojure's library-centric philosophy while improving developer experience using LLMs.
  29. [29]
    State of ClojureScript 2025 Survey
    Opinions on styling in ClojureScript vary widely. Some developers are satisfied with plain CSS, while others prefer Tailwind for its speed and simplicity.
  30. [30]
    The Reader - Clojure
    One might say the reader has syntax defined in terms of characters, and the Clojure language has syntax defined in terms of symbols, lists, vectors, maps etc.Reader Forms · Macro Characters · Tagged Literals
  31. [31]
    Learn Clojure - Syntax
    Clojure syntax includes literals for numbers, strings, characters, symbols, and collections like lists, vectors, sets, and maps.Missing: features | Show results with:features
  32. [32]
    Evaluation - Clojure
    Clojure evaluates expressions to yield a value. There is no separate compilation step. Evaluation can occur in REPL, streams, or programmatically. Clojure has ...
  33. [33]
    Special Forms - Clojure
    Special forms in Clojure have different evaluation rules and are understood directly by the compiler. Examples include (def), (if), (do), (let), (fn), (loop), ...
  34. [34]
    Making Clojure Lazier
    Clojure's laziness was improved by introducing `next` and `lazy-seq` which creates a virtual collection that delays work until `seq` is called. `lazy-seq` ...
  35. [35]
    Namespaces - Clojure
    Namespaces in Clojure map symbols to Vars and/or Classes. They can be created using the `ns` macro and are dynamic, created, removed and modified at runtime.
  36. [36]
    Learn Clojure - Flow Control
    Clojure uses `if` for conditionals, `when` for single-branch if, `cond` for multiple tests, and `case` for matching values. `if` and `when` are flow control ...
  37. [37]
    Datatypes: deftype, defrecord and reify - Clojure
    The protocols and datatypes features add powerful and flexible mechanisms for abstraction and data structure definition with no compromises vs the ...
  38. [38]
    Transducers - Clojure
    Transducers are composable algorithmic transformations. They are independent from the context of their input and output sources and specify only the essence ...Missing: 1.7 2015
  39. [39]
    spec Guide - Clojure
    The spec library specifies data structure, validates data, and can generate data based on the spec. It uses predicates to describe allowed values.
  40. [40]
    clojure.spec - Rationale and Overview
    Clojure is a dynamic language. Among other things this means that type annotations are not required for code to run. While Clojure has some support for type ...
  41. [41]
    Concurrent Programming - Clojure
    Clojure simplifies multi-threaded programming in several ways. Because the core data structures are immutable, they can be shared readily between threads.
  42. [42]
    Agents and Asynchronous Actions - Clojure
    When an Agent has errors cached, any subsequent interactions will immediately throw an exception, until the agent's errors are cleared. ... error error-handler ...
  43. [43]
    Clojure core.async Channels
    Jun 28, 2013 · concurrent package provides some good concurrent blocking queues, and they are a viable and popular choice for Clojure programs. However, in ...Rationale · History · Details
  44. [44]
    edn-format/edn: Extensible Data Notation - GitHub
    edn is an extensible data notation. A superset of edn is used by Clojure to represent programs, and it is used by Datomic and other applications as a data ...
  45. [45]
    deps.edn Reference - Clojure
    The deps.edn file is a data file specifying all information needed to form a project classpath, including deps, paths, and external dependency repository ...
  46. [46]
    Programming with Data and EDN - Datomic Documentation
    Extensible Data Notation (EDN) is a way of representing these data structures as text. Example transactions, queries, query results, and sample data ...
  47. [47]
    plumatic/schema: Clojure(Script) library for declarative data ... - GitHub
    A schema is a Clojure(Script) data structure describing a data shape, which can be used to document and validate functions and data.Meet Schema · Beyond Type Hints · More Examples
  48. [48]
    dakrone/cheshire: Clojure JSON and JSON SMILE (binary ... - GitHub
    Cheshire is fast JSON encoding, based off of clj-json and clojure-json, with additional features like Date/UUID/Set/Symbol encoding and SMILE support.
  49. [49]
    GitHub - cognitect/transit-format: A data interchange format.
    ### Summary of Transit as an Alternative to EDN
  50. [50]
    Ahead-of-time Compilation and Class Generation - Clojure
    Clojure compiles all code you load on-the-fly into JVM bytecode, but sometimes it is advantageous to compile ahead-of-time (AOT). Some reasons to use AOT ...
  51. [51]
    java.classpath 1.1.0-SNAPSHOT API documentation
    Returns a sequence of File objects of the elements on the classpath. Defaults to searching for instances of java.net.URLClassLoader in the classloader hierarchy ...
  52. [52]
    unchecked-math* - clojure.core - ClojureDocs
    Note that, even if *unchecked-math* is true when compiling, the unchecked operations are used only when both operands are primitive; if either operand is ...Missing: JVM performance direct linking
  53. [53]
    Clojure 1.12.0
    Sep 5, 2024 · Clojure 1.12 produces Java 8 bytecode (same as Clojure 1.10 and 1.11), but this is expected to be the last release using a Java 8 baseline.Missing: history | Show results with:history
  54. [54]
    ClojureScript
    Clojure is a dynamic, general-purpose programming language supporting interactive development. ... Documentation. Overview Reference Tools Guides. Community.Quick Start · Documentation · Rationale · Tools
  55. [55]
    clojure/clojurescript: Clojure to JS compiler - GitHub
    ClojureScript is a compiler for Clojure that targets JavaScript. It is designed to emit JavaScript code which is compatible with the advanced compilation mode.
  56. [56]
    Quick Start - ClojureScript
    In this tutorial we will guide you through compiling and running a simple ClojureScript project, as well as running REPLs to interactively develop and test ...Hello, ClojureScript · Production Builds · Running ClojureScript on...
  57. [57]
    Clojure CLR
    This project is a native implementation of Clojure on the Common Language Runtime (CLR), the execution engine of Microsoft's .Net Framework.Missing: port | Show results with:port
  58. [58]
    A port of Clojure to the CLR, part of the Clojure project - GitHub
    ClojureCLR. This project is a native implementation of Clojure on the Common Language Runtime (CLR), the execution engine of Microsoft's .Net Framework.
  59. [59]
    Porting .NET 4.8 application using Clojure CLR to .NET 8
    Oct 12, 2024 · The recommended approach is to include the clojure sources with the application and then load the clojure namespaces using clojure.clr.api.Clojure class.Porting clojure libraries w/ java interop to clojure-clr - Ask Clojureclojure-clr nrepl - .NET Standard 2.1. does not work with .NET 7More results from ask.clojure.orgMissing: port | Show results with:port
  60. [60]
    Babashka
    Instant startup. Leveraging GraalVM native-image and the Small Clojure Interpreter, babashka is a self-contained and instantly starting scripting environment.Missing: executable | Show results with:executable
  61. [61]
    babashka/babashka: Native, fast starting Clojure interpreter ... - GitHub
    Babashka is a native Clojure interpreter for scripting with fast startup. Its main goal is to leverage Clojure in places where you would be using bash otherwise ...
  62. [62]
    Babashka book
    Mar 18, 2025 · This book is about scripting with Clojure and Babashka, a scripting environment made with Clojure, compiled to native with GraalVM.Introduction · Getting started · Project setup · Babashka CLI
  63. [63]
    clojerl/clojerl: Clojure for the Erlang VM (unofficial) - GitHub
    Clojerl is an experimental implementation of Clojure on the Erlang VM. Its goal is to leverage the features and abstractions of Clojure that we love.
  64. [64]
    Clojerl
    Clojerl is Clojure for the Erlang VM, combining the power of Erlang VM with the expressiveness of Clojure, a Lisp language.Missing: port | Show results with:port
  65. [65]
    BEAM all the things! ClojErl, an implementation of Clojure on the ...
    Jul 15, 2021 · ClojErl is an implementation of the Clojure language that runs on the BEAM (the Erlang Virtual Machine). The project started as a learning and ...
  66. [66]
    Clojure in WebAssembly - Developer - Fermyon
    Clojure, a functional language, can be used in WebAssembly by compiling it to Java Bytecode, which TeaVM can execute, or by using Clojurescript with JavaScript.
  67. [67]
    helins/wasm.cljc: Spec compliant WebAssembly compiler ... - GitHub
    A novel Clojure/script library for the WebAssembly (WASM) ecosystem. Supported platforms: All binary processing relies on the powerful BinF library.Missing: port | Show results with:port
  68. [68]
    Advanced Compilation - ClojureScript
    If you'd like to access ClojureScript code from JavaScript, then you will need to cope with the fact that advanced compilation will munge the JavaScript ...Using Foreign Libraries · Providing Externs · Access From Javascript
  69. [69]
    Deps and CLI Guide - Clojure
    Here we will demonstrate how to get started. See Clojure CLI and deps.edn for a complete reference. See the changelog for version information. Running a REPL ...<|separator|>
  70. [70]
    Clojure CLI Reference
    The Clojure CLI is a command-line tool to run Clojure programs on the Java Virtual Machine. The Clojure CLI uses deps.edn files to configure and download ...<|control11|><|separator|>
  71. [71]
    Leiningen
    Leiningen is the easiest way to use Clojure. With a focus on project automation and declarative configuration, it gets out of your way and lets you focus on ...Leiningen plugins · Install · Docs · Community
  72. [72]
    Boot: build tooling for Clojure
    Boot supplies abstractions and libraries you can use to automate nearly any build scenario with the full power of the Clojure language.
  73. [73]
    Changelog — org.clojure/clojure 1.12.2 - cljdoc
    Clojure developers can now invoke Java methods taking functional interfaces by passing functions with matching arity. The Clojure compiler implicitly converts ...
  74. [74]
    next Rich - Clojure
    Aug 4, 2023 · And of course to Alex Miller - who possesses in abundance many skills I lack, and without whose indomitable spirit, positivity and friendship ...
  75. [75]
    Contributing to Clojure
    Jul 18, 2022 · Contributors to Clojure are required to jointly assign copyright on their code to Rich Hickey, the creator of Clojure.Users And Contributors · Working With Tickets · Ticket WorkflowMissing: guidelines | Show results with:guidelines
  76. [76]
    Contributing to Clojure - GitHub Gist
    The first thing you'll want to make sure is that your idea is valid, and that you won't spend a ton of time working on something that won't make into master.
  77. [77]
    Development - Clojure
    The core team tends to focus on tickets primarily in the late alpha / early beta period for a release cycle. During other parts of the release cycle, activity ...Missing: date | Show results with:date
  78. [78]
    Creating Tickets - Clojure
    To create a ticket, you must already have a Clojure JIRA account. Issues for Clojure itself can be created in the CLJ project.
  79. [79]
  80. [80]
  81. [81]
    Workflow - Clojure
    This page describes the overall workflow for how tickets (bugs and enhancement requests) make their way through the JIRA ticketing system and ultimately become ...How A Ticket Becomes A... · Ticket Fields · Activities
  82. [82]
    CVE-2024-22871 Detail - NVD
    Feb 28, 2024 · An issue in Clojure versions 1.20 to 1.12.0-alpha5 allows an attacker to cause a denial of service (DoS) via the clojure.core$partial$fn__5920 function.
  83. [83]
    2025 Clojure_Conj - Clojure/conj
    Rich Hickey, the creator of Clojure, kicked things off with some great insights and set the vibe for an exciting event full of learning and community.
  84. [84]
    reClojure 2025
    May 26, 2025 · It will take place at Bounce Farringdon in central London, on May 26th 2025. Nathan Marz of Red Planet Labs will be giving a keynote talk on ...Missing: LLMs | Show results with:LLMs
  85. [85]
    2ª edição da Clojure South!
    Depois de estrear em 2019, a conferência retorna ao Brasil em 2025, reunindo profissionais em São Paulo. Organizada pelo Nubank, a Clojure South faz parte da ...
  86. [86]
  87. [87]
    London Clojurians - Meetup
    London Clojurians is a very active community with several events per month, including technical talks, coding dojo's, hackdays and a yearly conference.Missing: Scicloj BobKonf
  88. [88]
    London Clojurians
    Encourage everyone to code with Clojure and learn functional programming. Supporting those new to coding via our ClojureBridge London events.
  89. [89]
    Clojure in new fields - opening up - Scicloj
    Apr 12, 2025 · Kira Howe's workshop (notes here) at the BobKonf 2025 conference introduced Clojure for data analysis to people who are new to Clojure. We ...
  90. [90]
    Meetups and Events - ClojureVerse
    Community Center Meetups and Events ; London Clojurians Talk: The Gaiwan Stack (by Arne Brasseur). 0, 206, October 2, 2025 ; Scicloj AI Meetup 12: Practicing ...Missing: BobKonf | Show results with:BobKonf
  91. [91]
    Brave Clojure
    In Clojure for the Brave and True, you'll learn to wield this awesome language to its fullest! Read Free Online Amazon No Starch. Brave Clojure Jobs. The first ...For the Brave and True · Brave Clojure Jobs · On-Site Clojure Training for...
  92. [92]
    Books - Clojure
    Books ; Clojure In Action by Amit Rathore Jan 1, 2016 ; Clojure for the Brave and True by Daniel Higginbotham Oct 23, 2015 ; Clojure Recipes by Julian Gamble Oct ...
  93. [93]
    Clojure Deref (Sep 24, 2025)
    Sep 24, 2025 · Welcome to the Clojure Deref! This is a weekly link/news roundup for the Clojure ecosystem (feed: RSS). Upcoming Events.Missing: Slack Discord
  94. [94]
    10 Best Clojure Podcasts to Listen to in 2025
    Clojure Podcasts · 1. defn · 2. ClojureStream Podcast · 3. The REPL · 4. Cognicast · 5. Lost in Lambduhhs · 6. Functional Design in Clojure.
  95. [95]
    Community Resources - Clojure
    Clojure Reference Docs - official reference information. Clojure Cheatsheet - helpful categorization of most core functions. Source - Clojure, ClojureScript, ...
  96. [96]
    A Discord for Clojurians : r/Clojure - Reddit
    May 19, 2017 · Reading some of the recent strife about Slack (user limits, chat history limits, etc) I decided to create a Discord server for "Clojurians".Slack and discord community to improve your skills - ClojureDiscord Coding Community : r/ClojureMore results from www.reddit.com
  97. [97]
    LLMs + Clojure = Who needs frameworks? (by Kapil Reddy)
    Jun 30, 2025 · The London Clojurians are happy to present: ~~~~ reClojure 2025 ~~~ Title: LLMs + Clojure = Who needs frameworks? Speaker: Kapil Reddy Large ...Missing: conference | Show results with:conference
  98. [98]
    State of Clojure 2024 Results
    Dec 2, 2024 · Recently we completed the 2024 State of Clojure survey. You can find the full survey results in this report. See these sections for more detail:.
  99. [99]
    Introducing PigPen: Map-Reduce for Clojure - Netflix TechBlog
    Jan 2, 2014 · PigPen is map-reduce for Clojure, a language that looks and behaves like Clojure, allowing map-reduce queries as programs, not scripts.
  100. [100]
    Companies - Clojure
    Below is a partial list of some companies using Clojure or ClojureScript. Most of this information comes from direct contacts, presentations, or other online ...Missing: notable | Show results with:notable
  101. [101]
    Powerful - many uses of Clojure · Clojurebridge London Workshop
    Clojure is used extensively for the performance sensitive back-end services, for example making decisions on who to give loans to, the accounting system, and ...
  102. [102]
    Functional programming with Clojure: why and how does Nubank ...
    Mar 28, 2023 · Today, Nubank's microservices architecture has around 1000 microservices written in Clojure. Moreover, all of the microservice have the same ...Missing: usage | Show results with:usage
  103. [103]
    Working with Clojure | Metabase Documentation
    Check out Clojure for the Brave and True. It's free online. If you don't feel like reading a whole book, Mark Volkmann's Clojure tutorial is another good ...
  104. [104]
    "Getting 50,000 Companies on Board with Clojure" by Cam Saul
    Nov 1, 2024 · Clojure transformed Metabase from a tiny startup to a global open-source BI powerhouse used by over 50,0000 companies every day!Missing: notable | Show results with:notable
  105. [105]
    Why we chose the Clojure programming language for Penpot
    Aug 7, 2022 · Clojure was the right language for Penpot to choose because of its key features: stability, backwards compatibility, and syntactic abstraction.
  106. [106]
    Walmart Runs Clojure at Scale - Cognitect.com
    Jun 30, 2015 · Clojure uses anywhere from 5 to 10 times less code than other programming languages, speeding development time, reducing the instances of bugs, ...
  107. [107]
    Clojure microservices for JavaScript developers - CircleCI
    Jul 22, 2021 · In these posts, we'll use JavaScript as a point of comparison for understanding what is new and interesting about Clojure.
  108. [108]
    The Current State of ML in Clojure - Scicloj
    Apr 4, 2024 · This is a cross-post of a recent post by Kira McLean at her blog, that has encouraged a few discussions over the web.
  109. [109]
    "Enhancing LLM Powered Development with Clojure's REPL" by ...
    Nov 4, 2024 · ... REPL. We'll leverage the editor to provide relevant, project-specific context to improve AI-assisted coding. Clojure's REPL serves as the ...Missing: tools generation
  110. [110]
    Comparing tag trends with our Most Loved programming languages
    Jan 26, 2023 · Rust, Elixir, Clojure, Typescript,and Julia are at the top of the list of Most Loved Programming Languages.
  111. [111]
    Technology | 2025 Stack Overflow Developer Survey
    It saw a 7 percentage point increase from 2024 to 2025; this speaks to its ability to be the go-to language for AI, data science, and back-end development.
  112. [112]
    Top 50 Programming Languages in 2025 - TestDevLab
    Jan 3, 2025 · Discover the 50 most popular programming languages, like Python, Java, JavaScript, C++, C#, TypeScript, Golang, Kotlin, Swift, and more.
  113. [113]
    18 New Programming Languages to Learn in 2025 | Built In
    2. Clojure. Clojure is a general-purpose language designed for concurrency, which means it supports multiple computations happening at the same time. But ...
  114. [114]
    An interview with José Valim, Creator of Elixir by Evrone
    Evrone: We know that Elixir was inspired by Ruby, Clojure, Haskell. In hindsight, is there anything else you can name that inspired you? José: Yeah. The ...
  115. [115]
    José Valim - Cognicast Episode 120 - Cognitect.com
    Mar 7, 2017 · I like to say it's one of the top three influences in Elixir, but anyway it tells this whole story about concurrency, right? Concurrency is ...Our Guest, José Valim · Topics · Audio Production
  116. [116]
    Functional Programming on the JVM - Ada Beat
    Jun 12, 2024 · This blog post aims to explore the world of functional programming on the JVM, focusing on four prominent languages: Scala, Clojure, Kotlin, and Groovy.Language Options For Fp On... · Comparing The Languages · Case Studies And Real-World...
  117. [117]
    Programming at the REPL: Enhancing your REPL workflow - Clojure
    Most Clojure programmers don't use the terminal-based REPL for everyday development: instead, they use a REPL integration in their editor.Missing: appeal | Show results with:appeal<|separator|>
  118. [118]
    Clojure 1.0
    **Summary of Clojure 1.0 Release:**
  119. [119]
    Java Community News - Rich Hickey Releases Clojure 1.0 - Artima
    May 5, 2009 · Summary Clojure is a Lisp dialect for the JVM. Developed mainly by Rich Hickey, Clojure 1.0 was released this week.
  120. [120]
    [ANN] Clojure 1.3 Released
    - **Date of Clojure 1.3 Release Announcement**: Not explicitly stated in the provided content.
  121. [121]
    clojure » 1.8.0 - Maven Repository
    Clojure » 1.8.0 ; License, EPL 1.0 · Categories, JVM Languages · Tags, jvmclojurelanguagescripting · http://clojure.org/. Date, Jan 19 · Date, Jan 19, 2016.
  122. [122]
    Clojure 1.8 is now available
    Jan 19, 2016 · Clojure 1.8 is now available. 19 January 2016. Alex Miller. Some of the new features for 1.8 are: More string functions in clojure.string ...
  123. [123]
  124. [124]
    Introducing clojure.spec
    May 23, 2016 · I'm happy to introduce today clojure.spec, a new core library and support for data and function specifications in Clojure. Better Communication.
  125. [125]
    Clojure 1.10 release
    Dec 17, 2018 · Clojure 1.10 focuses on improved error reporting, categorizing errors by execution phase, and Java compatibility with Java 8 and 11.Missing: 1.0 notes
  126. [126]
  127. [127]
    clojure » 1.11.0 - Maven Repository
    Clojure » 1.11.0 ; http://clojure.org/ Inspect URL · Mar 22, 2022 · pom (9 KB) jar (3.9 MB) View All · CentralVelocity · #20 in MvnRepository (See Top Artifacts) # ...<|control11|><|separator|>
  128. [128]
    Clojure 1.11.0 release
    Mar 22, 2022 · Clojure 1.11 provides new syntax for keyword argument invocation, namespace aliasing without loading, a new clojure.math namespace, and many additional bug ...
  129. [129]
    Clojure 1.11.2
    Clojure 1.11.2 and 1.12.0-alpha9 are now available. These releases include a fix for CVE CVE-2024-22871 detailed in GHSA- ...Missing: notes | Show results with:notes
  130. [130]
    Clojure 1.12.1
    Jun 2, 2025 · Clojure 1.12.1. 02 June 2025. Alex Miller. Clojure 1.12.1 is now available! Find download and usage information on the Downloads page.
  131. [131]
    Clojure 1.12.2
    Aug 25, 2025 · Clojure 1.12.2. 25 August 2025. Alex Miller. Clojure 1.12.2 is now available! Find download and usage information on the Downloads page.
  132. [132]
    Clojure 1.12.3
    Sep 25, 2025 · Clojure 1.12.3. 25 September 2025. Alex Miller. Clojure 1.12.3 is now available! Find download and usage information on the Downloads page.
  133. [133]