Class Closure

  • All Implemented Interfaces:
    java.lang.Comparable<Closure>, Applicable

    public class Closure
    extends java.lang.Object
    implements java.lang.Comparable<Closure>, Applicable
    Value that is sufficient for a function to bind its argument and evaluate its body.
    • 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<Ast.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 pattern (_) succeeds, and therefore we evaluate the second code "no".

    • Constructor Detail

      • Closure

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

      • toString

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

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

        EvalEnv bind​(java.lang.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.

      • bindEval

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

        public java.lang.Object apply​(EvalEnv env,
                                      java.lang.Object argValue)
        Specified by:
        apply in interface Applicable
      • bindRecurse

        private boolean bindRecurse​(Ast.Pat pat,
                                    EvalEnv[] envRef,
                                    java.lang.Object argValue)