Class Closure

java.lang.Object
net.hydromatic.morel.eval.Closure
All Implemented Interfaces:
Comparable<Closure>, Applicable, Describable

public class Closure extends Object implements Comparable<Closure>, Applicable
Value that is sufficient for a function to bind its argument and evaluate its body.
  • Field Details

    • evalEnv

      private final EvalEnv evalEnv
      Environment for evaluation. Contains the variables "captured" from the environment when the closure was created.
    • patCodes

      private final ImmutablePairList<Core.Pat,Code> patCodes
      A list of (pattern, code) pairs. During bind, the value being bound is matched against each pattern. When a match is found, the code for that pattern is used to evaluate.

      For example, when applying fn x => case x of 0 => "yes" | _ => "no" to the value 1, the first pattern (0 fails) but the second pattern (_) succeeds, and therefore we evaluate the second code "no".

    • pos

      private final Pos pos
  • Constructor Details

  • Method Details

    • toString

      public String toString()
      Overrides:
      toString in class Object
    • compareTo

      public int compareTo(Closure o)
      Specified by:
      compareTo in interface Comparable<Closure>
    • bind

      EvalEnv bind(Object argValue)
      Binds an argument value to create a new environment for a closure.

      When calling a simple function such as (fn x => x + 1) 2, the binder sets just contains one variable, x, and the new environment contains x = 1. If the function's parameter is a match, more variables might be bound. For example, when you invoke (fn (x, y) => x + y) (3, 4), the binder sets x to 3 and y to 4.

    • evalBind

      EvalEnv evalBind(EvalEnv env)
      Similar to bind(java.lang.Object), but evaluates an expression first.
    • bindEval

      Object bindEval(Object argValue)
      Similar to bind(java.lang.Object), but also evaluates.
    • apply

      public Object apply(EvalEnv env, Object argValue)
      Specified by:
      apply in interface Applicable
    • describe

      public Describer describe(Describer describer)
      Specified by:
      describe in interface Describable
    • bindRecurse

      public static boolean bindRecurse(Core.Pat pat, Object argValue, BiConsumer<Core.NamedPat,Object> envRef)
      Attempts to bind a value to a pattern. Returns whether it has succeeded in matching the whole pattern.

      Each time it matches a name, calls a consumer. It's possible that the consumer is called a few times even if the whole pattern ultimately fails to match.