anchor.diff:  function TGPUTransformKernelGenerator.TransformDouble(
     const Expression: Compute.ExprTrees.Expr): string;
   begin
  -  FOutput := '';
  +  Clear;
   
     Expression.Accept(Self);
   
  -  result := FOutput;
  +  result := Output;
  +end;
  +
  +procedure TGPUTransformKernelGenerator.Visit(const Node: ILambdaParamNode);
  +begin
  +  Emit('src_value');
   end;
   
   procedure TGPUTransformKernelGenerator.Visit(const Node: IArrayElementNode);
  
positive.code: 
  end;
  
  { TUserFuncBodyGenerator }
  
  constructor TUserFuncBodyGenerator.Create;
  begin
    inherited Create;
  end;
  
  function TUserFuncBodyGenerator.GenerateUserFuncBody(
    const FuncBody: Compute.ExprTrees.Expr): string;
  begin
    FOutput := '';
  
    FuncBody.Accept(Self);
  
    result := FOutput;
  end;
  
  procedure TUserFuncBodyGenerator.Visit(const Node: IArrayElementNode);
  begin
    FOutput := FOutput + Node.Data.Name + '[';
    Node.Data.Index.Accept(Self);
    FOutput := FOutput + ']';
  end;
  
  procedure TUserFuncBodyGenerator.Visit(const Node: IVariableNode);
  begin
    //FOutput := FOutput + Node.Data.Name;
    raise ENotImplemented.Create('Variables in functions not implemented');
  end;
  
  procedure TUserFuncBodyGenerator.Visit(const Node: IConstantNode);
  begin
    FOutput := FOutput + FloatToStr(Node.Data.Value, OpenCLFormatSettings);
  end;
  
  procedure TUserFuncBodyGenerator.Visit(const Node: IUnaryOpNode);
  begin
    FOutput := FOutput + '(';
    case Node.Op of
      uoNot: FOutput := FOutput + '!';
      uoNegate: FOutput := FOutput + '-';
    else
      raise ENotImplemented.Create('Unknown unary operator');
    end;
    Node.ChildNode.Accept(Self);
    FOutput := FOutput + ')';
  end;
  
  procedure TUserFuncBodyGenerator.Visit(const Node: ILambdaParamNode);
  begin
    FOutput := FOutput + Node.Data.Name;
  end;
  
  procedure TUserFuncBodyGenerator.Visit(const Node: IFuncNode);
  var
    i: integer;
  begin
    FOutput := FOutput + Node.Data.Name + '(';
  
    for i := 0 to Node.Data.ParamCount-1 do
    begin
      if (i > 0) then
        FOutput := FOutput + ', ';
  
      Node.Data.Params[i].Accept(Self);
    end;
  
    FOutput := FOutput + ')';
  end;
  
  procedure TUserFuncBodyGenerator.Visit(const Node: IBinaryOpNode);
  begin
    FOutput := FOutput + '(';
    Node.ChildNode1.Accept(Self);
    case Node.Op of
      boAdd: FOutput := FOutput + ' + ';
      boSub: FOutput := FOutput + ' - ';
      boMul: FOutput := FOutput + ' * ';
      boDiv: FOutput := FOutput + ' / ';
      boAnd: FOutput := FOutput + ' & ';
      boOr: FOutput := FOutput + ' | ';
      boXor: FOutput := FOutput + ' ^ ';
      boEq: FOutput := FOutput + ' == ';
      boNotEq: FOutput := FOutput + ' != ';
      boLess: FOutput := FOutput + ' < ';
      boLessEq: FOutput := FOutput + ' <= ';
      boGreater: FOutput := FOutput + ' > ';
      boGreaterEq: FOutput := FOutput + ' >= ';
    else
      raise ENotImplemented.Create('Unknown binary operator');
    end;
    Node.ChildNode2.Accept(Self);
    FOutput := FOutput + ')';
  end;
  
  { TKernelGeneratorBase }
  
negative.code:     function TransformDouble(const Expression: Compute.ExprTrees.Expr): string;
    end;
  
    TGPUTransformKernelGenerator = class(TExpressionGeneratorBase, IGPUTransformKernelGenerator)
    strict private
      function TransformDouble(const Expression: Compute.ExprTrees.Expr): string;
    protected
      procedure Visit(const Node: IVariableNode); override;
      procedure Visit(const Node: IArrayElementNode); override;
      procedure Visit(const Node: ILambdaParamNode); override;
    public
      constructor Create;
    end;
  