curry a function; the curried function take at least one argument at
a time, until it has either received n arguments in total, or
receives no arguments (if noargs = true); except, if strict = true,
then the curried function takes exactly one argument at a time

multimethods

creates a multimethod with optional default; you can add a new
method implementation to an existing multimethod with .method,
supplying a predicate and a function; alternatively you can use
.withMethod to create a new multimethod with the implementation
added; also, .methodPre and .withMethodPre add the new
implementation at the front instead of the back so the predicate
will be checked before the existing ones