The Curious Engineer

All blogs / Lisp / Clojure / Scheme

Eric Normand's Website

ericnormand.me

Eric Normand writes about functional programming and Clojure.

Lisp / Clojure / SchemeFunctional / PL theorySoftware / engineering practice

Posts
224 from 9 Dec 2011 to 16 Dec 2025
Posting
now and then (3 in the last year)
Kind
personal blog
Feed
https://ericnormand.me/rss.xml

2025 12

  1. Denotational vs operational
  2. What are formal systems?
  3. Post-Conj update
  4. A functional programming course in 6 books
  5. My biggest fear with AI
  6. LLMs' surprise teaches us about ourselves
  7. The economic inevitability of AI
  8. AI, Lisp, and Programming
  9. Work and meta-work
  10. Too many degrees of freedom
  11. Escaping the maze of data structuresPublished: May 17, 2025
  12. Three definitions of ExpressivityProgrammers use the term *expressivity* a lot. Unfortunately, there's not one right definition of the term. Instead, it's a loose term that is used in many different ways. Let's go over three ways I know that programmers use *expressivity*.Published: October 25, 2023

2024 2

  1. Java Generational Garbage CollectionThe JVM's garbage collector allows for Clojure's persistent data structures to be practical. It's one of the benefits of being a hosted language: you can take advantage of the millions of dollars invested into the JVM's development.Updated: August 14, 2018
  2. A Model of InterceptorsPublished: October 16, 2018

2023 6

  1. Review: All the Little Things, by Sandi MetzToday I'm reviewing a talk by Sandi Metz from RailsConf 2014 called _All the Little Things_.Published: October 14, 2023
  2. The Surprising Benefits of AutomationThe benefits of automation are not limited to saving time. We go over many advantages, some pitfalls to avoid, and some principles to follow.Published: August 6, 2019
  3. Review: Cost, Quality, and User Satisfaction of Software Products: An Empirical Analysis, by M. S. KrishnanToday I'm reviewing a paper from 1993 about software quality. The paper tries to relate quality to cost and to user satisfaction. Overall, it's a thumbs-up from me.Published: October 11, 2023
  4. Service upgrades and versioningWe have many options when choosing how we deal with unknown data in our services and their clients. Each choice has consequences, though none is the right choice for all situations. In this article, we address the options systematically.Published: July 7, 2023
  5. Growth and breakageFor the most freedom to change, prefer required arguments and optional return values.Published: May 11, 2023
  6. The User Wizard ScenarioWe start with a Haskell type that models a feature very well. As the feature changes, the data model eventually evolves into something like Clojure's hash maps. Discussion follows.Updated: October 24, 2023

2020 3

  1. Conveyor Belts: Nature's core.async ChannelsConveyor belts are strikingly similar to Clojure core.async channels. While it could be a coincidence, there is speculation that conveyor belts were influenced by a deep understanding of core.async.Updated: August 9, 2019
  2. How do Clojure Programmers Deal with Long Startup TimesClojure startup times suck. Let's just be honest. How do Clojure programmers live with that? Maybe that's the wrong way to think about it.Updated: April 25, 2018
  3. Programming Paradigms and the Procedural ParadoxI break down two perspectives (their features and their methodologies) for the three most common paradigms. I also explore why paradigms are so easy to argue about, and what we can do about it.Updated: August 21, 2018

