41554 blogs · [ { "id": "01a0e6d7-002e-7389-a514-143626eea6a9", "title": "LLM-Complete: The next 700 programming languages", "url": "https://chrisdone.com/posts/llm-complete", "published_at": "2026-09-26T23:00:00+00:00" }, { "id": "01a0875f-2948-70f4-9573-fa894a41a85c", "title": "Lisp compilers that compile directly to assembly", "url": "https://chrisdone.com/posts/lisp-compilers", "published_at": "2026-07-18T23:00:00+00:00" }, { "id": "01a0875f-2948-70f4-9573-fa894aa0e824", "title": "Talks", "url": "https://chrisdone.com/posts/talks", "published_at": "2026-06-18T23:00:00+00:00" }, { "id": "01a0875f-2948-70f4-9573-fa894b530240", "title": "Meta", "url": "https://chrisdone.com/posts/meta", "published_at": "2026-06-12T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd91bb28ce", "title": "Blogs", "url": "https://chrisdone.com/posts/blogs", "published_at": "2026-06-08T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9280cf8e", "title": "System Colic", "url": "https://chrisdone.com/posts/system-colic", "published_at": "2026-05-27T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd935a702a", "title": "Home fibre", "url": "https://chrisdone.com/posts/home-fibre", "published_at": "2026-05-16T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd93924e29", "title": "Some updates about Hell in 2026", "url": "https://chrisdone.com/posts/hell-year-in-review-2026", "published_at": "2026-04-22T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9426286e", "title": "Proposal to extend JSON with sum types (variants)", "url": "https://chrisdone.com/posts/json-with-sum-types", "published_at": "2026-02-02T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd944bd8a2", "title": "Laws", "url": "https://chrisdone.com/posts/laws", "published_at": "2025-09-22T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd94a43e7a", "title": "Argumentum ad colossum", "url": "https://chrisdone.com/posts/argumentum-ad-colossum", "published_at": "2025-09-13T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd94aeebfb", "title": "Applicative-wired monad pattern", "url": "https://chrisdone.com/posts/applicative-wired-monad", "published_at": "2025-07-10T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9515c0a9", "title": "My blog now runs on a Raspberry Pi at home", "url": "https://chrisdone.com/posts/pi-blog", "published_at": "2025-05-08T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd951688c1", "title": "LLMs", "url": "https://chrisdone.com/posts/llms", "published_at": "2025-04-17T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd95ea8295", "title": "The LLM Curse", "url": "https://chrisdone.com/posts/the-llm-curse", "published_at": "2025-04-11T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd96265771", "title": "Less-Than Estimation", "url": "https://chrisdone.com/posts/less-than-estimation", "published_at": "2025-02-04T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9658376a", "title": "Registers of code authoring", "url": "https://chrisdone.com/posts/code-register", "published_at": "2025-02-01T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd96de0b34", "title": "Hell (Haskell shell): Year in Review", "url": "https://chrisdone.com/posts/hell-year-in-review-2025", "published_at": "2025-01-12T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd97929f5d", "title": "Adding sum types (variants) to Hell", "url": "https://chrisdone.com/posts/variants", "published_at": "2024-11-23T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd97a86ed0", "title": "A modest critique of Htmx", "url": "https://chrisdone.com/posts/htmx-critique", "published_at": "2024-08-19T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd97ab43a1", "title": "Naming sum types is often hard", "url": "https://chrisdone.com/posts/naming-is-hard", "published_at": "2024-07-08T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd985f5d7a", "title": "Portals in Emacs", "url": "https://chrisdone.com/posts/portals", "published_at": "2024-06-16T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd986c75cd", "title": "All my projects (2008-2023)", "url": "https://chrisdone.com/posts/projects", "published_at": "2024-05-11T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd991cc999", "title": "Halogen is better than React at everything", "url": "https://chrisdone.com/posts/halogen-is-better-than-react", "published_at": "2024-02-23T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9a1564e2", "title": "Reports of RSS/Atom's death are greatly exaggerated", "url": "https://chrisdone.com/posts/death-of-rss-greatly-exaggerated", "published_at": "2024-02-16T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9a2d8a7f", "title": "Hell: Shell scripting Haskell dialect", "url": "https://chrisdone.com/posts/hell", "published_at": "2023-12-26T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9b04f256", "title": "A spectrum of web dev abstraction", "url": "https://chrisdone.com/posts/spectrum-web-dev-htmx-react", "published_at": "2023-10-03T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9bedb03c", "title": "Codebases and love", "url": "https://chrisdone.com/posts/codebases-and-love", "published_at": "2023-10-03T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9c5dc276", "title": "AI and Machine Thinking", "url": "https://chrisdone.com/posts/ai-machine-thinking", "published_at": "2023-09-22T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9d39b26f", "title": "Pickling: The really obvious missing feature of all web browsers", "url": "https://chrisdone.com/posts/browser-pickling", "published_at": "2023-09-06T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9d4c9618", "title": "Tamagotchi tooling", "url": "https://chrisdone.com/posts/tamagotchi-tooling", "published_at": "2023-08-03T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9df43760", "title": "Reasoning violently", "url": "https://chrisdone.com/posts/reasoning-violently", "published_at": "2023-08-03T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9ee72341", "title": "Three questions of language design", "url": "https://chrisdone.com/posts/three-questions-of-lang-design", "published_at": "2023-01-07T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9fa66793", "title": "Things I've changed my mind about", "url": "https://chrisdone.com/posts/things-ive-changed-my-mind-on", "published_at": "2022-12-20T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dd9fc30ec5", "title": "Inflex", "url": "https://chrisdone.com/posts/inflex", "published_at": "2022-10-20T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda036950d", "title": "Immutable Publishing Policy", "url": "https://chrisdone.com/posts/ipp", "published_at": "2022-02-11T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda097607e", "title": "A plain English description of monads without Haskell code", "url": "https://chrisdone.com/posts/monads", "published_at": "2022-01-31T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda12f2f85", "title": "Thoughts on type class implementation", "url": "https://chrisdone.com/posts/typeclass-implementation", "published_at": "2022-01-09T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda17bb944", "title": "My negative views on Rust", "url": "https://chrisdone.com/posts/rust", "published_at": "2021-12-22T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda1af5f1d", "title": "Inflex Bibliography", "url": "https://chrisdone.com/posts/inflex-bibliography", "published_at": "2021-09-07T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda1f28bff", "title": "The Movement Principle", "url": "https://chrisdone.com/posts/the-movement-principle", "published_at": "2021-04-09T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda2c02baa", "title": "What's wrong with ImplicitParams", "url": "https://chrisdone.com/posts/whats-wrong-with-implicitparams", "published_at": "2021-03-20T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda2d45a48", "title": "How exactly ExceptT differs to EarlyDo", "url": "https://chrisdone.com/posts/exceptt-vs-early-do", "published_at": "2021-01-05T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda2ddec8c", "title": "Haskell doesn't have macros", "url": "https://chrisdone.com/posts/haskell-doesnt-have-macros", "published_at": "2020-12-29T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda33eb71d", "title": "Is it Try.do that is dangerous?", "url": "https://chrisdone.com/posts/is-try-do-dangerous", "published_at": "2020-12-24T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda435b2b1", "title": "Try.do for recoverable errors in Haskell", "url": "https://chrisdone.com/posts/try-do", "published_at": "2020-12-21T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda43aee54", "title": "Recoverable errors in Haskell", "url": "https://chrisdone.com/posts/recoverable-errors-in-haskell", "published_at": "2020-12-21T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda4c30b16", "title": "Use import aliases to easily access fields", "url": "https://chrisdone.com/posts/import-aliases-field-names", "published_at": "2020-12-15T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda52dacad", "title": "The language of spreadsheets is bad", "url": "https://chrisdone.com/posts/language-of-spreadsheets-is-bad", "published_at": "2020-11-13T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda5f2650f", "title": "What’s wrong with the grid?", "url": "https://chrisdone.com/posts/whats-wrong-with-the-grid", "published_at": "2020-11-12T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda6383423", "title": "Ghosts of Departed Proofs Convenience", "url": "https://chrisdone.com/posts/ghost-of-departed-proofs-conveniences", "published_at": "2019-12-07T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda6c67245", "title": "Defaulting fields in a record", "url": "https://chrisdone.com/posts/defaulting-fields-in-a-record", "published_at": "2019-12-07T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda7551744", "title": "Statically Checked Overloaded Strings", "url": "https://chrisdone.com/posts/statically-checked-overloaded-strings", "published_at": "2019-11-13T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda819cc42", "title": "Static Smart Constructors with Double Splices", "url": "https://chrisdone.com/posts/static-smart-constructors", "published_at": "2019-08-21T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda8489e92", "title": "Client-side web programming in Haskell: A retrospective", "url": "https://chrisdone.com/posts/clientside-programming-haskell", "published_at": "2019-07-24T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda8d262c5", "title": "German Naming Convention", "url": "https://chrisdone.com/posts/german-naming-convention", "published_at": "2019-06-06T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda93fb96e", "title": "Dynamically typed Haskell", "url": "https://chrisdone.com/posts/dynamically-typed-haskell", "published_at": "2019-04-05T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1dda9d24bb6", "title": "Web engines in Haskell", "url": "https://chrisdone.com/posts/web-engines", "published_at": "2019-04-04T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddaa44c6cb", "title": "Lazy list length", "url": "https://chrisdone.com/posts/lazy-list-length", "published_at": "2018-08-22T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddaa5667e7", "title": "Type inequality operator", "url": "https://chrisdone.com/posts/type-inequality-operator", "published_at": "2018-06-18T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddaa573990", "title": "Fast Haskell: Competing with C at parsing XML", "url": "https://chrisdone.com/posts/fast-haskell-c-parsing-xml", "published_at": "2017-01-11T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddaab2e1c5", "title": "hindent 5: One style to rule them all", "url": "https://chrisdone.com/posts/hindent-5", "published_at": "2016-08-28T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddaae5f385", "title": "A philosophical difference between Haskell and Lisp", "url": "https://chrisdone.com/posts/haskell-lisp-philosophy-difference", "published_at": "2015-12-19T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddab175526", "title": "Use the REPL, Luke", "url": "https://chrisdone.com/posts/haskell-repl", "published_at": "2015-07-14T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddabfd69f8", "title": "The path package", "url": "https://chrisdone.com/posts/path-package", "published_at": "2015-06-26T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddac3cb21f", "title": "Existentials and the heterogenous list fallacy", "url": "https://chrisdone.com/posts/existentials", "published_at": "2015-06-20T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddad16804c", "title": "The constraint trick for instances", "url": "https://chrisdone.com/posts/haskell-constraint-trick", "published_at": "2015-06-18T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddadbf2a2c", "title": "Stream fusion and composability (Java 8 and Haskell) for newbies", "url": "https://chrisdone.com/posts/stream-composability", "published_at": "2015-06-10T23:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddaebdca00", "title": "My Haskell tooling wishlist", "url": "https://chrisdone.com/posts/haskell-wishlist", "published_at": "2015-01-24T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddaf0124e1", "title": "Measuring duration in Haskell", "url": "https://chrisdone.com/posts/measuring-duration-in-haskell", "published_at": "2015-01-05T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddaf80fc66", "title": "Lucid 2.0: clearer than before", "url": "https://chrisdone.com/posts/lucid2", "published_at": "2014-11-20T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddb04a5486", "title": "Lucid: templating DSL for HTML", "url": "https://chrisdone.com/posts/lucid", "published_at": "2014-11-20T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddb102eac9", "title": "Fast pagination on PostgreSQL", "url": "https://chrisdone.com/posts/postgresql-pagination", "published_at": "2014-10-28T00:00:00+00:00" }, { "id": "01a0875f-2949-70d2-9d39-d1ddb165241f", "title": "shell-conduit: Write shell scripts in Haskell with Conduit", "url": "https://chrisdone.com/posts/shell-conduit", "published_at": "2014-09-20T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc547ae531", "title": "hindent: A Haskell indenter", "url": "https://chrisdone.com/posts/hindent", "published_at": "2014-09-19T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc54a51124", "title": "Formatting in Haskell", "url": "https://chrisdone.com/posts/formatting", "published_at": "2014-09-19T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5564dc4f", "title": "Teaching: A good (and bad) example", "url": "https://chrisdone.com/posts/teaching", "published_at": "2014-07-18T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc55ca0634", "title": "An alternative Haskell home page", "url": "https://chrisdone.com/posts/haskell-lang", "published_at": "2014-05-28T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5655154a", "title": "Presentations update", "url": "https://chrisdone.com/posts/presentations-update", "published_at": "2014-04-29T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5751cefc", "title": "The Identity monad trick", "url": "https://chrisdone.com/posts/identity-monad", "published_at": "2014-04-28T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc579b6c36", "title": "The printer Haskell deserves", "url": "https://chrisdone.com/posts/the-printer-haskell-deserves", "published_at": "2014-04-25T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc57f5f614", "title": "Typeable and Data in Haskell", "url": "https://chrisdone.com/posts/data-typeable", "published_at": "2014-04-21T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc57fdc939", "title": "Haskell structured diffs", "url": "https://chrisdone.com/posts/haskell-diff", "published_at": "2014-03-31T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc58362146", "title": "Reloading running code in GHCi", "url": "https://chrisdone.com/posts/ghci-reload", "published_at": "2014-03-16T00:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc58f289f6", "title": "Attempto Controlled English", "url": "https://chrisdone.com/posts/attempto-controlled-english", "published_at": "2014-02-24T00:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc590fb6b3", "title": "Emacs, Notmuch and Offlineimap", "url": "https://chrisdone.com/posts/emacs-mail", "published_at": "2014-02-08T00:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc59a6e208", "title": "Pure IO monad and Try Haskell", "url": "https://chrisdone.com/posts/pure-io-tryhaskell", "published_at": "2014-01-12T00:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5a147139", "title": "Dijkstra on Haskell and Java", "url": "https://chrisdone.com/posts/dijkstra-haskell-java", "published_at": "2014-01-08T00:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5a1741de", "title": "Emacs users are like Terry Pratchett’s Igors", "url": "https://chrisdone.com/posts/emacs-users-are-like-igor", "published_at": "2013-12-25T00:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5a7e1773", "title": "structured-haskell-mode", "url": "https://chrisdone.com/posts/structured-haskell-mode", "published_at": "2013-12-09T00:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5ab69d84", "title": "Recording simple GIFs for demos", "url": "https://chrisdone.com/posts/recording-small-gifs", "published_at": "2013-12-09T00:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5b6a2bef", "title": "Making GHCi scale better and faster", "url": "https://chrisdone.com/posts/making-ghci-fast", "published_at": "2013-11-20T00:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5bcbabe8", "title": "Twitter waterflow problem and loeb", "url": "https://chrisdone.com/posts/twitter-problem-loeb", "published_at": "2013-11-14T00:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5c623b45", "title": "God-mode for Emacs", "url": "https://chrisdone.com/posts/god-mode", "published_at": "2013-09-20T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5ca9f3fa", "title": "Functional Programming is Hard?", "url": "https://chrisdone.com/posts/functional-programming-is-hard", "published_at": "2013-09-20T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5d8e9332", "title": "CamelCase vs under_scores vs hyphenated-words", "url": "https://chrisdone.com/posts/camelcase-vs-underscores-vs-hyphens", "published_at": "2013-08-29T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5e3991a3", "title": "Analysis of Emacs keys pressed", "url": "https://chrisdone.com/posts/emacs-key-analysis", "published_at": "2013-08-06T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5f1e5db4", "title": "Haskell News", "url": "https://chrisdone.com/posts/haskell-news", "published_at": "2013-07-25T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc5fa84e9a", "title": "IRC Browse", "url": "https://chrisdone.com/posts/ircbrowse", "published_at": "2013-07-22T23:00:00+00:00" }, { "id": "01a0875f-294a-73c0-9966-4efc6010bd1b", "title": "Fay, JavaScript, etc.", "url": "https://chrisdone.com/posts/fay", "published_at": "2012-09-14T23:00:00+00:00" } ] posts Claim your blog
Back to Chris Done's Homepage
Blog · corpus.blog/blogs/chrisdone.com/posts

Chris Done's Homepage

chrisdone.com

2026

12 Jun 2026

2025

22 Sept 2025
17 Apr 2025

2024

2023

2022

2021

2020

2019

2018

2017

2016

2015

2014

2013

2012