Re[9]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.05.11 12:55
Оценка: +1
Здравствуйте, Darooma, Вы писали:

D>У C# нагляднее.


Это не у C#, а в библиотеке дотнет. Можешь использовать ее. Но по факту этот подход значительно менее удобен, так как ко всему прочему еще не позволяет выводить содержимое коллекций. Почитай внимательно документацию. Там есть пример выводящий содержимое коллекции (с помощью сплайса ..$). Это очень упрощает преобразгование в текст.

Потом в VS для $-строк есть подсветка, что делает их чтение очень удобным. В прочем, для {0} подсветка тоже имеется.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.05.11 12:58
Оценка:
Здравствуйте, Darooma, Вы писали:

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


Оператор <- объеявлен в пространстве имен Nemerle.Extensions. Его надо открыть перед использованием макроса.

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


Инициализатор. Не что вроде C#-пного инициализатора коллекций но несколько круче. Позволяет рекурсивную инициализацию и инициализацию уже созданных объектов.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: Помогите перевести с C#
От: hi_octane Беларусь  
Дата: 26.05.11 13:04
Оценка: 3 (1)
D>1. Что лучше передавать в качестве функции в Nemerle: делегат f:Func<IDataReader, T> func или функцию f:IDataReader->T ?
D>Как будет выглядеть конструкция с using (var connection = new SqlConnection(this.ConnectionString)) ?
Практически точно также:
using(def connection = SqlConnection(this.ConnectionString))
{
}

//есть версия с перехватом исключений в блоке:
using(def connection = SqlConnection(this.ConnectionString))
{
}
catch
{
  | e is SqlException => Console.WriteLine("Не соединились!");
}



D>2. Есть ли в Nemerle параметры по-умолчанию?

Да.
public static Test(i : int = 5) : void


D>3. Есть ли в Nemerle extension методы?

Да. Только их не обязательно выносить в статический класс, в обычных тоже можно объявлять. public static почему-то оставили, хотя имхо было бы удобнее если бы можно было иметь и локальные и экземплярные тоже
public static Ext(this s : string) : string


D>4. Есть ли в Nemerle циклы for и yield return?


for(mutable i=0; i<10; i++)
{
  Console.WriteLine(i);
}

//есть возможность добавить блок "иначе" выполняющийся если тело цикла не выполнялось:

for(mutable i=0; i<-10; i++)
{
  Console.WriteLine(i);
} otherwise
{
  Console.WriteLine("Цикл не выполнялся вовсе!");
}


yield конечно есть, но return не нужен.


YieldTest() : IEnumerable[string]
{
  yield "aaa";
  yield "bbb";
}


Пока что yield не работает в локальных функциях.
Re[2]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.05.11 13:06
Оценка: 3 (1)
Здравствуйте, Darooma, Вы писали:

D>1. Что лучше передавать в качестве функции в Nemerle: делегат f:Func<IDataReader, T> func или функцию f:IDataReader->T ?


Если не предполагается использовать функцию за пределами Немерле, то лучше IDataReader -> T. Если предполагается использовать функцию, например, из C#, то делегат, так как с функциональным объектов в шарпе будет туго.

D>Как будет выглядеть конструкция с using (var connection = new SqlConnection(this.ConnectionString)) ?

using (connection = SqlConnection(this.ConnectionString))
// или 
using (def connection = SqlConnection(this.ConnectionString))


D>2. Есть ли в Nemerle параметры по-умолчанию?


Да, но инициализировать можно только литералами. Синтаксис как в шарпее: x = null. При этом можно не указывать тип параметра.

D>3. Есть ли в Nemerle extension методы?


Да.

D>4. Есть ли в Nemerle циклы for и yield return?


Да. В for важно чтобы переменная была mutable. Плюс вместо for лучше применять
foreach (i in [0..x.Length])
  ..

или даже
foreach (elem in collection whith i)
  ..

последний вариант удобен если индекс и элемент нужны одновременно.

yield модно применять как внутри метода, так и внутри выражения (см. ComputationExpressions).
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 27.05.11 16:55
Оценка:
Здравствуйте, Ziaw, Вы писали:

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


Э... это только ухудшит читабельность. Да и производительность тоже.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: Помогите перевести с C#
От: Darooma Россия  
Дата: 28.05.11 05:54
Оценка:
Спасибо, познавательно.

Есть ли в Nemerle статические виртуальные методы?