2019 37

  1. Practice as soon as possibleMuch of the difficulty of learning a new language is caused by knowing more than you are comfortable doing. It's so important to get started practicing real programming as soon as possible.Published: March 11, 2016
  2. Reasoning About CodeFunctional programmers often use the term "reason about code". It's not very well defined generally, but I use it myself to refer to our ability to use our real-world intuition in our own code.Updated: August 9, 2018
  3. The Most Important Idea in Computer ScienceComputer Science has ideas that are important to the broader world. The most important is the Universal Turing Machine. From one perspective, Lisp embodies the idea at its core. To really understand how, I ask you to implement your own Lisp interpreter.Upda
  4. Solarized Cheat SheetSolarized is an awesome color scheme that I use all the time. I was tired of looking up the hex codes, so I made my own cheat sheet. You can download it.Updated: November 28, 2018
  5. Token Buckets with core.asyncToken Bucket is a simple algorithm for rate limiting a resource. It's easy to understand because you can reason about it in terms of real-world objects. core.async makes this algorithm very clear and easy.Updated: August 2, 2018
  6. What are macros?Macros are one of the most talked about features of Lisp. They are a powerful way to extend the language without modifying the compiler.Updated: August 17, 2018
  7. Object-Oriented Programming is the Dual of Functional ProgrammingObject-Oriented Programming is often shown in contrast to Functional Programming. But they are so exactly opposite that they are duals, and so equivalent in important ways. Which one to use should be left up to the programmer, as is do
  8. Is core.async Against the Clojure Philosophy?Clojure core.async is a way to manage mutable state. Isn't that against functional programming?Updated: August 7, 2019
  9. core.async in BrowsersJavascript's concurrency model forces code to give up control of when a callback will be called. `core.async` gives you back that control and hence lets you code in a more natural style.Updated: August 17, 2018
  10. Why does Clojure's conj add to the end of vectors but the beginning of lists?conj can be confusing if you're used to other languages. It is not a commonly defined operation. Most languages define common positional adding operations. conj, however, has more useful semantics. How do you use conj usefu
  11. How can more layers be more efficient?It's common that adding more layers of abstraction or indirection will make things slower. However, React and ClojureScript make web pages faster than doing it by hand — essentially programming the bare web. The lesson is that if you choose your layers well, the
  12. Avoid Naming at All CostsIf naming is one of the two hardest things in programming, it follows that every other possible solution (except those few involving cache invalidation) should be attempted before naming something. As a corollary, bad names are a code smell.Updated: June 7, 2018
  13. But the World is MutableThe world may be mutable, but people have been using the notion of immutability to build reliable systems for a long time.Updated: August 7, 2018
  14. What is Clojure?Clojure is a general purpose programming language designed for the fast-approaching future.Published: August 1, 2019
  15. Try Three Times in ClojureDistributed systems fail in indistinguishable ways. Often, retrying is a good solution to intermittent errors. We create a retry macro to handle the retries in a generic way.Published: August 1, 2019
  16. 4 Features Javascript can steal from Clojure(Script)ClojureScript adds a lot of value on top of the Javascript platform. But some of that value can be had directly in Javascript without using a new language.Published: August 1, 2019
  17. 3 Things Java Programmers Can Steal from ClojureMany of the cool parts of Clojure are written in Java. That means you can access those parts from any Java code. Just include the Clojure JAR, import the classes, and you've got better tools.Published: August 1, 2019
  18. Willy Wonka and the core.async GuidelinesThere are a few conventions in core.async that are not hard to use once you've learned them. But learning them without help can be tedious. This article presents three guidelines that will get you through the learning curve.Published: August 1, 2019
  19. Recommendations for Next-Level ClojureThere are many classics of functional programming that can help you take your thinking to the next level. My recommendations are for making you think in a new way.Published: August 1, 2019
  20. The 100 Most Used Clojure ExpressionsWould you like to optimize your learning of Clojure? Would you like to focus on learning only the most useful parts of the language first? Take this lesson from second language learning: learn the expressions in order of frequency of use.Published: July 31, 2019
  21. What is ClojureScript?ClojureScript is Clojure that compiles to JavaScript. It combines the power of Clojure with the reach of JavaScript.Published: July 31, 2019
  22. A reduce Example ExplainedA deep-dive into a single reduce example shows how much can happen in a short bit of code.Published: July 31, 2019
  23. Are there any DOM manipulation libraries in ClojureScript?ClojureScript has some nice DOM manipulation options, including jQuery and more idiomatic libraries.Published: July 31, 2019
  24. Some Annotated clojure.core/reduce Examplesreduce is a very useful function. You can use it for many calculations over a collection. Code annotations are useful, as are physical metaphors.Published: July 30, 2019
  25. React: Another Level of IndirectionReact provides a better abstraction over the DOM than MVC frameworks ever can. React is the last piece of the puzzle for ClojureScript web frontend development.Published: July 30, 2019
  26. SOLID Principles in ClojureThe SOLID principles are guidelines for writing good Object-Oriented code. It turns out that these principles are followed and embodied in Clojure.Published: July 30, 2019
  27. 4 models of software development as a factoryAgile software development came from borrowing processes and ideas from manufacturing. Is software engineering like factory work? I examine four metaphors of software engineering as a factory.Updated: May 8, 2024
  28. Data-First ProgrammingIf something is important, you should deal with it sooner and more often. That's the approach Clojure takes to data representations. It means serialization of internal data is a non-issue.Published: February 28, 2015
  29. The Idea of LispHow a programming language can be an idea.Updated: January 8, 2019
  30. The Bootstrapping MindsetOne of the great things about very robust and powerful abstractions is that they can give you tremendous leverage. The leverage can be so great that you can build something much greater than the sum of its parts. However, I worry that the web is an end to this kind of abstra
  31. What is an abstraction?We explore some of the background behind the meaning of the word abstraction and why we do it.Updated: August 15, 2018
  32. Problems with the JVMThe JVM is great but far from perfect. Here are some problems with the JVM that Clojure has to work around.Updated: October 16, 2024
  33. Moving Average in LodashWe write a clean, readable, functional implementation of Moving Average with Lodash.Updated: August 22, 2018
  34. LESS has Better Forms of Abstraction than CSSLESS has obviously better forms of abstraction and combination than CSS. It has recursive style definitions, which is enough to consider it a "powerful language".Published: February 13, 2014
  35. Clojure is a better Java than JavaHow is it possible that Clojure is better than Java at its own game? Hear me out, then decide for yourself.Updated: July 5, 2019
  36. Clojure vs. The Static Typing WorldRich Hickey explained the design choices behind Clojure and made many statements about static typing along the way. I share an interesting perspective and some stories from my time as a Haskell programmer. I conclude with a design challenge for the statically typed
  37. Building Composable Abstractions Rehearsal 3My third rehearsal for my upcoming Clojure/conj talk.Published: November 14, 2016

