skip to main content
research-article
Open access

A history of Clojure

Published: 12 June 2020 Publication History

Abstract

Clojure was designed to be a general-purpose, practical functional language, suitable for use by professionals wherever its host language, e.g., Java, would be. Initially designed in 2005 and released in 2007, Clojure is a dialect of Lisp, but is not a direct descendant of any prior Lisp. It complements programming with pure functions of immutable data with concurrency-safe state management constructs that support writing correct multithreaded programs without the complexity of mutex locks.
Clojure is intentionally hosted, in that it compiles to and runs on the runtime of another language, such as the JVM. This is more than an implementation strategy; numerous features ensure that programs written in Clojure can leverage and interoperate with the libraries of the host language directly and efficiently.
In spite of combining two (at the time) rather unpopular ideas, functional programming and Lisp, Clojure has since seen adoption in industries as diverse as finance, climate science, retail, databases, analytics, publishing, healthcare, advertising and genomics, and by consultancies and startups worldwide, much to the career-altering surprise of its author.
Most of the ideas in Clojure were not novel, but their combination puts Clojure in a unique spot in language design (functional, hosted, Lisp). This paper recounts the motivation behind the initial development of Clojure and the rationale for various design decisions and language constructs. It then covers its evolution subsequent to release and adoption.

References

