= Understanding the apply path in the interpreter = Because the interpreter deals with dynamic type inference and dynamic overloading resolution, the path for applying a function can be rather twisty. Note in particular that the class `DottedMethodApplication` is used to represent a pending method application (ie a pair of receiver and the method applied to that receiver); this substantially simplifies the code to handle e.g. juxtaposition in the interpreter, but it's worth understanding that these objects are only closures in the sense that they're waiting to be applied to arguments just as a top-level function might be. Most function application in the interpreter goes via `EvaluatorBase.functionInvocation`, and thence to `applyPossiblyGeneric`. This deals with tupling / un-tupling of arguments and then calls through to `applyInnerPossiblyGeneric`, which is the method that gets specialized for the various sorts of closure (overloaded, method, generic, etc.). A concrete interpreted method or function eventually constructs a new environment for its arguments using `buildEnvFrom[EnvAnd]Params`. If the method or function is built in, it instead calls the built-in version using `applyToArgs` or `applyMethod` rather than building an env. A generic function or method undergoes type inference using `EvaluatorBase.inferAndInstantiateGenericFunction`; this computes the actual type parameters and creates a non-generic monomorphic `Simple_fcn` that can be invoked directly. An overloaded function or method attempts to find the most specific applicable overloading using `bestMatch` (which in turn calls `bestMatchInternal`). This includes instantiating any generic overloadings that might apply. A functional method must extract its `self` parameter, then call the corresponding (specially-named) dotted method to resolve any overloading or overriding that might have occurred. == Summary of functions on apply path == === `applyPossiblyGeneric` === Uses * `Driver.runProgramTask` * `Evaluator.invokeGenericMethod` (on `DottedMethodApplication`) * `Evaluator.handleException` (construct `forbiddenException`) * `EvaluatorBase.functionInvocation` (surrounding `setContext`) * `LHSEvaluator.forLValue` (invoke array constructor) * `SpawnTask.compute` * `DottedMethodApplication.invokeMethod` * `GenericFunctionOrConstructor` (after `inferAndInstantiateGenericFunction`) * `GenericSingleton.make` (invoke nullary constructor on instantiation) * `NonPrimitive.buildEnvFromParams` (invoke varargs factory) * `OverloadedFunction.applyInnerPossiblyGeneric` (invoke best match) * `Reflect.makeReflectedType` (invoke nullary Reflect constructor after instantiation) Defs * `Fcn`: unwrap, handle `UnificationError`, call `applyInnerPossiblyGeneric`. === `applyInnerPossiblyGeneric` === Uses * `Fcn`: `applyPossiblyGeneric` Defs * `Fcn`: abstract * `Dummy_fcn`: NYI (testing only) * `Constructor`: call thru to `applyConstructor` * `DottedMethodApplication`: `applyMethod` with `setContext` * `FunctionalMethod`: pull out self, `DottedMethodApplication.invokeMethod` * `FunctionClosure`: `applyToArgs` of native, else eval * `GenericFunctionOrConstructor`: `inferAndInstantiate`, then `applyPossiblyGeneric` * `MethodClosure`: check for functional-ness, `applyMethod` * `OverloadedFunction`: find best match, `applyPossiblyGeneric` === `applyMethod` === Uses * `DottedMethodApplication`: `applyInnerPossiblyGeneric` with `setContext` * `MethodClosure.applyInnerPossiblyGeneric`: chain for functional method invocation. * `OverloadedMethod.applyMethod`: get applicable method, `applyMethod` * `IndexedArrayWrapper.put`,get: apply putter,getter Defs * interface `Method` * `MethodClosure`: check for native, `applyMethod` or `buildEnvFromEnvAndParams` and eval * `OverloadedMethod`: get applicable method, `applyMethod` * `TraitMethodInstance`: `buildEnvFromEnvAndParams` and eval (not called?) * `NativeMeth`: call thru to `applyMethod` (2 args, no site/`envForInference`) === `buildEnvFromEnvAndParams` === Uses * `Constructor.applyConstructor` (`methodsEnv`) * `MethodClosure.applyMethod` (`envForApplication`) * `TraitMethodInstance.applyMethod` (`evaluationEnv`) Defs * `NonPrimitive` `(extendAt(getAt())`, pass to `buildEnvFromParams`) === `buildEnvFromParams` === Uses * `FunctionClosure.applyInnerPossiblyGeneric` Defs * `NonPrimitive` (def with, without env; uses within by default) === `bestMatch` === Uses * `OverloadJUTest` * `OverloadedFunction.applyInnerPossiblyGeneric` * `MethodClosure.getApplicableMethod` Defs * `OverloadedFunction`: calls `bestMatchInternal`, twice if no index is found. === `bestMatchInternal` === Uses * `OverloadedFunction.bestMatch` chains to Defs * `OverloadedFunction`: `inferAndInstantiateGenericFunction` for generic === `inferAndInstantiateGenericFunction` === Uses * `GenericFunctionOrConstructor.applyInnerPossiblyGeneric` * `OverloadedFunction.applyInnerPossiblyGeneric` (redundant w/`bestMatchInternal`!) * `OverloadedFunction.bestMatchInternal` Defs * `EvaluatorBase` (HUGE wad of code)