Помогите перевести вот это

//1
    T ExecuteReader<T>(IDbCommand command, Func<IDataReader, T> func, bool isSingleRow = false)
        {
            var combehavior = isSingleRow ? CommandBehavior.SingleRow : CommandBehavior.Default;
            using (var connection = new SqlConnection(this.ConnectionString))
            {
                command.Connection = connection;
                connection.Open();

                using (IDataReader reader = command.ExecuteReader(combehavior))
                {
                    return func(reader);
                }
            }
        }

//2
    BEArticle GetSingle(int? id, string friendlyUrl)
        {
            var command = /////////////................................;

            return ExecuteReader(command, reader =>
            {
               BEArticle article = reader.GetBEArticle().Single();

               if (reader.NextResult())
                   article.Category = reader.GetBECategory().Single();

               
                return article;
            });
        }

Как будут выглядеть этоти методы
а) с использованием делегата Func<IDataReader, T> func
б) с использование функции func:IDataReader->T
Re[2]: Помогите перевести с C#
От: hardcase Пират http://nemerle.org
Дата: 28.05.11 07:11
Оценка: 3 (1)
Здравствуйте, Darooma, Вы писали:

D>Спасибо, познавательно.


D>Есть ли в Nemerle статические виртуальные методы?


Статические виртуальные методы не нужны.

D>Помогите перевести вот это