[1]
Anglican. 2020. Anglican web site. https://probprog.github.io/anglican/ (also at Internet Archive 5 March 2020 15:36:41 ).
[2]
Phil Bagwell. 2001. Ideal Hash Trees. http://infoscience.epfl.ch/record/64398 Technical report, October 2001.
[3]
Philip Bagwell and Tiark Rompf. 2011. RRB-Trees: Efficient Immutable Vectors. 16. http://infoscience.epfl.ch/record/169879
[4]
Henry G. Baker. 1993. Equal rights for functional objects or, the more things change, the more they are the same. ACM SIGPLAN OOPS Messenger 4, 4 (Oct), 2–27.
[5]
Philip A. Bernstein and Nathan Goodman. 1983. Multiversion Concurrency Control—Theory and Algorithms. ACM Trans. Database Syst. 8, 4 (Dec.), 465–483.
[6]
Richard Bird et al. 1988. Lectures on constructive functional programming. Oxford University Computing Laboratory, Programming Research Group.
[7]
Linus Björnstam. 2019. SRFI-171 Transducers. https://srfi.schemers.org/srfi- 171/srfi- 171.html (also at Internet Archive 9 March 2020 17:40:11 ).
[8]
Ambrose Bonnaire-Sergeant, Rowan Davies, and Sam Tobin-Hochstadt. 2016. Practical Optional Types for Clojure, Vol. 9632. (04), 68–94.
[9]
Cliff Click and John Rose. 2002. Fast Subtype Checking in the HotSpot JVM. In Proceedings of the 2002 Joint ACM-ISCOPE Conference on Java Grande (Seattle, Washington, USA) (JGI ’02). Association for Computing Machinery, New York, NY, USA, 96–107.
[10]
ClojureIRC. 2008. Clojure IRC log. http://clojure- log.n01se.net/date/2008- 02- 01.html (also at Internet Archive 10 March 2020 16:39:37 ).
[11]
ClojureTV. 2019. ClojureTV na. https://www.youtube.com/user/ClojureTV ClojureTV is a YouTube video channel, the description for which is: “ClojureTV brings together talks and presentations from the community, major Clojure conferences, and Cognitect. Here you can find Clojure/conj, Clojure/west and EuroClojure talks, as well as custom video tutorials and presentations from Rich Hickey and the Cognitect team.”.
[12]
Robert Crim and Jon Pither. 2016. Funding Circle – Lending some Clojure. https://juxt.pro/blog/posts/clojure- infundingcircle.html (also at Internet Archive 5 March 2020 15:51:29 ).
[13]
James R Driscoll, Neil Sarnak, Daniel D Sleator, and Robert E Tarjan. 1989. Making data structures persistent. Journal of computer and system sciences 38, 1, 86–124.
[14]
Michael Ernst, Craig Kaplan, and Craig Chambers. 1998. Predicate dispatching: A unified theory of dispatch. In European Conference on Object-Oriented Programming. Springer, 186–211.
[15]
Richard P Gabriel, Sonya E Keene, Gregor Kiczales, David A Moon, Jim Kempf, Larry Masinter, Mark Stefik, Daniel L Weinreb, and Jon L White. 1987. Common lisp object system specification.". ANSI X3J13 Document, 87–002.
[16]
Richard P Gabriel and Kent M Pitman. 1988. Endpaper: Technical issues of separation in function cells and value cells. Lisp and Symbolic Computation 1, 1, 81–101.
[17]
Paul Graham. 2003. Lisp Essays. http://www.paulgraham.com/lisp.html (also at Internet Archive 1 Feb. 2020 09:49:40 ).
[18]
Jim Gray and Andreas Reuter. 1992. Transaction processing: concepts and techniques. Elsevier.
[19]
Stuart Halloway. 2009. Programming Clojure. Pragmatic Bookshelf.
[20]
Tim Harris, Simon Marlow, Simon Peyton-Jones, and Maurice Herlihy. 2005. Composable memory transactions. In Proceedings of the tenth ACM SIGPLAN symposium on Principles and practice of parallel programming. ACM, 48–60.
[21]
Rich Hickey. 1996. Callbacks in C++ using template functors. In C++ gems. SIGS Publications, Inc., 515–537.
[22]
Rich Hickey. 2003. DotLisp - A Lisp Dialect for .Net. http://dotlisp.sourceforge.net/dotlisp.htm (also at Internet Archive 10 Feb. 2020 20:30:16 ).
[23]
Rich Hickey. 2004. Jfli - A Java Foreign Language Interface for Common Lisp. http://jfli.sourceforge.net/ (also at Internet Archive 10 Feb. 2020 20:17:34 ).
[24]
Rich Hickey and Eric Thorsen. 2005. Foil - a Foreign Object Interface for Lisp. http://foil.sourceforge.net/ (also at Internet Archive 10 Feb. 2020 20:25:50 ).
[25]
Charles Antony Richard Hoare. 1978. Communicating sequential processes. In The origin of concurrent programming. Springer, 413–443.
[26]
IETF. 2017. The JavaScript Object Notation ( JSON) Data Interchange Format. https://tools.ietf.org/html/rfc8259 (also at Internet Archive 7 March 2020 20:01:42 ).
[27]
Eugene Kohlbecker, Daniel P. Friedman, Matthias Felleisen, and Bruce Duba. 1986. Hygienic Macro Expansion. In Proceedings of the 1986 ACM Conference on LISP and Functional Programming (Cambridge, Massachusetts, USA) (LFP ’86). Association for Computing Machinery, New York, NY, USA, 151–161.
[28]
T Lindholm and F Yellin. 1999. The Java TM Virtual Machine Specification, 2nd edn. Sun Microsystems.
[29]
Mark McGranaghan. 2011. Clojurescript: Functional programming for javascript platforms. IEEE Internet Computing 15, 6, 97–102.
[30]
Robin Milner, Mads Tofte, Robert Harper, and David MacQueen. 1997. The definition of standard ML: revised. MIT press.
[31]
Ben Moseley and Peter Marks. 2006. Out of the tar pit. Software Practice Advancement (SPA) 2006.
[32]
Chris Okasaki. 1999. Purely functional data structures. Cambridge University Press.
[33]
Stack Overflow. 2019. Developer survey results 2019. https://insights.stackoverflow.com/survey/2019 (also at Internet Archive 5 March 2020 15:55:07 ).
[34]
Alan J Perlis. 1982. Special feature: Epigrams on programming. ACM Sigplan Notices 17, 9, 7–13.
[35]
Guy L Steele. 1999. Growing a language. Higher-Order and Symbolic Computation 12, 3, 221–236.
[36]
Guy L Steele and Richard P Gabriel. 1996. The evolution of Lisp. In History of programming languages—II. ACM, 233–330.
[37]
Guy L Steele Jr, Scott E Fahlman, Richard P Gabriel, David A Moon, Daniel L Weinreb, Daniel G Bobrow, Linda G DeMichiel, Sonya E Keene, Gregor Kiczales, Crispin Perdue, et al. 1990. Waters, and Jon L White. Common Lisp: The Language.
[38]
Guy Lewis Steele Jr and Gerald Jay Sussman. 1978. The Revised Report on SCHEME: A Dialect of LISP. Technical Report. MASSACHUSET TS INST OF TECH CAMBRIDGE ARTIFICIAL INTELLIGENCE LAB.
[39]
David Tolpin, Jan-Willem van de Meent, Hongseok Yang, and Frank Wood. 2016. Design and Implementation of Probabilistic Programming Language Anglican. In Proceedings of the 28th Symposium on the Implementation and Application of Functional Programming Languages (Leuven, Belgium) (IFL 2016). Association for Computing Machinery, New York, NY, USA, Article Article 6, 12 pages.
[40]
W3C. 2014. RDF 1.1 XML Syntax. https://www.w3.org/TR/rdf- syntax- grammar/ (also at Internet Archive 5 March 2020 13:23:43 ).
[41]
Philip Wadler and Stephen Blott. 1989. How to make ad-hoc polymorphism less ad hoc. In Proceedings of the 16th ACM SIGPLAN-SIGACT symposium on Principles of programming languages. ACM, 60–76.
[42]
Edward Wible and Jeff Meyerson. 2018. Build a Bank: Nubank with Edward Wible. https://softwareengineeringdaily.com/ 2018/07/10/build- a- bank- nubank- with- edward- wible/ (also at Internet Archive 5 March 2020 15:45:47 ).

