Ambrose Bonnaire-Sergeant


Cisco Senior Clojure Developer (working on SecureX, CTR)

Untypable LLC Owner (working on Typed Clojure)

Email: my first name at my website

Twitter: @ambrosebs

GitHub: frenchy64




2024-04-01: I received a $9k grant to work on compojure-api

2024-03-13: I am serving on the committee for European Lisp Symposium 2024.

2024-03-06: I have a new talk on Clojure specs.

Open Source Activity

April 2024: A library to run Clojure Criterium benchmarks from other JVM languages

April 2024: $9k grant to work on compojure-api

March 2024: Malli: Document vector schemas, Enforce entry specs in open map destructurings, Fix (explain :tuple []), Choose non-null base for swagger, Fix :repeat infinite loops by bailing early, Use :orn instead of :altn for map destructuring.

Feb 2024: CLJ-2552: Fix example code and improve recur description in reify docstring

Dec 2023: I am now maintainer of compojure-api and ring-swagger (added auto-deploying builds 1, 2, 3)

Dec 2023: Fix memory leaks in ring-swagger

Dec 2023: Identified 3x build speedup and 6x performance improvement for some routes in production Clojure application (Eval routes and options given to context at initialization time)

Nov 2023: activity (Fix not-before?, not-after?, Preserve transitivity when comparing instants to intervals)

Nov 2023: GitHub Actions-style matrix build for sourcehut builds using babashka (~ambrosebs/hut-matrix)

Nov 2023: Malli activity (Document :or vs :union vs :merge)

Aug 2023: activity (Use *clock* in ZoneId coersions)

March 2023: reagui/imgui activity (fix bad call in reaimgui demo, typos 1 2 3)

March 2023: Fennel activity (fix scoping bug, support bit ops in Antifennel, flatten associative ops in Antifennel, report bad error message, propose macros shadow locals, cljlib helloworld)

Feb 2023: Fix RSS feed of

Jan 2023: Kaocha: Gracefully handle circular dependencies in watch mode

Jan 2023: Clojure: Directly linked protocols (failed experiment)

Oct 2022: Clojure improvements around rest-arities: CLJ-2730 (theoretical restfn error msg with 21+ required arity), CLJ-2728 (Collections, symbols, fixed-arg fns called with 22+ args report bad arity exception), CLJ-2729 (improve defmulti memory usage with 21+ args), Clojure: proof-of-concept improve infinite-args handling for fn's, defmulti, vars, colls

Oct 2022: Schema: proof-of-concept s/defmulti

Sept 2022: Misc Clojure fixes: CLJ-2725 (fix bound-fn usage in Clojure tests), CLJ-2708 (fix SOE in pprint), CLJ-2705 (improve diff perf), CLJ-2714 (improve arglists for defrecord ctor), CLJ-2710 (improve arity error messages for vectors), CLJ-2699 (deprecate fns using java.lang.Thread/stop), CLJ-2693 (document sorted sets require comparable keys), CLJ-2322 (add juxt zero-arity, alternative impl)

Aug 2022: Malli: map recursive schemas to recursive generators

Aug 2022: schema: Sketch for polymorphic fn schemas

June 2022: Added as maintainer

June 2022: Support schema in Babashka

March 2022: Promesa: Fix CI

April 2022: Fix malli bug caught by Typed Clojure

March 2022: Dependabot + Clojure tutorial (Leiningen, Clojure CLI, real usage in production app)

Feb 2022: Clojure 1.11 Contribution Merged (CLJ-1973: sort proxy methods for reproducibility)

Feb 2022: Q1 2022 Clojurists Together $1k Grant (Update 1, Update 2)

Dec 2021: Added as Plumatic Schema maintainer

Nov 2021: vim-fireplace: Refresh :Last on error

Nov 2021: schema: Proposed s/defprotocol wrapper

Nov 2021: schema: Fix s/fn performance issues in Clojure

Nov 2021: schema: Migrate from cljx to cljc

Oct 2021: spec: Reviewed code for keys* enhancement

Sept 2021: clojure: Proposed fix for satisfies? to support defprotocol + :extend-via-metadata

