Class Closure

    • Field Detail

      • evalEnv

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

        private final com.google.common.collect.ImmutableList<Pair<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 Detail

      • Closure

        public Closure​(EvalEnv evalEnv,
                       com.google.common.collect.ImmutableList<Pair<Core.Pat,​Code>> patCodes,
                       Pos pos)
        Not a public API.
    • Method Detail

      • 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.

      • 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.