2018 68

  1. Use Task Analysis to Break a Skill Into StepsMany technical books skip very important skills you need to complete a task. To avoid skipping those skills, use task analysis to break a skill into steps.Published: March 8, 2015
  2. Clojure Error Messages are AccidentalI've recently shifted my thinking about Clojure error messages. It is more useful to think of them as non-existent than to think of them as bad. We end with the role Spec can play in improving error messages.Updated: January 8, 2019
  3. Data > Functions > Macros. But why?"Prefer data over functions" is a common adage in Clojure circles. It is poorly debated because it is a terse statement in generalities. A valuable perspective is that data is transparent at runtime, while functions are not. This perspective gives a firm ground for
  4. Pre-conj: Scheme WorkshopJason Hemann talks about the Scheme Workshop.Updated: August 7, 2018
  5. Tap Into Your Social BrainWe can solve social problems much more easily than logic problems, even when they are equivalent. Convert a logic problem into a social problem to make it easier to solve.Updated: August 9, 2018
  6. Osterhout's Dichotomy Isn'tPublished: February 8, 2012
  7. Programming Language ChecklistPublished: February 4, 2012
  8. Waving Our TentaclesPublished: December 9, 2011
  9. Why Re-frame instead of Om NextI had to choose between Re-frame and Om Next when building a course. Here are the reasons why.Updated: June 26, 2019
  10. Pre-conj Prep: Nathan Herzing and Chris SheaNathan Herzing and Chris Shea will talk about Pedestal, Om, Datomic, and core.async.Published: October 8, 2014
  11. Can I do FP in my language?We address the question directly, but then look deeper to the beliefs behind the question.Updated: August 7, 2018
  12. Clojure's Hosted LegacyClojure was designed as a hosted language. So what is Clojure, the language, if it relies on the features of a host? And what are the disadvantages of choosing the JVM as a host?Updated: March 1, 2019
  13. Clojure + RubyIf you're a Rubyist and you've heard some buzz about Clojure, these videos and links will be just for you. Rubyists teaching Clojure, Clojurists introducing Clojure to Ruby programmers, and Rubyists pontificating on Clojure.Updated: August 17, 2018
  14. Pre-conj Prep: Rich HickeyRich Hickey will talk about Transducers.Published: October 4, 2014
  15. Pre-conj Prep: Glenn VanderburgGlenn Vanderburg will talk about implementing the TeX algorithms in Clojure.Updated: August 17, 2018
  16. The Datomic Architecture and Data ModelPublished: September 21, 2012
  17. PDF version of Structure and Interpretation of Computer ProgramsPublished: July 27, 2012
  18. Escape from the Ivory TowerPublished: January 29, 2012
  19. apple == orangePublished: December 31, 2011
  20. The Coming War on General Purpose ComputationPublished: December 29, 2011
  21. Wrangling Clojure StacktracesClojure error messages and stacktraces are the number one most complained-about feature of Clojure. We look at some tips and resources for dealing with them.Updated: April 25, 2018
  22. Locks vs Concurrency PrimitivesMany people have asked me why Clojure has concurrency primitives. Aren't locks good enough? A humorous metaphor is elaborated.Updated: August 6, 2019
  23. How to Switch from the Imperative MindsetFunctional programming, from one perspective, is just a collection of habits that affect our programming. I've identified the cues for those habits and a routine for replacing imperative code with functional code.Updated: August 21, 2018
  24. 2 Features of Clojure Editors Professionals Won't Do WithoutProfessional Clojure programmers rely on certain features of their editors to help them program. When choosing an editor, it's important to pick one that has these two important features: REPL integration and structural editing.Published: N
  25. Let's TDD clojure.core/mapLearning to write map is a good lesson because it has recursion, list building, and higher order functions. It's everything that makes Lisp great.Updated: August 15, 2018
  26. Pre-conj Prep: Colin FlemingColin Fleming will talk about Cursive Clojure.Published: September 30, 2014
  27. Complex SyntaxLisps are revered for their simple syntax, but parens are complex. They complect function calls and macro calls, which have drastically different semantics.Updated: August 17, 2018
  28. ReificationReification means making an abstraction into a concrete value that can be manipulated at runtime. Reification is the core of what makes a language dynamic. Three types of reification in Clojure are discussed.Updated: August 7, 2019
  29. Stop Refactoring and Start FactoringRefactoring is focused on the quality of code, while factoring aims to uncover the underlying beauty of the problem domain, as expressed in code. Instead of cleaning up your code, try factoring.Updated: August 17, 2018
  30. Church vs Curry TypesStatic vs dynamic typing debates often flounder because the debators see from two different perspectives without knowing it. Learning to identify the two perspectives can calm the discussion. The tension between the two perspectives has led to Gradual Typing and other technologi
  31. What is Functional Programming?I prefer to define Functional Programming as making a distinction between pure and impure code. With this definition, you can program functionally in any language. What differentiates the functional languages is how much help they give you to make the distinction.Updat
  32. Separation of Presentation and ContentOne reason to separate style from content is to reuse HTML or CSS. Ultimately, we would like a solution where we can reuse both.Updated: March 14, 2019
  33. Hindley-Milner in ClojureI wrote a lambda-calculus interpreter and an implementation of Hindley-Milner to type check it.Published: January 14, 2014
  34. Making True/False Questions EasyPublished: September 22, 2013
  35. The Case Against Curly QuotesPublished: November 6, 2012
  36. The Impedance Mismatch is Our FaultUpdated: August 7, 2018
  37. Monads in PicturesPublished: August 23, 2012
  38. Why is a Monad Like a Writing Desk?Published: June 14, 2012
  39. When in doubt, refactor at the bottomWe explore when it is safe to extract out an abstraction and when you need to go deeper and rebuild it from scratch.Published: June 26, 2017
  40. Composable partsComposition is an important idea in programming, and Functional Programming brings it to the forefront. But what does it mean to say things are composable?Updated: August 15, 2018
  41. Global Mutable StateGlobal mutable state is one of the biggest drivers of complexity in software systems. We tackle a definition and how to reduce our reliance on it.Updated: August 17, 2018
  42. Annotated mapmap is one of the staples of functional programming. It's totally useful and also surprisingly simple. Let's look at some examples and annotated code.Published: July 30, 2015
  43. Douglas Crockford on JavascriptPublished: September 22, 2012
  44. Clojure 1.4 Reader Literals TestPublished: April 19, 2012
  45. Tricks for Java interopThere are several features of Java that generate weird classnames. We look at how to refer to them from Clojure.Updated: August 21, 2018
  46. Monads & GonadsPublished: February 22, 2013
  47. JVM JIT OptimizationsThe JVM JIT is a highly optimized compiler. I present some resources for learning what it does.Updated: April 25, 2018
  48. Master one skill at a timeResearch shows that developing mastery of a large skill is best done by mastering smaller skills that you can achieve 90% accuracy in very quickly. LispCast Introduction to Clojure has broken the skills you need down for you.Published: March 11, 2016
  49. Immutable PaperImmutable data appear to contradict our observations of the real world. Things in the world are mutable, so shouldn't our data be mutable, too? It may be counterintuitive, but immutable data does a better job of modeling many of our expectations of the real world.Updated: August 15, 2
  50. Knowing this one ClojureScript gotcha will save you hoursClojureScript optimizes names by replacing them with shorter ones. Usually, that's a good thing. But it can get carried away. Externs are how you help it know what's unsafe to optimize.Published: September 20, 2015
  51. CSS and the Lambda CalculusUsing LESS, we can almost achieve the expressive power of the Lambda Calculus as applied to styling. The expressive power is enough to create reusable styles applied to reusable HTML components.Updated: August 17, 2018
  52. Nil Punning (Or Null Pointers Considered Not So Bad)Null pointers are still a problem in Clojure, but several design decisions have made them less problematic than other languages.Updated: August 23, 2018
  53. Why technical explanation alone is not enoughPublished: September 10, 2013
  54. Tips for using marginaliaPublished: December 9, 2011
  55. 6 things Reacters do that Re-framers avoidDown on React? You should check it out from the ClojureScript perspective.Updated: June 19, 2019
  56. clojure.test cheatsheetI made a clojure.test cheatsheet that you can get for free.Published: May 4, 2015
  57. Elm FRP in Clojure core.asyncElm is an exciting FRP language. I implemented the FRP part in Clojure using core.async.Updated: October 6, 2020
  58. ClojureScript AnatomyUpdated: August 15, 2018
  59. I remember the time before monadsPublished: August 18, 2012
  60. Extreme Cleverness: Functional Data Structures in ScalaUpdated: August 21, 2018
  61. Why Functional Programming?There are many reasons to learn Functional Programming. I go over my 11 favorite reasons. Reason #1 is it's fun!Updated: July 1, 2019
  62. Pre-Conj Interview: Colin FlemingColin Fleming interview about Cursive Clojure.Updated: August 22, 2018
  63. 13 hours of LispMy personal notes from the Lisp50 event at OOPSLA 2008.Published: October 21, 2008
  64. Mastering ClojureScript Routing with Secretary and goog.HistoryThe Google Closure Library provides a nice interface to the HTML5 History API. Coupling it with Secretary is very easy. But not all browsers support HTML5 History. In this post I'll talk about one way to make sure you have client-side ro
  65. Clojure's unsung heroics with concurrencyPeople know about the immutable data structures and the STM. But there's something going on at a much deeper level that is really hard to get right in Java. It has to do with the optimizations the JIT will run on your code.Updated: August 9, 2018
  66. JVM Deployment OptionsWhen you're working at a company, you usually inherit their deployment system. And that's great because then you just do what they do. But what if you are on your own? What are the options for deploying a Clojure server?Updated: June 15, 2020
  67. Why Clojure starts up slowly — is it really the JVM?One of the most common complaints about the JVM is the long startup time. But what is really taking so long? We analyze some commands to find out.Updated: June 26, 2019
  68. Concurrency and Parallelism in the Real WorldConcurrency and parallelism are concepts that we make use of every day off of the computer. I give some real world examples and we analyze them for concurrency and parallelism.Updated: August 9, 2018