Sept 2021: clojure: Proposed fix for memory leak involving futures + dynamic binding

Sept 2021: clojure: Proposed fix for defprotocol extensions being lost

Sept 2021: clojure: Proposed fix for defprotocol dispatch non-determinism

Sept-Oct 2021: fully-satisfies---A library with many enhancements/fixes to core Clojure bugs

Sept 2021: Q3 2021 Clojurists Together $1k Grant (Update 1, Update 2)

July 2021: test.chuck: Fix CI, support `times` in CLJS

July 2021: plumbing: Fix Plumatic plumbing to handle large graphs

May 2021: conduit: A bunch of fixes to a re-frame tutorial

May 2021: cljfx: Example of Clojure desktop app with splash screen

April 2021: Support before?/after? mixing Instants and Intervals

March 2021: test.chuck: Support `testing` inside `checking`

Dec 2020: Leiningen bugfix: Fix `lein test` false-negative exit code (also fix same bug in eftest, circleci.test)

[Commercial] Oct 2020: Auto-balance CI for large Cisco Clojure production app (Aug 2022 update: runs 2h of tests in 15-20 minutes with 10 splits, each split 9-13 minutes)

[Commercial] July-Oct 2020: Move large Cisco production app to services architecture (planning PR, no downtime)

Dec 2020: Leiningen bugfix: Fix `lein test` loading order (also fix same bug in eftest, circleci.test)

July 2020: clj-http: Fix performance regression

March 2020: lein-monolith: Significantly improve dependency cycle error message

Feb 2020: kaocha: Cannot set dynamic variables in --watch mode

Feb 2020: Fork core.typed to typedclojure and discontinue core.typed

Jan 2020: schema-tools: Fix {required,optional}-keys regression

July 2019: cljfx: (2) Fix subtle bug in state management

July 2019: cljfx: (1) Fix subtle bug in state management

July 2019: cljfx: Support JavaFX Transitions (with tutorial + gif)

July 2019: cljfx: allow descriptions in some :selected-item lifecycles

July 2019: cljfx: Support declarative event filters

2017-2018: Change ClojureScript's AST to tools.analyzer format

May 2015: reply: Fix bad *ns* rebinding

Aug 2014: Clojure 1.7 Contribution Merged (CLJ-1251: The clojure.core/update function)

