public procedure_definition lambda(function_lambda_definition _function_lambda_definition)
{
    SyntaxTree.procedure_definition _func_def = new PascalABCCompiler.SyntaxTree.procedure_definition();
    SyntaxTree.method_name _method_name1 = new SyntaxTree.method_name(null, new SyntaxTree.ident(_function_lambda_definition.lambda_name), null);
    SyntaxTree.function_header _function_header1 = new SyntaxTree.function_header();

    object rt1 = new object();
    _function_header1.name = _method_name1;
    SyntaxTree.formal_parametres fps = new PascalABCCompiler.SyntaxTree.formal_parametres();
    _function_header1.parametres = _function_lambda_definition.formal_parametres;//fps;
    SyntaxTree.named_type_reference _named_type_reference = new SyntaxTree.named_type_reference();
    SyntaxTree.ident idtype = new SyntaxTree.ident("datatype");
    _named_type_reference.source_context = idtype.source_context;
    _named_type_reference.names.Add(idtype);

    rt1 = _named_type_reference;
    _function_header1.return_type = (SyntaxTree.type_definition)_named_type_reference;

    _function_header1.of_object = false;
    _function_header1.class_keyword = false;
    SyntaxTree.block _block1 = new SyntaxTree.block(null, null);
    SyntaxTree.statement_list sl1 = new SyntaxTree.statement_list();
    sl1.subnodes.Add(_function_lambda_definition.proc_body);
    _block1.program_code = sl1;
    _func_def.proc_header = _function_header1;
    _func_def.proc_body = (SyntaxTree.proc_block)_block1;
    _function_lambda_definition.proc_definition = _func_def;
    return _func_def;
}
        //\ssyy

        //(ssyy) возвращаемое значение заменено на definition_node из-за шаблонов
        public definition_node enter_in_type_method(SyntaxTree.method_name meth_name, string type_name, location loc, int num_template_args)
        {
            // num_template_args - это количество обобщенных аргументов в классе (не в методе!)
            SymbolInfo si = null;

            if (meth_name.ln!=null && meth_name.ln.Count > 1)
            {
                // обработать эту ситуацию особо тщательно: в ln - список возможных пространств имен с классом (возможно, обобщенным) на конце

                // если в ln какое-то имя кроме последнего, содержит обобщенные параметры - это ошибка
                for (var i = 0; i < meth_name.ln.Count - 1; i++)
                    if (meth_name.ln[i] is SyntaxTree.template_type_name)
                        AddError(new NameCannotHaveGenericParameters(meth_name.ln[i].name, syntax_tree_visitor.get_location(meth_name.ln[i]))); 
                
                var ntr = new SyntaxTree.named_type_reference();
                for (var i = 0; i < meth_name.ln.Count; i++)
                    ntr.Add(meth_name.ln[i]);
                if (num_template_args>0 && ! ntr.names[meth_name.ln.Count-1].name.Contains(compiler_string_consts.generic_params_infix))
                {
                     ntr.names[meth_name.ln.Count-1].name += compiler_string_consts.generic_params_infix + num_template_args;
                }
                si = find_definition_node(ntr, loc);
                // если не нашли, то ошибка будет неправильной с неправильным именем - надо исправить
            }
            else
            {
                if (num_template_args != 0)
                {
                    string template_type_name = type_name + compiler_string_consts.generic_params_infix + num_template_args.ToString();
                    si = find(template_type_name);
                    /*if (si == null || si.sym_info.general_node_type != general_node_type.template_type)
                    {
                        type_name = type_name + compiler_string_consts.generic_params_infix + num_template_args.ToString();
                        si = null;
                    }*/
                }
                if (si == null)
                {
                    si = find(type_name);
                }
            }

            if (si == null)
            {
                AddError(new UndefinedNameReference(type_name, loc));
            }
            definition_node dn = si.sym_info;
            if (dn.general_node_type == general_node_type.template_type)
            {
                _ctt = dn as template_class;
                if (_cmn != _ctt.cnn && _ctt.using_list2 == null)
                {
                    //Заполняем список using для внешних методов
                    _ctt.using_list2 = new using_namespace_list();
                    foreach(using_namespace un in syntax_tree_visitor.using_list)
                    {
                        _ctt.using_list2.AddElement(un);
                    }
                }
                return dn;
            }
            if (dn.general_node_type == general_node_type.generic_indicator)
            {
                dn = (dn as generic_indicator).generic;
            }
            if (dn is compiled_type_node)
            {
                _compiled_tn = dn as compiled_type_node;
                return dn;
            }
            if (dn.general_node_type != general_node_type.type_node)
            {
                AddError(loc, "TYPE_NAME_EXPECTED");
            }
#if DEBUG
            if (si.Next != null)
            {
                throw new CompilerInternalError("Must find only type, found some other.");
            }
#endif
            if (dn.semantic_node_type != semantic_node_type.common_type_node)
            {
                AddError(loc, "ONLY_COMMON_TYPE_METHOD_DEFINITION_ALLOWED");
            }

            //TODO: В случае создания вложенных классов этот код надо поправить.
            common_type_node ctn = dn as common_type_node;
            _ctn = ctn;
            return ctn;
        }