2017 4

  1. What should a Clojure framework look like?After exploring why frameworks and why not frameworks, I dive into the design priorities I think a web framework should have.Published: June 22, 2017
  2. The arguments against web frameworksWe explore three arguments against frameworks, address them, then turn them into challenges to be overcome.Published: June 20, 2017
  3. Why do we use Web Frameworks?While contemplating a Clojure web framework, I explore the reasons we use web frameworks in general. I conclude that the framework should support a learnable development process.Published: June 19, 2017
  4. Should Cognitect do More for Clojure?Poor open-source development practices, neglect for the beginner experience, and lack of communication have come up as complaints against how Cognitect stewards Clojure. I address the complaints with a plea that we do more as a community.Updated: August 2, 2018

2016 6

  1. Two rehearsals for my Clojure/conj talkMy upcoming Clojure/conj talk is fast approaching. I recorded two rehearsals in two days. Watch them!Published: November 7, 2016
  2. New Orleans Clojure Workshop RetrospectiveWe organized a Clojure workshop. Here's what went right and what we should do next time.Published: October 24, 2016
  3. Functional JavaScriptMany of us have to use JavaScript. But does that mean we can't use functional programming? Sure, with discipline. But can we make it even easier?Updated: April 9, 2018
  4. What my daughter's blocks teach us about learningMy daughter's blocks taught her to match shapes with a lot of fast feedback. Fast feedback is a powerful tool to learn any skill. I analyze how the blocks helped my daughter learn and compare it to learning Clojure.Updated: August 9, 2019
  5. The Importance of Embodied MetaphorsLispCast Introduction to Clojure teaches Clojure with an "interactive bakery simulation". The reason is that metaphors that you can embody are a great way to learn abstract things like programming.Published: March 5, 2016
  6. Why I start teaching Clojure with Imperative ProgrammingLispCast Introduction to Clojure starts with 30 minutes of imperative programming. We write programs for their effects, so imperative is a great place to start.Updated: August 7, 2019

