От:
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#
Здравствуйте, Darooma, Вы писали:
D>C#
D>D>if (skipEmpty == true && value == null )
D> return null ;
D>
match (skipEmpty, value )
{
| ( true , null ) => null
| _ => ()
}
Re[2]: Помогите перевести с C#
Здравствуйте, 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#
Здравствуйте, 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#
Здравствуйте, catbert, Вы писали:
C>C>match (skipEmpty, value )
C>{
C>| ( true , null ) => null
C>| _ => ()
C>}
C>
Только так (конечно) работать не будет. Вместо () нужно какое-то значение.
Есть логика намерений и логика обстоятельств,
последняя всегда сильнее .
Re[5]: Помогите перевести с C#
Здравствуйте, catbert, Вы писали:
C>C>using Nemerle.Extensions; // вместе с остальными using-ами
C> ParameterName = string .Format("@{0}" , name);
C>
Вот этот string.Format("@{0}", name) я бы заменил на: $"@$name" или еще лучше на "@" + name
Есть логика намерений и логика обстоятельств,
последняя всегда сильнее .
Re[5]: Помогите перевести с C#
Здравствуйте, 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#
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#
Подумал что стоит добавить ещё то что в $-строках можно производить вычесления (изредка бывает удобно), и для того чтобы в такой строке вывести сам символ $ его нужно записать два раза. Пример:
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#
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#
Здравствуйте, Darooma, Вы писали:
D>Чем это лучше? Это означает $ в выражении $"@$name"?
http://nemerle.org/wiki/Lexical_structure_%28ref%29#String_literals
Есть логика намерений и логика обстоятельств,
последняя всегда сильнее .
Пока на собственное сообщение не было ответов, его можно удалить.
Удалить