March 2014: Contributed 4 tutorials to Clojure Cookbook (O'Reilly)

2014-2016: dynalint---A library to Lint your Clojure programs as they run. (basically custom error messages for clojure.core---subsumed by spec/malli)

2014: Sponsored development of tools.analyzer via Nicola Mometto ($5k)

April 2013: clojure-doc: Improve macros tutorial

Feb 2013: Move typed-clojure to core.typed

March 2013: clojure-doc: Contribute `Growing a DSL in Clojure` (originally published 2011 in PragProg)

Aug 2012: clojure: Proposed that assoc should throw on uneven args (the behavior since Clojure 1.5)

Nov 2011: Started typed-clojure (soon to become core.typed)

Nov 2011: fogus/trammel: Fix defconstrainedtype

2011-2013: A precursor to tools.analyzer (mentioned in `The Joy of Clojure`)

2011-2013: Logic Programming tutorial with core.logic

2011: Collaborated on designing core.match with David Nolen

July 2011: `Growing a DSL in Clojure` published in PragProg magazine


Madison Clojure Meetup, 6th March 2024. Leveling-Up Clojure Runtime Specs (Video + Abstract, PDF (with transitions), PDF (no transitions), Keynote)

Interview for Strange Loop's YouTube channel, 1st February 2021.

Compose::Melbourne Keynote, 2nd September 2019. The Hidden Data Flow in Types (Abstract, PDF, Keynote)

The REPL Podcast, August 12th 2019: Episode 28

BloomingtonJS June 27th 2019 talk: Prototypal Inheritance [PDF, Keynote, Notes]

PL Wonks February 8th 2019 talk: Local Type Inference with Symbolic Closures [PDF, Keynote]

Clojure Conj Unsession November 29th 2018 talk: Typed Clojure: Wishful Thinking [PDF, Keynote]

PL Wonks April 20th 2018 talk: A Typed-Macro Writer’s Toolkit [Video (TBA), Abstract (TBA), PDF, Keynote]

Clojure Conj 2017 talk: Tool-assisted spec Development [Video, Abstract, PDF, Keynote]

PL Wonks September 22nd 2017 talk: Space-Efficient Runtime Tracking [Video, Abstract, PDF, Keynote]

Gradual Typing Across the Spectrum 2017 talk: Squash the work! Inferring Useful Types and Contracts via Dynamic Analysis [PDF, Keynote]

Indiegogo Campaign 2016: Automatic Annotations for Typed Clojure + clojure.spec

Gradual Typing Across the Spectrum 2016 talk: Inferring Structural Types from Tests [PDF, Keynote]

OPLSS 2016 Student talk: Inferring Structural Types from Tests [Keynote]

Houston Clojure User Group Talk 2015: Communicating between typed/untyped namespaces [Code]

Boston Clojure User Group Talk 2015: Getting started with Typed Clojure + Building a typed contracts framework [Code]

Strange Loop 2015 Talk: Typed Clojure: From Optional to Gradual Typing [Slides, Keynote]

Indiegogo Campaign 2015: Gradual Typing for Clojure Campaign

CodeMesh 2014 Talk: Typed Clojure in Practice [Slides, Keynote]

Clojure Toronto User Group Talk 2014: Typed Clojure Demo

Strange Loop 2014 Talk: Typed Clojure in Practice [Slides, Keynote]

ILC 2014 Invited Talk: Typed Clojure [Keynote]

Philly ETE 2014: What if Type Checkers Were More Like Linters? [Slides, Keynote]

Lambda Jam Brisbane 2013 Workshop: core.typed Workshop , core.typed talk

Indiegogo Campaign 2013: Typed Clojure Campaign

Cognicast Episode 042, October 8th, 2013: Recording

Illegal Argument Podcast 2013: Recording

Melbourne Functional User Group Talk 2013: Meetup [Keynote]

clj-syd User Group Talk 2013: Meetup

Clojure Conj 2012: Typed Clojure

Clojure Conj 2011: Introduction to Logic Programming (Slides)

Google Summer of Code (Clojure)

GSoC 2015 Administrator: Clojure

GSoC 2015 Mentor: Akhilesh Srikanth (Typed Transients for Clojure)

GSoC 2015 Mentor: Aravind K N (Typed Clojure Core Annotations)

GSoC 2014 Administrator: Clojure

GSoC 2014 Mentor: Nicola Mometto (tools.analyzer extensions: cljs port, documentation)

GSoC 2014 Mentor: Minori Yamashita (Typed ClojureScript Library Annotations)

GSoC 2014 Mentor: Di Xu (Typed Clojure: Heterogeneous operations & Dotted Polymorphism)

GSoC 2013 Student: core.typed: Extensions and Documentation

GSoC 2012 Student: Typed Clojure (Optional Static Type System)


Ph.D. Dissertation: Typed Clojure in Theory and Practice (ProQuest, IUScholarWorks)

Thesis Defense: (talk PDF, talk PDF w/ presenter notes w/o animation, Keynote, Video (practice))

Unpublished manuscript: Squash the work: A Workflow for Typing Untyped Programs that use Ad-Hoc Data Structures (draft, Experiments), with Sam Tobin-Hochstadt

Thesis Proposal: (Proposal PDF, talk PDF, Keynote)

Qualifying exam: (answers, talk PDF, talk PDF w/ notes, Keynote, blog transcription)

Exploration of Hash Array Mapped Tries (unpublished tutorial)

ESOP 2016: Practical Optional Types for Clojure (with appendix), with Sam Tobin-Hochstadt and Rowan Davies. (code, talk PDF, Keynote, arXiv)

Honours Dissertation: A Practical Optional Type System for Clojure , supervised by Rowan Davies. (slides)


European Lisp Symposium 2024 Program Committee

European Lisp Symposium 2023 Program Committee

Trends in Function Programming 2023 Program Committee

ECOOP 2018 Artifact Evaluation Committee

Indiana University PL Wonks Organizer 2017-2018