2015 19

  1. clj-refactor cheatsheetsI've made some cheatsheets to help me learn clj-refactor, some Emacs software that helps you make systematic changes to code.Published: October 29, 2015
  2. What is React?React is a view library for web pages that makes DOM rendering in a functional style really easy. React makes web programming fun again.Updated: August 9, 2018
  3. Will having ClojureScript, yet another asset type, slow down my deploys?ClojureScript builds can take a long time. But the extra time is worth it. It reduces the download size significantly.Updated: August 9, 2019
  4. Reduce Complexity with VariantsThe structure of our data should match the relevant structures in the real world. And to ensure that our data is structured well, we should reduce the potential for incorrect structure. Variants provide a great solution for it.Updated: August 6, 2019
  5. Lambda AbstractionLambda abstractions are always leaky, but some are leakier than others. Clojure programmers recommend keeping most of your functions pure and containing the leaks as much as possible.Updated: August 6, 2019
  6. Pre-West Prep: Zachary KimZachary Kim will talk about mobile development in Clojure.Published: April 10, 2015
  7. Pre-West Prep: Sean JohnsonSean Johnson will talk about pattern matching.Published: April 7, 2015
  8. Pre-West Prep: Soren MacbethSoren Macbeth will talk about data crunching in Clojure.Published: April 7, 2015
  9. Pre-West Prep: Timothy Gardner and Ramsey NasserTimothy Gardner and Ramsey Nasser will talk about Arcadia.Published: April 7, 2015
  10. Pre-West Prep: Dan Lidral-PorterDan Lidral-Porter will talk about computer-generated art in Clojure.Published: March 22, 2015
  11. Pre-West Prep: Boris KourtoukovBoris Kourtoukov will talk about Clojure and wearables.Published: March 19, 2015
  12. Pre-West Prep 2015Prepare for Clojure/West with media from around the web and interviews.Published: March 18, 2015
  13. Exponential BackoffA common failure in distributed systems is a server with a rate limit or with no limit but begins failing due to load. A standard solution is to retry after waiting a small time, increasing that time after each failure. We create a macro to handle this waiting and retrying.Publish
  14. How to avoid "Makes sense if you already understand it."Most technical writing is obtuse unless you already know the topic. Focus on the learner and their skills and it will clarify your writing.Published: March 14, 2015
  15. Object-Oriented Dispatch is the Dual of Functional DispatchObject-oriented dispatch is contrasted with functional dispatch, but they are shown to be two one-dimensional projections of the same two-dimensional data. Clojure does not provide the two-dimensional representation, but does interesting thi
  16. The Paper MetaphorFunctional programs follow a simple rule: never write on the same paper twice. Imperative programs are free to define their own rules. Both have interesting consequences.Updated: July 26, 2019
  17. PurelyFunctional.tv Early Access ProgramThe PurelyFunctional.tv Early Access Program is a way to make courses in a more iterative and interactive way. I'll be publishing Intro to clojure.test this week under PEAP.Published: February 26, 2015
  18. New Course FormatLispCast video courses have a new, interactive format. It's easier for me to make courses (read: more, faster) and it's a better experience for learners.Published: February 21, 2015
  19. The Parts of RingRing, the Clojure Web library, defines three main concepts that you use to construct web applications.Updated: August 7, 2019

