Помогите перевести с C#
От: Darooma Россия  
Дата: 25.05.11 19:13
Оценка:
Я вступаю в ваши ряды.
Нужно перевести код с C# на Nemerle.

 protected   SqlCommand BuildCommand(string commandtText, params SqlParameter[] parameters)
        {
            SqlCommand ret = new SqlCommand();
            ret.CommandType = CommandType.StoredProcedure;
            ret.CommandText = commandtText;

            ret.Parameters.AddRange(parameters.Where(n => n != null).ToArray());

            return ret;
        }

Вот, что у меня получилось, но не работает

 protected BuildCommand( commandtText:string, params  parameters:SqlParameter[]):SqlCommand
        {
            def ret:SqlCommand = SqlCommand();
            ret.CommandType = CommandType.StoredProcedure;
            ret.CommandText = commandtText;

            ret.Parameters.AddRange(parameters.Where(n => n != null).ToArray());
        }
Re: Помогите перевести с C#
От: Darooma Россия  
Дата: 25.05.11 19:32
Оценка:
Хотя, нет, с этим я уже разобрался, а вот с этим не могу.
Нужно без if..., а с match.


C#
if (skipEmpty == true && value == null)
                return null;


Nemerle
match(skipEmpty){
                | true => match(value)
                {
                    | null=>null 
                    | _ => () 
                }   
                | false => ()
            }
Re[2]: Помогите перевести с C#
От: catbert  
Дата: 25.05.11 19:35
Оценка: 3 (1)
Здравствуйте, Darooma, Вы писали:

D>C#

D>
D>if (skipEmpty == true && value == null)
D>                return null;
D>



match (skipEmpty, value)
{
| ( true, null) => null
| _ => ()
}
Re[2]: Помогите перевести с C#
От: Jack128  
Дата: 25.05.11 19:38
Оценка: -1
Здравствуйте, Darooma, Вы писали:

D>Хотя, нет, с этим я уже разобрался, а вот с этим не могу.

D>Нужно без if..., а с match.

зачем "нужно"?? если ты занимаешся механическим переводом кода, то им и занимайся.

замени if на when, подключи Nemerle.Imperetive (или как там этот namespace называется) , чтоб return появился — и не парь себе мозги

D>C#

D>
D>if (skipEmpty == true && value == null)
D>                return null;
D>


D>Nemerle

D>
D>match(skipEmpty){
D>                | true => match(value)
D>                {
D>                    | null=>null 
D>                    | _ => () 
D>                }   
D>                | false => ()
D>            }

D>
Re[3]: Помогите перевести с C#
От: Darooma Россия  
Дата: 25.05.11 20:14
Оценка:
Здравствуйте, catbert, Вы писали:

C>Здравствуйте, Darooma, Вы писали:



C>
C>match (skipEmpty, value)
C>{
C>| ( true, null) => null
C>| _ => ()
C>}
C>



protected  CreateParameter( name:string, value:object, skipEmpty: bool):SqlParameter
        {
            match(value, skipEmpty)
            {
                | (null, true) =>null
                | _ => ()
            }

            

            def param =   SqlParameter();
            param.ParameterName = string.Format("@{0}", name);
            param.Direction = ParameterDirection.Input;
            param.Value = value ?? DBNull.Value;
            param.SourceColumn = name;

            param;
        }


Ошибка — expected ?, got void in computation branch: the `null' literal is not a valid value of type void
Re[4]: Помогите перевести с C#
От: catbert  
Дата: 25.05.11 20:37
Оценка: 3 (1)
Здравствуйте, Darooma, Вы писали:

D>Ошибка — expected ?, got void in computation branch: the `null' literal is not a valid value of type void


А. Тогда надо прописать using Nemerle.Imperative; и написать:

match (skipEmpty, value)
{
| ( true, null) => return null;
| _ => ()
}


Но лучше:

using Nemerle.Extensions; // вместе с остальными using-ами

protected  CreateParameter( name:string, value:object, skipEmpty: bool):SqlParameter
        {
            match(value, skipEmpty)
            {
                | (null, true) =>null

                | _ => 
                    SqlParameter() <- {
                      ParameterName = string.Format("@{0}", name);
                      Direction = ParameterDirection.Input;
                      Value = value ?? DBNull.Value;
                      SourceColumn = name;
                   }
            }
        }
Re[3]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.11 20:47
Оценка: 1 (1)
Здравствуйте, catbert, Вы писали:

C>
C>match (skipEmpty, value)
C>{
C>| ( true, null) => null
C>| _ => ()
C>}
C>


Только так (конечно) работать не будет. Вместо () нужно какое-то значение.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.11 20:51
Оценка:
Здравствуйте, catbert, Вы писали:

C>
C>using Nemerle.Extensions; // вместе с остальными using-ами
C>                      ParameterName = string.Format("@{0}", name);
C>

Вот этот string.Format("@{0}", name) я бы заменил на: $"@$name" или еще лучше на "@" + name
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 25.05.11 20:53
Оценка:
Здравствуйте, catbert, Вы писали:

C>
C>            match(value, skipEmpty)
C>            {
C>                | (null, true) =>null
C>                | _ => 
C>

здесь теряется случай (null, false). На него наверно исключение надо генерировать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Помогите перевести с C#
От: catbert  
Дата: 25.05.11 21:19
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, catbert, Вы писали:


C>>
C>>            match(value, skipEmpty)
C>>            {
C>>                | (null, true) =>null
C>>                | _ => 
C>>


VD>здесь теряется случай (null, false). На него наверно исключение надо генерировать.


По логике, все так и должно быть: если skipEmpty == false, то генерируется запрос даже для null-a. Дальше по коду ?? используется.
Re[5]: Помогите перевести с C#
От: Ziaw Россия  
Дата: 26.05.11 01:32
Оценка: +1
Здравствуйте, catbert, Вы писали:

C>Но лучше:


Можно еще использовать то, что для параметров матч писать не обязательно

using Nemerle.Extensions; // вместе с остальными using-ами

protected CreateParameter(name : string, value : object, skipEmpty : bool) : SqlParameter
{
  | (_, null, true) => // либо, для читабельности, _ when value == null && skipEmpty
    null

  | _ => 
    SqlParameter() <- {
      ParameterName = "@" + name;
      Direction = ParameterDirection.Input;
      Value = value ?? DBNull.Value;
      SourceColumn = name;
    }
}
Re[6]: Помогите перевести с C#
От: Darooma Россия  
Дата: 26.05.11 05:26
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Здравствуйте, catbert, Вы писали:


Z>protected CreateParameter(name : string, value : object, skipEmpty : bool) : SqlParameter

Z>{
Z> | (_, null, true) => // либо, для читабельности, _ when value == null && skipEmpty
Z> null

Z> | _ =>

Z> SqlParameter() <- {
Z> ParameterName = "@" + name;
Z> Direction = ParameterDirection.Input;
Z> Value = value ?? DBNull.Value;
Z> SourceColumn = name;
Z> }
Z>}
Z>[/nemerle]

Я не знаю как этот вариант (когда прийду домой, скажу), но вот этот вариант не работает


protected  CreateParameter( name:string, value:object, skipEmpty: bool):SqlParameter
        {
            match(value, skipEmpty)
            {
                | (null, true) =>null

                | _ => 
                    SqlParameter() <- {
                      ParameterName = string.Format("@{0}", name);
                      Direction = ParameterDirection.Input;
                      Value = value ?? DBNull.Value;
                      SourceColumn = name;
                   }
            }
        }

А вот такой работает

protected  CreateParameter( name:string, value:object, skipEmpty: bool):SqlParameter
        {
            match(value, skipEmpty)
            {
                | (null, true) =>null

                | _ => 
                   def param = SqlParameter();
                      param.ParameterName = string.Format("@{0}", name);
                      param.Direction = ParameterDirection.Input;
                      param.Value = value ?? DBNull.Value;
                      param.SourceColumn = name;
                      param;
            }
        }

Что означает оператор <-?
Re[6]: Помогите перевести с C#
От: Darooma Россия  
Дата: 26.05.11 05:30
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Здравствуйте, catbert, Вы писали:


C>>
C>>using Nemerle.Extensions; // вместе с остальными using-ами
C>>                      ParameterName = string.Format("@{0}", name);
C>>

VD>Вот этот string.Format("@{0}", name) я бы заменил на: $"@$name" или еще лучше на "@" + name
Чем это лучше? Это означает $ в выражении $"@$name"?
Re[7]: Помогите перевести с C#
От: hi_octane Беларусь  
Дата: 26.05.11 05:58
Оценка:
VD>>Вот этот string.Format("@{0}", name) я бы заменил на: $"@$name" или еще лучше на "@" + name
D>Чем это лучше?
Форматирование завязанное на порядковые номера аргументов "{0} {1} {3} {2}" — ненаглядно, и легко может привести к run-time ошибкам. "@" + name — в данном случае тупой и весьма оптимальный способ.


D>Это означает $ в выражении $"@$name"?

Вот в этой статье Влада было
Автор(ы): Сергей Туленцев, Владислав Чистяков
Дата: 23.05.2006
Производительность труда программиста в основном зависит от самого программиста. Однако даже самый опытный и знающий программист мало что может без подходящего инструмента. Эта статья открывает цикл статей об одном из таких инструментов, еще мало известном среди программистов, но очень многообещающем. Язык Nemerle, о котором пойдет речь в этих статьях, на первый взгляд очень похож на слегка улучшенный C#, но привносит многое из передовых исследовательских языков. Данная статья рассказывает об отличиях Nemerle от C# (как наиболее близкого языка)и является неформальным введением в язык.
:

Строка, начинающаяся со знака «$», может иметь в себе, скажем так, активные области (splices). Если внутри строки встречается одиночный символ «$», и дальше идет выражение, то его значение вычисляется и преобразуется в строку путем вызова у результирующего объекта метода ToString(). В качестве выражения может выступать идентификатор или произвольное выражение, взятое в скобки.


Вот сравни наглядность таких выражений:

C#:
throw new InvalidArgumentException(string.Format("Неверная операция {0} для объекта {1} в состоянии {2}", cmd.OperationType, obj, obj.State));


Nemerle:
throw InvalidArgumentException($"Неверная операция $(cmd.OperationType) для объекта $obj в состоянии $(obj.State)");


Ещё интересно, что $-строка — это не захардкоженная функция языка, а макрос.
Re[8]: Помогите перевести с C#
От: hi_octane Беларусь  
Дата: 26.05.11 06:11
Оценка:
Подумал что стоит добавить ещё то что в $-строках можно производить вычесления (изредка бывает удобно), и для того чтобы в такой строке вывести сам символ $ его нужно записать два раза. Пример:
Console.WriteLine($"Посчитаем в $$-строке $(Math.Max(3 * 10, 5 + 2 * 10))");

выводит:

Посчитаем в $-строке 30

Re[7]: Помогите перевести с C#
От: _Raz_  
Дата: 26.05.11 07:20
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Что означает оператор <-?

[Snippets]Обновленный макрос with
Автор: catbert
Дата: 13.12.10
... << RSDN@Home 1.2.0 alpha 5 (M6) rev. 1511>>
Re[8]: Помогите перевести с C#
От: Darooma Россия  
Дата: 26.05.11 07:32
Оценка: :)))
Здравствуйте, hi_octane, Вы писали:


_>Вот сравни наглядность таких выражений:


_>C#:

_>
_>throw new InvalidArgumentException(string.Format("Неверная операция {0} для объекта {1} в состоянии {2}", cmd.OperationType, obj, obj.State));
_>


_>Nemerle:

_>
_>throw InvalidArgumentException($"Неверная операция $(cmd.OperationType) для объекта $obj в состоянии $(obj.State)");
_>


_>Ещё интересно, что $-строка — это не захардкоженная функция языка, а макрос.


У C# нагляднее.
Re[9]: Помогите перевести с C#
От: hi_octane Беларусь  
Дата: 26.05.11 08:57
Оценка: +1
D>У C# нагляднее.
Вопрос привычек. Подход C# вводит лишнюю сущность — порядок аргументов. Причём ненадёжную в двух местах сразу — во время компиляции не выполняются ни проверки на число аргументов, ни проверки на их порядок.
Но если тебе удобно — пиши в стиле C#.
Re: Помогите перевести с C#
От: Darooma Россия  
Дата: 26.05.11 11:39
Оценка:
Вот еще кое-что


//1
 protected   T ExecuteReader<T>(IDbCommand command, Func<IDataReader, T> func, bool isSingleRow = false)
        {
            
            using (var connection = new SqlConnection(this.ConnectionString))
            {
               //....................................
                using (IDataReader reader = command.ExecuteReader(combehavior))
                {
                    return func(reader);
                }
            }
        }

//2
        protected void ExecuteReader(IDbCommand command, Action<IDataReader> action, bool isSingleRow = false)
        {
            using (var connection = new SqlConnection(this.ConnectionString))
            {
               //....................................
                using (IDataReader reader = command.ExecuteReader(combehavior))
                {
                    action(reader);
                }
            }
        }


 private IEnumerable<BEArticle> Fill(SqlCommand command)
        {
            //3
            List<BEArticle> article = ExecuteReader(command, reader =>  article = reader.GetBEArticle().ToList());

//4
            for (int  i = 0; i < article.Count; i++)
            {
                article[i].Category = category[i];
                yield return article[i];
            }
        }


1. Что лучше передавать в качестве функции в Nemerle: делегат f:Func<IDataReader, T> func или функцию f:IDataReader->T ?
Как будет выглядеть конструкция с using (var connection = new SqlConnection(this.ConnectionString)) ?

2. Есть ли в Nemerle параметры по-умолчанию?
3. Есть ли в Nemerle extension методы?
4. Есть ли в Nemerle циклы for и yield return?
Re[7]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.05.11 12:47
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Чем это лучше? Это означает $ в выражении $"@$name"?


http://nemerle.org/wiki/Lexical_structure_%28ref%29#String_literals
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.