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-09-06: I received a $9k grant to extend malli with constraints.
September 2024: Found bug in ClojureScript's LazySeq class
September 2024: Fix ClojureDart bugs 1, 2, 3
September 2024: Clojure 1.12 released including a contribution of mine
September 2024: $9k grant to work on malli
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: clojure.java-time 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: clojure.java-time 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 clojuriststogether.org
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 clojure.java-time 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: clojure.java-time: 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: jvm.tools.analyzer: 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)
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)