2014 9

  1. The Content of Your CodeCode style is important, but way less important than content. Yet everyone talks about style because it's easier. Let's talk about content.Updated: August 21, 2018
  2. Pre-conj Prep: Jeanine AdkissonJeanine Adkisson will give a talk about Variants in Clojure at the Clojure/conj 2014.Updated: August 21, 2018
  3. Pre-conj Prep: Brian GoetzBrian Goetz will give the keynote at Clojure/conj.Published: September 29, 2014
  4. Pre-conj Prep 2014Prepare for the Clojure/conj with media from around the web.Published: September 21, 2014
  5. Just Hack Something TogetherLisp is viewed as difficult and academic but it is a great language for hacking a solution together.Published: September 5, 2014
  6. Two Kinds of BootstrappingI like languages with a small core that is extensible. The languages tend to be weird and require less code to bootstrap.Published: August 24, 2014
  7. Clojure is ImperativeClojure is an imperative language. Its operations are defined in terms of concrete actions. But those actions are often the same actions available to the programmer at runtime. This makes it easy to bootstrap.Updated: August 17, 2018
  8. CSS has Weak Forms of Abstraction and CombinationAccording to the requirements proposed by Abelson and Sussman, CSS does not provide adequate means of combination and abstraction to be considered a powerful language.Updated: August 17, 2018
  9. Deconstructing Functional ProgrammingPublished: December 23, 2013

