code: function (env) {
          var args = this.args.map(function (a) { return a.eval(env); }),
              nameLC = this.name.toLowerCase(),
              result, func;
  
          if (nameLC in tree.functions) { // 1.
              try {
                  func = new tree.functionCall(env, this.currentFileInfo);
                  result = func[nameLC].apply(func, args);
                  if (result != null) {
                      return result;
                  }
              } catch (e) {
                  throw { type: e.type || "Runtime",
                          message: "error evaluating function `" + this.name + "`" +
                                   (e.message ? ': ' + e.message : ''),
                          index: this.index, filename: this.currentFileInfo.filename };
              }
          }
  
          return new tree.Call(this.name, args, this.index, this.currentFileInfo);
      }
docs: When evaluating a function call, we either find the function in `tree.functions` [1], in which case we call it, passing the  evaluated arguments, if this returns null or we cannot find the function, we simply print it out as it appeared originally [2].  The *functions.js* file contains the built-in functions.  The reason why we evaluate the arguments, is in the case where we try to pass a variable to a function, like: `saturate(@color)`. The function should receive the value, not the variable.