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.
- Anglican. 2020. Anglican web site. https://probprog.github.io/anglican/ (also at Internet Archive 5 March 2020 15:36:41 ).Google Scholar
- Phil Bagwell. 2001. Ideal Hash Trees. http://infoscience.epfl.ch/record/64398 Technical report, October 2001.Google Scholar
- Philip Bagwell and Tiark Rompf. 2011. RRB-Trees: Efficient Immutable Vectors. 16. http://infoscience.epfl.ch/record/169879Google Scholar
- 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. Google ScholarDigital Library
- Philip A. Bernstein and Nathan Goodman. 1983. Multiversion Concurrency Control—Theory and Algorithms. ACM Trans. Database Syst. 8, 4 (Dec.), 465–483. Google ScholarDigital Library
- Richard Bird et al. 1988. Lectures on constructive functional programming. Oxford University Computing Laboratory, Programming Research Group.Google Scholar
- 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 ).Google Scholar
- Ambrose Bonnaire-Sergeant, Rowan Davies, and Sam Tobin-Hochstadt. 2016. Practical Optional Types for Clojure, Vol. 9632. (04), 68–94. Google ScholarCross Ref
- 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. Google ScholarDigital Library
- 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 ).Google Scholar
- 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.”.Google Scholar
- 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 ).Google Scholar
- 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.Google ScholarDigital Library
- 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.Google ScholarCross Ref
- 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.Google Scholar
- 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.Google ScholarCross Ref
- Paul Graham. 2003. Lisp Essays. http://www.paulgraham.com/lisp.html (also at Internet Archive 1 Feb. 2020 09:49:40 ).Google Scholar
- Jim Gray and Andreas Reuter. 1992. Transaction processing: concepts and techniques. Elsevier.Google ScholarDigital Library
- Stuart Halloway. 2009. Programming Clojure. Pragmatic Bookshelf.Google Scholar
- 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.Google ScholarDigital Library
- Rich Hickey. 1996. Callbacks in C++ using template functors. In C++ gems. SIGS Publications, Inc., 515–537.Google Scholar
- 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 ).Google Scholar
- 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 ).Google Scholar
- 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 ).Google Scholar
- Charles Antony Richard Hoare. 1978. Communicating sequential processes. In The origin of concurrent programming. Springer, 413–443.Google Scholar
- 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 ).Google Scholar
- 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. Google ScholarDigital Library
- T Lindholm and F Yellin. 1999. The Java TM Virtual Machine Specification, 2nd edn. Sun Microsystems.Google Scholar
- Mark McGranaghan. 2011. Clojurescript: Functional programming for javascript platforms. IEEE Internet Computing 15, 6, 97–102.Google ScholarDigital Library
- Robin Milner, Mads Tofte, Robert Harper, and David MacQueen. 1997. The definition of standard ML: revised. MIT press.Google ScholarDigital Library
- Ben Moseley and Peter Marks. 2006. Out of the tar pit. Software Practice Advancement (SPA) 2006.Google Scholar
- Chris Okasaki. 1999. Purely functional data structures. Cambridge University Press.Google ScholarDigital Library
- Stack Overflow. 2019. Developer survey results 2019. https://insights.stackoverflow.com/survey/2019 (also at Internet Archive 5 March 2020 15:55:07 ).Google Scholar
- Alan J Perlis. 1982. Special feature: Epigrams on programming. ACM Sigplan Notices 17, 9, 7–13.Google ScholarDigital Library
- Guy L Steele. 1999. Growing a language. Higher-Order and Symbolic Computation 12, 3, 221–236.Google ScholarDigital Library
- Guy L Steele and Richard P Gabriel. 1996. The evolution of Lisp. In History of programming languages—II. ACM, 233–330.Google Scholar
- 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.Google ScholarDigital Library
- 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.Google Scholar
- 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. Google ScholarDigital Library
- 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 ).Google Scholar
- 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.Google ScholarDigital Library
- 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 ).Google Scholar
Index Terms
- A history of Clojure
Recommendations
An embedding of B in Clojure
MODELS '22: Proceedings of the 25th International Conference on Model Driven Engineering Languages and Systems: Companion ProceedingsConsidering programs as data enables powerful meta-programming. One example is Lisp's macro system, which gives rise to powerful transformations of programs and allows easy implementation of domain-specific languages. Formal specifications, however, ...
Clojure for Number Crunching on Multicore Machines
Clojure is a Lisp language designed to run on a Java Virtual Machine (JVM) and interoperate automatically with all Java libraries. However, compared to Java, Clojure has a concurrency API that encourages programmers to take advantage of multicore ...
Comments