Cited By

View all
  • (2024)Hermes-3: Multi-component plasma simulations with BOUT++Computer Physics Communications10.1016/j.cpc.2023.108991296(108991)Online publication date: Mar-2024
  • (2024)Exploring API behaviours through generated examplesSoftware Quality Journal10.1007/s11219-024-09668-232:2(729-763)Online publication date: 1-Jun-2024
  • (2023)The cost of passing - using deep learning AIs to expand our understanding of the ancient game of GoInternational Journal of Networking and Computing10.15803/ijnc.13.2_25813:2(258-272)Online publication date: 2023
  • Show More Cited By

Recommendations

Comments

Information & Contributors

Information

Published In

cover image Proceedings of the ACM on Programming Languages
Proceedings of the ACM on Programming Languages  Volume 4, Issue HOPL
June 2020
1524 pages
EISSN:2475-1421
DOI:10.1145/3406494
Issue’s Table of Contents
Permission to make digital or hard copies of part or all of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. Copyrights for third-party components of this work must be honored. For all other uses, contact the Owner/Author.

Publisher

Association for Computing Machinery

New York, NY, United States

Publication History

Published: 12 June 2020
Published in PACMPL Volume 4, Issue HOPL

Check for updates

Author Tags

  1. Clojure
  2. Lisp

Qualifiers

  • Research-article

Contributors

Other Metrics

Bibliometrics & Citations

Bibliometrics

Article Metrics

  • Downloads (Last 12 months)8,834
  • Downloads (Last 6 weeks)1,002
Reflects downloads up to 23 Nov 2024

Other Metrics

Citations

Cited By

View all
  • (2024)Hermes-3: Multi-component plasma simulations with BOUT++Computer Physics Communications10.1016/j.cpc.2023.108991296(108991)Online publication date: Mar-2024
  • (2024)Exploring API behaviours through generated examplesSoftware Quality Journal10.1007/s11219-024-09668-232:2(729-763)Online publication date: 1-Jun-2024
  • (2023)The cost of passing - using deep learning AIs to expand our understanding of the ancient game of GoInternational Journal of Networking and Computing10.15803/ijnc.13.2_25813:2(258-272)Online publication date: 2023
  • (2023)Clerk: Moldable Live Programming for ClojureCompanion Proceedings of the 7th International Conference on the Art, Science, and Engineering of Programming10.1145/3594671.3594682(22-31)Online publication date: 13-Mar-2023
  • (2023)ClojureEncyclopedia of Big Data Technologies10.1007/978-3-319-63962-8_302-2(1-12)Online publication date: 5-May-2023
  • (2022)Semantic soundness for language interoperabilityProceedings of the 43rd ACM SIGPLAN International Conference on Programming Language Design and Implementation10.1145/3519939.3523703(609-624)Online publication date: 9-Jun-2022
  • (2022)A Comprehensive Exploration of Languages for Parallel ComputingACM Computing Surveys10.1145/348500855:2(1-39)Online publication date: 18-Jan-2022
  • (2022)The cost of passing – using deep learning AIs to expand our understanding of the ancient game of Go2022 Tenth International Symposium on Computing and Networking (CANDAR)10.1109/CANDAR57322.2022.00019(90-96)Online publication date: Nov-2022
  • (2022)The Discourje project: run-time verification of communication protocols in ClojureInternational Journal on Software Tools for Technology Transfer (STTT)10.1007/s10009-022-00674-y24:5(757-782)Online publication date: 1-Oct-2022
  • (2021)Runtime and compiler support for HAMTsProceedings of the 17th ACM SIGPLAN International Symposium on Dynamic Languages10.1145/3486602.3486931(48-59)Online publication date: 19-Oct-2021
  • Show More Cited By

View Options

View options

PDF

View or Download as a PDF file.

PDF

eReader

View online with eReader.

eReader

Login options

Full Access

Media

Figures

Other

Tables

Share

Share

Share this Publication link

Share on social media