anchor.diff:          | "!"  | "not" -> evalBoolUnary optOrigin nameStr not args env
           | "&"  | "and" -> evalBoolBinary optOrigin nameStr (&&) args env
           | "|"  | "or" -> evalBoolBinary optOrigin nameStr (||) args env
  -        | "="  | "eq" -> evalBinary optOrigin nameStr Binary.Eq args env
  -        | "<>" | "not_eq" -> evalBinary optOrigin nameStr Binary.NotEq args env
  -        | "<"  | "lt" -> evalBinary optOrigin nameStr Binary.Lt args env
  -        | ">"  | "gt" -> evalBinary optOrigin nameStr Binary.Gt args env
  -        | "<=" | "lt_eq" -> evalBinary optOrigin nameStr Binary.LtEq args env
  -        | ">=" | "gt_eq" -> evalBinary optOrigin nameStr Binary.GtEq args env
  -        | "+"  | "add" -> evalBinary optOrigin nameStr Binary.Add args env
  -        | "-"  | "sub" -> evalBinary optOrigin nameStr Binary.Sub args env
  -        | "*"  | "mul" -> evalBinary optOrigin nameStr Binary.Mul args env
  -        | "/"  | "div" -> evalBinary optOrigin nameStr Binary.Div args env
  -        | "%"  | "mod" -> evalBinary optOrigin nameStr Binary.Mod args env
  -        | "pow" -> evalBinary optOrigin nameStr Binary.Pow args env
  -        | "root" -> evalBinary optOrigin nameStr Binary.Root args env
  -        | "sqr" -> evalUnary optOrigin nameStr Unary.Sqr args env
  -        | "sqrt" -> evalUnary optOrigin nameStr Unary.Sqrt args env
  -        | "floor" -> evalUnary optOrigin nameStr Unary.Floor args env
  -        | "ceiling" -> evalUnary optOrigin nameStr Unary.Ceiling args env
  -        | "truncate" -> evalUnary optOrigin nameStr Unary.Truncate args env
  -        | "round" -> evalUnary optOrigin nameStr Unary.Round args env
  -        | "exp" -> evalUnary optOrigin nameStr Unary.Exp args env
  -        | "log" -> evalUnary optOrigin nameStr Unary.Log args env
  -        | "sin" -> evalUnary optOrigin nameStr Unary.Sin args env
  -        | "cos" -> evalUnary optOrigin nameStr Unary.Cos args env
  -        | "tan" -> evalUnary optOrigin nameStr Unary.Tan args env
  -        | "asin" -> evalUnary optOrigin nameStr Unary.Asin args env
  -        | "acos" -> evalUnary optOrigin nameStr Unary.Acos args env
  -        | "atan" -> evalUnary optOrigin nameStr Unary.Atan args env
  -        | "length" -> evalUnary optOrigin nameStr Unary.Length args env
  -        | "normal" -> evalUnary optOrigin nameStr Unary.Normal args env
  -        | "cross" -> evalBinary optOrigin nameStr Binary.Cross args env
  -        | "dot" -> evalBinary optOrigin nameStr Binary.Dot args env
  -        | "bool" -> evalUnary optOrigin nameStr Unary.Bool args env
  -        | "int" -> evalUnary optOrigin nameStr Unary.Int args env
  -        | "int64" -> evalUnary optOrigin nameStr Unary.Int64 args env
  -        | "single" -> evalUnary optOrigin nameStr Unary.Single args env
  -        | "double" -> evalUnary optOrigin nameStr Unary.Double args env
  -        | "string" -> evalUnary optOrigin nameStr Unary.String args env
  +        | "="  | "eq" -> evalBinary optOrigin nameStr EqFns args env
  +        | "<>" | "not_eq" -> evalBinary optOrigin nameStr NotEqFns args env
  +        | "<"  | "lt" -> evalBinary optOrigin nameStr LtFns args env
  +        | ">"  | "gt" -> evalBinary optOrigin nameStr GtFns args env
  +        | "<=" | "lt_eq" -> evalBinary optOrigin nameStr LtEqFns args env
  +        | ">=" | "gt_eq" -> evalBinary optOrigin nameStr GtEqFns args env
  +        | "+"  | "add" -> evalBinary optOrigin nameStr AddFns args env
  +        | "-"  | "sub" -> evalBinary optOrigin nameStr SubFns args env
  +        | "*"  | "mul" -> evalBinary optOrigin nameStr MulFns args env
  +        | "/"  | "div" -> evalBinary optOrigin nameStr DivFns args env
  +        | "%"  | "mod" -> evalBinary optOrigin nameStr ModFns args env
  +        | "pow" -> evalBinary optOrigin nameStr PowFns args env
  +        | "root" -> evalBinary optOrigin nameStr RootFns args env
  +        | "sqr" -> evalUnary optOrigin nameStr SqrFns args env
  +        | "sqrt" -> evalUnary optOrigin nameStr SqrtFns args env
  +        | "floor" -> evalUnary optOrigin nameStr FloorFns args env
  +        | "ceiling" -> evalUnary optOrigin nameStr CeilingFns args env
  +        | "truncate" -> evalUnary optOrigin nameStr TruncateFns args env
  +        | "round" -> evalUnary optOrigin nameStr RoundFns args env
  +        | "exp" -> evalUnary optOrigin nameStr ExpFns args env
  +        | "log" -> evalUnary optOrigin nameStr LogFns args env
  +        | "sin" -> evalUnary optOrigin nameStr SinFns args env
  +        | "cos" -> evalUnary optOrigin nameStr CosFns args env
  +        | "tan" -> evalUnary optOrigin nameStr TanFns args env
  +        | "asin" -> evalUnary optOrigin nameStr AsinFns args env
  +        | "acos" -> evalUnary optOrigin nameStr AcosFns args env
  +        | "atan" -> evalUnary optOrigin nameStr AtanFns args env
  +        | "length" -> evalUnary optOrigin nameStr LengthFns args env
  +        | "normal" -> evalUnary optOrigin nameStr NormalFns args env
  +        | "cross" -> evalBinary optOrigin nameStr CrossFns args env
  +        | "dot" -> evalBinary optOrigin nameStr DotFns args env
  +        | "bool" -> evalUnary optOrigin nameStr BoolFns args env
  +        | "int" -> evalUnary optOrigin nameStr IntFns args env
  +        | "int64" -> evalUnary optOrigin nameStr Int64Fns args env
  +        | "single" -> evalUnary optOrigin nameStr SingleFns args env
  +        | "double" -> evalUnary optOrigin nameStr DoubleFns args env
  +        | "string" -> evalUnary optOrigin nameStr StringFns args env
           | "some" -> evalSome optOrigin nameStr args env
           | "isSome" -> evalIsSome optOrigin nameStr args env
           | "head" -> evalHead optOrigin nameStr args env
  
positive.code:             | _ -> Result (Violation (["invalidArgumentType"; "unary"; fnName], "Cannot apply an unary function on an incompatible value.", Expr.getOptOrigin evaled), env)
          | _ -> Result (Violation (["invalidArgumentCount"; "unary"; fnName], "Incorrect number of arguments for application of '" + fnName + "'; 1 argument required.", fnOptOrigin), env)
  
      let evalBinary fnOptOrigin fnName (fns : Binary.Fns) evaledArgs env =
          match evaledArgs with
          | [evaledLeft; evaledRight] ->
              match (evaledLeft, evaledRight) with
  
negative.code:             | _ -> Result (Violation (["invalidArgumentType"; "binary"; fnName], "Cannot apply a bool function to a non-bool value.", combine (Expr.getOptOrigin evaledLeft) (Expr.getOptOrigin evaledRight)), env)
          | _ -> Result (Violation (["invalidArgumentCount"; "binary"; fnName], "Incorrect number of arguments for application of '" + fnName + "'; 2 arguments required.", fnOptOrigin), env)
  
      let evalUnary fnOptOrigin fnName (fns : UnaryFns) evaledArgs env =
          match evaledArgs with
          | [evaled] ->
              match evaled with
  