2013 9

  1. On Type UnityLanguages with strong, dynamic types (like Scheme) are actually single-typed languages, not untyped languages. Some would say this is restrictive, but this unity of type is a source of their strength.Published: November 3, 2013
  2. Lisp with Macros is Two LanguagesLisp with macros can be seen as two languages, each with different semantics. The base language can be interpreted directly, whereas the result of interpreting the macro language is to produce a new program in the base language.Updated: August 17, 2018
  3. Use Your ImaginationYou can transfer the outline of a skill by guiding someone through a structured use of their imagination.Updated: August 9, 2018
  4. Clojure Web SecurityUse the OWASP Top Ten Project to minimize security vulnerabilities in your Clojure web application.Published: July 30, 2013
  5. Functors, Applicatives, And Monads In PicturesPublished: May 23, 2013
  6. Monads and ObjectsUpdated: August 13, 2018
  7. Redline SmalltalkPublished: February 22, 2013
  8. Clojure ScreencastsPublished: February 13, 2013
  9. Separation, Abstraction, and Cascading in CSSLESS and Sass (and similar solutions) have saved CSS for three reasons: separation, abstraction, and cascading. While I welcome them, CSS still has other problems which I believe can be solved.Updated: August 17, 2018

2012 38

  1. Google Common Lisp Style GuidePublished: October 12, 2012
  2. Static vs. Dynamic TypingUpdated: August 17, 2018
  3. On the configurations of data and functionsUpdated: August 21, 2018
  4. Class AbstractSingletonProxyFactoryBeanPublished: September 21, 2012
  5. The DCI Architecture: Lean and Agile at the Code LevelPublished: September 21, 2012
  6. Deferring Type Errors to RuntimePublished: September 8, 2012
  7. LiberatorPublished: September 7, 2012
  8. WatPublished: September 7, 2012
  9. Why should I have written ZeroMQ in C, not C++ (part II)Updated: August 17, 2018
  10. Faith, Evolution, and Programming LanguagesPublished: August 22, 2012
  11. Dynamic Languages Wizards Series - Panel on Language DesignPublished: August 21, 2012
  12. Introducing playniceUpdated: August 7, 2018
  13. How The JVM Spec Came To BePublished: August 18, 2012
  14. JSON and Algebraic Data TypesPublished: August 17, 2012
  15. Notes from the Mystery Machine BusUpdated: August 7, 2018
  16. Knockbox, an Eventual Consistency ToolkitPublished: July 25, 2012
  17. Your Coding Philosophies are IrrelevantPublished: June 16, 2012
  18. How to answer a question: a simple systemPublished: June 16, 2012
  19. Programming Languages and Piaget's Stages of Cognitive DevelopmentUpdated: August 17, 2018
  20. The future is specificPublished: May 23, 2012
  21. An Interview with Game Developer James HaguePublished: May 12, 2012
  22. Simplicity Matters by Rich HickeyPublished: May 4, 2012
  23. Yahoo!'s Doug Crockford on JavascriptPublished: April 28, 2012
  24. cljs-bindingPublished: April 27, 2012
  25. How to Write Clean, Testable CodePublished: April 25, 2012
  26. Javascript to ClojurescriptPublished: April 25, 2012
  27. Google Python Style GuidePublished: April 24, 2012
  28. Review: Clojure Programming by Chas Emerick, Brian Carper, and Cristophe GrandPublished: April 23, 2012
  29. (take 5 daniel-spiewak)Updated: August 15, 2018
  30. ThinkRelevance: The Podcast - Episode 009 - Alan DipertPublished: April 17, 2012
  31. NeXT, OpenStep, and the Return of Steve Jobs to ApplePublished: April 3, 2012
  32. Rich Hickey: KeynotePublished: March 17, 2012
  33. Introduction to Logic Programming with ClojurePublished: February 10, 2012
  34. Programming Paradigms and Expressive PowerUpdated: August 23, 2018
  35. Why Ruby?Published: February 8, 2012
  36. Indirection Mechanisms and Expressive PowerUpdated: August 23, 2018
  37. Modern Language WishlistUpdated: August 21, 2018
  38. Parser Combinators: How to Parse (nearly) AnythingUpdated: August 21, 2018

2011 11

  1. Programming and ScalingPublished: December 31, 2011
  2. The future of programmingUpdated: August 21, 2018
  3. multimethod.jsPublished: December 17, 2011
  4. Ring 1.0.0 ReleasedPublished: December 14, 2011
  5. A Short Ballad Dedicated to the Growth of ProgramsPublished: December 11, 2011
  6. Clojure for dummies: a kataPublished: December 11, 2011
  7. The Heart of UnixUpdated: August 23, 2018
  8. Clojure/WestPublished: December 9, 2011
  9. Seesaw REPL TutorialPublished: December 9, 2011
  10. Janki MethodUpdated: August 9, 2018
  11. How to Write SoftwareWriting software alone and in a long term sustainable manner requires a lot of discipline. Upfront planning and avoidance of feature creep can turn a stressful project into a pleasure.Updated: June 25, 2018