skip to main content
research-article
Open Access

A history of Clojure

Published:12 June 2020Publication History
Skip Abstract Section

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 ).Google ScholarGoogle Scholar
  2. Phil Bagwell. 2001. Ideal Hash Trees. http://infoscience.epfl.ch/record/64398 Technical report, October 2001.Google ScholarGoogle Scholar
  3. Philip Bagwell and Tiark Rompf. 2011. RRB-Trees: Efficient Immutable Vectors. 16. http://infoscience.epfl.ch/record/169879Google ScholarGoogle Scholar
  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. Google ScholarGoogle ScholarDigital LibraryDigital Library
  5. Philip A. Bernstein and Nathan Goodman. 1983. Multiversion Concurrency Control—Theory and Algorithms. ACM Trans. Database Syst. 8, 4 (Dec.), 465–483. Google ScholarGoogle ScholarDigital LibraryDigital Library
  6. Richard Bird et al. 1988. Lectures on constructive functional programming. Oxford University Computing Laboratory, Programming Research Group.Google ScholarGoogle Scholar
  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 ).Google ScholarGoogle Scholar
  8. Ambrose Bonnaire-Sergeant, Rowan Davies, and Sam Tobin-Hochstadt. 2016. Practical Optional Types for Clojure, Vol. 9632. (04), 68–94. Google ScholarGoogle ScholarCross RefCross Ref
  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. Google ScholarGoogle ScholarDigital LibraryDigital Library
  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 ).Google ScholarGoogle Scholar
  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.”.Google ScholarGoogle Scholar
  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 ).Google ScholarGoogle Scholar
  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.Google ScholarGoogle ScholarDigital LibraryDigital Library
  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.Google ScholarGoogle ScholarCross RefCross Ref
  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.Google ScholarGoogle Scholar
  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.Google ScholarGoogle ScholarCross RefCross Ref
  17. Paul Graham. 2003. Lisp Essays. http://www.paulgraham.com/lisp.html (also at Internet Archive 1 Feb. 2020 09:49:40 ).Google ScholarGoogle Scholar
  18. Jim Gray and Andreas Reuter. 1992. Transaction processing: concepts and techniques. Elsevier.Google ScholarGoogle ScholarDigital LibraryDigital Library
  19. Stuart Halloway. 2009. Programming Clojure. Pragmatic Bookshelf.Google ScholarGoogle Scholar
  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.Google ScholarGoogle ScholarDigital LibraryDigital Library
  21. Rich Hickey. 1996. Callbacks in C++ using template functors. In C++ gems. SIGS Publications, Inc., 515–537.Google ScholarGoogle Scholar
  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 ).Google ScholarGoogle Scholar
  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 ).Google ScholarGoogle Scholar
  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 ).Google ScholarGoogle Scholar
  25. Charles Antony Richard Hoare. 1978. Communicating sequential processes. In The origin of concurrent programming. Springer, 413–443.Google ScholarGoogle Scholar
  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 ).Google ScholarGoogle Scholar
  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. Google ScholarGoogle ScholarDigital LibraryDigital Library
  28. T Lindholm and F Yellin. 1999. The Java TM Virtual Machine Specification, 2nd edn. Sun Microsystems.Google ScholarGoogle Scholar
  29. Mark McGranaghan. 2011. Clojurescript: Functional programming for javascript platforms. IEEE Internet Computing 15, 6, 97–102.Google ScholarGoogle ScholarDigital LibraryDigital Library
  30. Robin Milner, Mads Tofte, Robert Harper, and David MacQueen. 1997. The definition of standard ML: revised. MIT press.Google ScholarGoogle ScholarDigital LibraryDigital Library
  31. Ben Moseley and Peter Marks. 2006. Out of the tar pit. Software Practice Advancement (SPA) 2006.Google ScholarGoogle Scholar
  32. Chris Okasaki. 1999. Purely functional data structures. Cambridge University Press.Google ScholarGoogle ScholarDigital LibraryDigital Library
  33. Stack Overflow. 2019. Developer survey results 2019. https://insights.stackoverflow.com/survey/2019 (also at Internet Archive 5 March 2020 15:55:07 ).Google ScholarGoogle Scholar
  34. Alan J Perlis. 1982. Special feature: Epigrams on programming. ACM Sigplan Notices 17, 9, 7–13.Google ScholarGoogle ScholarDigital LibraryDigital Library
  35. Guy L Steele. 1999. Growing a language. Higher-Order and Symbolic Computation 12, 3, 221–236.Google ScholarGoogle ScholarDigital LibraryDigital Library
  36. Guy L Steele and Richard P Gabriel. 1996. The evolution of Lisp. In History of programming languages—II. ACM, 233–330.Google ScholarGoogle Scholar
  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.Google ScholarGoogle ScholarDigital LibraryDigital Library
  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.Google ScholarGoogle Scholar
  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. Google ScholarGoogle ScholarDigital LibraryDigital Library
  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 ).Google ScholarGoogle Scholar
  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.Google ScholarGoogle ScholarDigital LibraryDigital Library
  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 ).Google ScholarGoogle Scholar

Index Terms

  1. A history of Clojure

      Recommendations

      Comments

      Login options

      Check if you have access through your login credentials or your institution to get full access on this article.

      Sign in

      Full Access

      • 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

        Copyright © 2020 Owner/Author

        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

        Qualifiers

        • research-article

      PDF Format

      View or Download as a PDF file.

      PDF

      eReader

      View online with eReader.

      eReader