Substitutions
Substitutions are a more general form of providing functions. A substitution's body is evaluated in an environment where def-env, call-env, args and self are defined. Substitutions can be used to create lots of different behaviours including: macros, lambdas, and functions that take a variable number of arguments.
A version of lambda can be written using sub. The excessive de-quoting means that the names de-quoted are looked up outside of the substitutions restricted environment. The code below evaluates the body of the lambda in an environment that is made from the union of the lambdas defining environment and a mapping of all the lambda's arguments from the args passed to the function.