D>[c#]

D>//1
D> T ExecuteReader<T>(IDbCommand command, Func<IDataReader, T> func, bool isSingleRow = false)
D> {
D> var combehavior = isSingleRow ? CommandBehavior.SingleRow : CommandBehavior.Default;
D> using (var connection = new SqlConnection(this.ConnectionString))
D> {
D> command.Connection = connection;
D> connection.Open();

D> using (IDataReader reader = command.ExecuteReader(combehavior))

D> {
D> return func(reader);
D> }
D> }
D> }

Можно переписать в аналогичный метод, а можно и макрос изобразить.
Метод:
ExecuteReader[T](command : IDbCommand, func : IDataReader -> T /* разницы с делегатом не будет */, isSingleRow : bool = false) : T
{
  def combehavior = if(isSingleRow) CommandBehavior.SingleRow else CommandBehavior.Default;
  using (connection = SqlConnection(this.ConnectionString))
  {
    command.Connection = connection;
    connection.Open();
    using (reader = command.ExecuteReader(combehavior))
    {
      func(reader)
    }
  }
}


GetSingle(id : int?, friendlyUrl : string) : BEArticle
{
  def command = /////////////................................;

  ExecuteReader(command, reader =>
  {
     def article = reader.GetBEArticle().Single();

     when(reader.NextResult())
       article.Category = reader.GetBECategory().Single();

     article;
  });
}


Макрос (не проверялось)
...
using Nemerle.Compiler;
using Nemerle.Compiler.Parsetree;

namespace MyDataMacros
{
  macro ExecuteReader(command, body, reader = null)
    syntax("query", Optional(reader), "(", command ")", body)
  {
    ExecuteReaderImpl.Build(command, body, reader, false)
  }

  macro ExecuteSingleRowReader(command, body, reader = null)
    syntax("query" "single", Optional(reader), "(", command ")", body)
  {
    ExecuteReaderImpl.Build(command, body, reader, true)
  }

  module ExecuteReaderImpl
  {
    public Build(command : PExpr, body : PExpr, reader : PExpr, isSingleRow : bool) : PExpr
    {
      match(reader)
      {
        | null with readerName = <[ $("reader" : usesite) ]>
        | <[ $(readerName : name) ]> =>
          def executeArgs = if(isSingleRow) [ <[ CommandBehavior.SingleRow ]>] else [];
          <[
            def command = $command;
            using (connection = SqlConnection(this.ConnectionString))
            {
              command.Connection = connection;
              connection.Open();
              using ($(readerName : name) = command.ExecuteReader(..$executeArgs))
              {
                $body
              }
            }
          ]>

        | x =>
          Message.Error(x.Location, $"expected identifier, got `$x'"); <[ () ]>
      }
    }
  }
}

...

GetSingle(id : int?, friendlyUrl : string) : BEArticle
{
  def command = /////////////................................;

  query(command) // переменая reader доступна внутри блока
  {
     def article = reader.GetBEArticle().Single();

     when(reader.NextResult())
       article.Category = reader.GetBECategory().Single();

     article
  }
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: Помогите перевести с C#
От: Darooma Россия  
Дата: 28.05.11 09:52
Оценка:
D>>Есть ли в Nemerle статические виртуальные методы?

H>Статические виртуальные методы не нужны.


Мне нужны. Они есть?
Если нет, то какая альтернатива?



>>GetSingle(id : int?, friendlyUrl : string) : BEArticle

>>{
>> def command = /////////////................................;

>> ExecuteReader(command, reader =>

>> {
>> def article = reader.GetBEArticle().Single();

>> when(reader.NextResult())

>> article.Category = reader.GetBECategory().Single();

>> article;

>> });
>>}
Почему лямбда выражение здесь на Nemerle выглядит также ( ExecuteReader(command, reader => ......) ), как в C#? У них же синтаксис разный.
Re[4]: Помогите перевести с C#
От: hardcase Пират http://nemerle.org
Дата: 28.05.11 12:45
Оценка:
Здравствуйте, Darooma, Вы писали:


D>>>Есть ли в Nemerle статические виртуальные методы?


H>>Статические виртуальные методы не нужны.


D>Мне нужны. Они есть?


Их нет потому что они практически бессмысленны с точки зрения системы типов .NET.

D>Если нет, то какая альтернатива?


Огласите задачу, которую хотите решить этим способом. "Статический" виртуальный метод можно свести к обычному.


D>Почему лямбда выражение здесь на Nemerle выглядит также ( ExecuteReader(command, reader => ......) ), как в C#? У них же синтаксис разный.


Это макрос =>. Хочется разного — пиши:
fun(reader) 
{
...
}
/* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.11 13:14
Оценка:
Здравствуйте, Darooma, Вы писали:

D>Мне нужны. Они есть?

D>Если нет, то какая альтернатива?

Паттерн синглтон.

D>Почему лямбда выражение здесь на Nemerle выглядит также ( ExecuteReader(command, reader => ......) ), как в C#? У них

же синтаксис разный.

=> — это стандартный макрос. Автоматизирован соответствующим макросом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: Помогите перевести с C#
От: Darooma Россия  
Дата: 28.05.11 13:27
Оценка:
Здравствуйте, hardcase, Вы писали:

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



D>>>>Есть ли в Nemerle статические виртуальные методы?


H>Огласите задачу, которую хотите решить этим способом. "Статический" виртуальный метод можно свести к обычному.



Есть множество страниц asp.net, у каждой из которой имеется статический метод GetPageUrlWithParams(.....). Он статический потому, что он одинаков для всех объектов данного класса (страницы), а также для того, чтобы к нему можно было обратиться напрямую в вызывающем коде.

В каждой странице он реализован одинаково, а потому он находится в базовом классе для этих страниц (которая наследуется от класса Page ). Он бывает так, что этот метод должен быть реализован немного по-иному, то есть в него должна быть добавлена некая логика. Поэтому его нужно сделать виртуальным. Но именно виртаульным, чтобы его можно было реализовать по-инмоу с помощью override, а не new. new заставит его переписывать по-новому, то есть делать копипаст с родительского метода и дописывать свою логику.
Re[5]: Помогите перевести с C#
От: Darooma Россия  
Дата: 28.05.11 13:33
Оценка:
Здравствуйте, VladD2, Вы писали:

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


D>>Мне нужны. Они есть?

D>>Если нет, то какая альтернатива?

VD>Паттерн синглтон.


Он не подойдет для использования в классах (MyPage1, MyPage2, MyPage3), производных от asp.net страницы (System.Web.UI.Page, если я не ошибаюсь). У этих классов может быть множество объектов. Ведь каждый раз при обращении к странице создается новый объект.
Re[6]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 28.05.11 14:18
Оценка:
Здравствуйте, Darooma, Вы писали:

VD>>Паттерн синглтон.


D>Он не подойдет для использования в классах (MyPage1, MyPage2, MyPage3), производных от asp.net страницы (System.Web.UI.Page, если я не ошибаюсь). У этих классов может быть множество объектов. Ведь каждый раз при обращении к странице создается новый объект.


Я отвечал на вопрос "какая есть замена для виртуальных статических методов".

Синглтоном конечно нужно делать отдельный класс. И уже его использовать из своих страниц.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: Помогите перевести с C#
От: hardcase Пират http://nemerle.org
Дата: 28.05.11 20:13
Оценка: +1
Здравствуйте, Darooma, Вы писали:

D> В каждой странице он реализован одинаково, а потому он находится в базовом классе для этих страниц (которая наследуется от класса Page ). Он бывает так, что этот метод должен быть реализован немного по-иному, то есть в него должна быть добавлена некая логика. Поэтому его нужно сделать виртуальным. Но именно виртаульным, чтобы его можно было реализовать по-инмоу с помощью override, а не new. new заставит его переписывать по-новому, то есть делать копипаст с родительского метода и дописывать свою логику.


Зачем такой метод делать статическим?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[7]: Помогите перевести с C#
От: Darooma Россия  
Дата: 29.05.11 14:33
Оценка:
Здравствуйте, hardcase, Вы писали:

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


D>> В каждой странице он реализован одинаково, а потому он находится в базовом классе для этих страниц (которая наследуется от класса Page ). Он бывает так, что этот метод должен быть реализован немного по-иному, то есть в него должна быть добавлена некая логика. Поэтому его нужно сделать виртуальным. Но именно виртаульным, чтобы его можно было реализовать по-инмоу с помощью override, а не new. new заставит его переписывать по-новому, то есть делать копипаст с родительского метода и дописывать свою логику.


H>Зачем такой метод делать статическим?


Он статический потому, что он одинаков для всех объектов данного класса (страницы), а также для того, чтобы к нему можно было обратиться напрямую в вызывающем коде.
Re[8]: Помогите перевести с C#
От: VladD2 Российская Империя www.nemerle.org
Дата: 29.05.11 15:59
Оценка:
Здравствуйте, Darooma, Вы писали:

Это:

D>>> Он бывает так, что этот метод должен быть реализован немного по-иному, то есть в него должна быть добавлена некая логика. Поэтому его нужно сделать виртуальным. Но именно виртаульным, чтобы его можно было реализовать по-инмоу с помощью override, а не new. new заставит его переписывать по-новому, то есть делать копипаст с родительского метода и дописывать свою логику.


И это:

D>Он статический потому, что он одинаков для всех объектов данного класса (страницы), а также для того, чтобы к нему можно было обратиться напрямую в вызывающем коде.


Взаимно-противоречивые требования.

И вообще что-то ты очень сильно мудришь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[9]: Помогите перевести с C#
От: Darooma Россия  
Дата: 30.05.11 05:42
Оценка:
Здравствуйте, VladD2, Вы писали:


VD>И вообще что-то ты очень сильно мудришь.



 public partial class MyPage : System.Web.UI.Page {
        protected void Page_Init(object sender, EventArgs e) { }
        public static string PageUrl { get{ return "/Secure/App/MyPage.aspx";} }
}

//.....................................
void Foo(){
if (good)
 Response.Redirect(MyPage.GetPageUrl);
}

Как по-другому я не знаю. Response.Redirect("/Secure/App/MyPage.aspx") не подходит.
Re[10]: Помогите перевести с C#
От: catbert  
Дата: 30.05.11 07:23
Оценка: +1
Здравствуйте, Darooma, Вы писали:

D>Как по-другому я не знаю. Response.Redirect("/Secure/App/MyPage.aspx") не подходит.


Просто снимите модификатор static и добавьте virtual. Это как раз сценарий использования для virtual, если я все понимаю правильно.

Диспетчеризация виртуальных вызовов проводится как раз "по классовому принципу".
Re[11]: Помогите перевести с C#
От: Darooma Россия  
Дата: 30.05.11 08:09
Оценка:
Здравствуйте, catbert, Вы писали:

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


D>>Как по-другому я не знаю. Response.Redirect("/Secure/App/MyPage.aspx") не подходит.


C>Просто снимите модификатор static и добавьте virtual. Это как раз сценарий использования для virtual, если я все понимаю правильно.


C>Диспетчеризация виртуальных вызовов проводится как раз "по классовому принципу".


Тогда его не получится вызвать, потому что у MyPage есть множество объектов.


void Foo(){
if (good)
    Response.Redirect(/*????*/);
}
Re[12]: Помогите перевести с C#
От: catbert  
Дата: 30.05.11 08:26
Оценка:
Может я не понимаю чего-то, но почему не так?

void Foo(){
if (good)
    Response.Redirect(this.PageUrl);
}
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.