[Snippets] Обновленный макрос with
От: catbert  
Дата: 13.12.10 19:53
Оценка: 345 (16)
Народ (http://www.rsdn.ru/forum/nemerle/4067914.1.aspx
Автор: hardcase
Дата: 07.12.10
) хотел инициализаторы коллекций, так что я решил поделиться, и обновил реализацию with-макроса в сниппетах. Поддерживаются новые фичи.

1. Инициализация списков
  def l = List() with [ 2, 3, 4 ];
  def l2 = StringCollection() with [ "a", "b", "c" ]; // поддержка любых объектов с методом Add


2. Инициализация коллекций
  def coll = Dictionary() with [ "name" = "Jason", "surname" = "Vorhees" ];


3. Вложенная инициализация без создания объектов
def k = Diagnostics.Process() with
{
  EnableRaisingEvents = false;
  StartInfo with // никаких присваиваний!
  {
    FileName = <# calc.exe #>;
    UseShellExecute = true;
  }   
}


4. Поддержка событий
def btn = Button() with
          {
            MouseMove += handler;
            Click => form.Text = "Click!"; // упрощенная форма, как в компиляторе Mono C#
          },


5. Поддержка метода AddRange
 def controls = array[myButton, myListBox];
 def panel = Panel() with { Controls ::= controls };


Наконец-то можно создавать формы одним выражением:
  Скрытый текст
def f = Form() with
{
  Font = Drawing.Font("Segoe UI", 9);
  Text = "hello";
  Width += 100;
  Height -= 100;
  Controls with
  [
    Panel() with
    {
      Controls with 
      [
        ListBox() with
        {
          IntegralHeight = false;
          Dock = DockStyle.Fill;
          Name = "second";
        },
        ListBox() with
        {
          Dock = DockStyle.Left;
          Name = "first";
          Items with [3, 4, 5];
          Items ::= otherItems;
          IntegralHeight = false;
          SelectedIndexChanged += 
            (s, _) => 
            {
              def first = (s :> ListBox);
              def second = first.Parent.Controls["second"] :> ListBox;
              second.DataSource = first.SelectedItem.ToString().ToArray();
            }
        }            
      ];
      
      Dock = DockStyle.Fill;
    },
    Button() with
    {
      Text = "push me";
      Dock = DockStyle.Top;
      Click => _ = k.Start();
    },
    TextBox() with
    {
      Text = "type in me";
      Dock = DockStyle.Bottom;
    }
  ];
}
Re: [Snippets] Обновленный макрос with
От: Ka3a4oK  
Дата: 13.12.10 20:03
Оценка:
C>Наконец-то можно создавать формы одним выражением:

В чем профит?
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Re[2]: [Snippets] Обновленный макрос with
От: hardcase Пират http://nemerle.org
Дата: 13.12.10 20:20
Оценка: :)
Здравствуйте, Ka3a4oK, Вы писали:

C>>Наконец-то можно создавать формы одним выражением:


KK>В чем профит?


А это привет Tcl/Tk
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: [Snippets] Обновленный макрос with
От: catbert  
Дата: 13.12.10 20:38
Оценка: 2 (1)
Здравствуйте, Ka3a4oK, Вы писали:

C>>Наконец-то можно создавать формы одним выражением:


KK>В чем профит?


Во-первых, в WinForms часто используются императивные фичи языка: события, коллекции, изменяемые классы. Эта возможность — индикатор того, насколько макрос с ними справляется.

Во-вторых, создание форм с новым макросом удобнее, чем со старым, а тем более, чем без него. Просто потому что неудобно сначала декларировать вложенные контролы, а потом внешние. Ну, и еще менее удобно потом навешивать обработчики событий. А с этим макросом я формы клепаю быстрее, чем в дизайнере на C# (особенно на ноуте, где дизайнер тормозит безбожно)
Re: [Snippets] Обновленный макрос with
От: matumba  
Дата: 13.12.10 20:45
Оценка: :)
Здравствуйте, catbert, Вы писали:

C>Народ хотел инициализаторы коллекций, так что я решил поделиться


Да-да, это я хотел! Спасибо огромное, catbert! Избалованные сахаром /диабетчики/ люди, переходящие с цэшарпа, с большим трудом приспосабливаются к многословному коду.

C>5. Поддержка метода AddRange

C>
C>     def controls = array[myButton, myListBox];
C>     def panel = Panel() with { Controls ::= controls };
C>


Этого, как я понимаю, нет даже в цэшарпе! КрутЪ!

C>Наконец-то можно создавать формы одним выражением:

C> def f = Form() with
C> {
C> Font = Drawing.Font("Segoe UI", 9);

Несмотря на поддержку дизайнера, мне кажется, это будет востребовано. Уж для "обычных" (и иногда "ветвистых") объектов точно!

А что нуна делать, чтобы всё это заработало? Просто скопировать в "c:\Program Files\Nemerle\CodeSnippets\Snippets" или нужно перекомпилировать?
Re[2]: [Snippets] Обновленный макрос with
От: hardcase Пират http://nemerle.org
Дата: 13.12.10 23:19
Оценка:
Здравствуйте, matumba, Вы писали:

M>А что нуна делать, чтобы всё это заработало? Просто скопировать в "c:\Program Files\Nemerle\CodeSnippets\Snippets" или нужно перекомпилировать?


Собрать проект с макросом а бинарник подключить макрореференсом к проекту.
/* иЗвиНите зА неРовнЫй поЧерК */
Re: [Snippets] Обновленный макрос with
От: Rival Таиланд
Дата: 14.12.10 03:30
Оценка: +1
Здравствуйте, catbert, Вы писали:


C>2. Инициализация коллекций

C>3. Вложенная инициализация без создания объектов
C>4. // упрощенная форма, как в компиляторе Mono C#
C>5. Поддержка метода AddRange

Это особенно здорово, просто праздник какой-то! Одной макрой застыдил си-решетку.
«История жизни – это, по существу, развитие сознания, которое завуалировано морфологией.» Пьер Тейяр де Шарден
Re: [Snippets] Обновленный макрос with
От: _FRED_ Черногория
Дата: 14.12.10 04:40
Оценка:
Здравствуйте, catbert, Вы писали:

C>1. Инициализация списков

C> // поддержка любых объектов с методом Add


Без проверки на IEnumerable?
Help will always be given at Hogwarts to those who ask for it.
Re: [Snippets] Обновленный макрос with
От: lomeo Россия http://lomeo.livejournal.com/
Дата: 14.12.10 07:19
Оценка: 2 (1)
Здравствуйте, catbert, Вы писали:

C>    def btn = Button() with
C>                {
C>                    MouseMove += handler;
C>                    Click => form.Text = "Click!"; // упрощенная форма, как в компиляторе Mono C#
C>                },
C>


А макросы — первоклассные сущности? Так можно?

    def props =
                {
                    MouseMove += handler;
                    Click => form.Text = "Click!"; // упрощенная форма, как в компиляторе Mono C#
                }

    def btn = Button() with props


Практический смысл, например, такой — в tcl/lisp/javascript я могу нарожать схожие мне строки/списки/объекты в функции.
Re[2]: [Snippets] Обновленный макрос with
От: hardcase Пират http://nemerle.org
Дата: 14.12.10 07:43
Оценка: +1
Здравствуйте, lomeo, Вы писали:

L>А макросы — первоклассные сущности? Так можно?


L>
L>    def props =
L>                {
L>                    MouseMove += handler;
L>                    Click => form.Text = "Click!"; // упрощенная форма, как в компиляторе Mono C#
L>                }

L>    def btn = Button() with props
L>


Так делать невозможно. Вообще мне кажется вопрос о "первоклассности" макросов некорректный... но объяснить я пока не могу.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: [Snippets] Обновленный макрос with
От: hardcase Пират http://nemerle.org
Дата: 14.12.10 07:46
Оценка:
Здравствуйте, _FRED_, Вы писали:

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


C>>1. Инициализация списков

_FR>
C>> // поддержка любых объектов с методом Add
_FR>


_FR>Без проверки на IEnumerable?


А это действительно нужно?
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: [Snippets] Обновленный макрос with
От: _FRED_ Черногория
Дата: 14.12.10 08:01
Оценка:
Здравствуйте, hardcase, Вы писали:

C>>>1. Инициализация списков

C>>> // поддержка любых объектов с методом Add

_FR>>Без проверки на IEnumerable?

H>А это действительно нужно?


Разработчики шарпа решили, что "Да", найдя для этого достаточно оснований

Если у вас есть свой вижен, то, может, позволить так же (если ещё нет) использовать и extension Add-методы?
Help will always be given at Hogwarts to those who ask for it.
Re[3]: [Snippets] Обновленный макрос with
От: _nn_ www.nemerleweb.com
Дата: 14.12.10 08:48
Оценка: 2 (1)
Здравствуйте, catbert, Вы писали:

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


C>>>Наконец-то можно создавать формы одним выражением:


KK>>В чем профит?


C>Во-первых, в WinForms часто используются императивные фичи языка: события, коллекции, изменяемые классы. Эта возможность — индикатор того, насколько макрос с ними справляется.


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


А может стоит этот макрос совместить с дизайнером WinForms?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: [Snippets] Обновленный макрос with
От: hardcase Пират http://nemerle.org
Дата: 14.12.10 09:12
Оценка: +1
Здравствуйте, _FRED_, Вы писали:

_FR>Разработчики шарпа решили, что "Да", найдя для этого достаточно оснований


_FR>Если у вас есть свой вижен, то, может, позволить так же (если ещё нет) использовать и extension Add-методы?


По видимому, используется нетипизированный подход, и, с чем свяжется имя Add, уже решится механизмом выбора перегрузок. Если по сигнатуре подойдет метод-расширение, то будет использован он. Я не вижу потенциальных проблем с этим, но обоснование проверки на IEnumerable приветстувуется
/* иЗвиНите зА неРовнЫй поЧерК */
Re[5]: [Snippets] Обновленный макрос with
От: Jack128  
Дата: 14.12.10 10:02
Оценка:
Здравствуйте, hardcase, Вы писали:

H>По видимому, используется нетипизированный подход, и, с чем свяжется имя Add, уже решится механизмом выбора перегрузок. Если по сигнатуре подойдет метод-расширение, то будет использован он. Я не вижу потенциальных проблем с этим, но обоснование проверки на IEnumerable приветстувуется


ну в шарпе таким образом пытаются гарантировать, что смысл операции new SomeClass(10) { 1 } — добавление элемента в коллекцию элементов, а не например сложение двух чисел. ПОнятно, что это просто попытка, но тем ни менее..
Re[2]: [Snippets] Обновленный макрос with
От: catbert  
Дата: 14.12.10 10:43
Оценка:
Здравствуйте, lomeo, Вы писали:

L>А макросы — первоклассные сущности? Так можно?


Нельзя, но в немерле есть другие первоклассные сущности — функции :

def initialize(button) 
{
    button with
                {
                    MouseMove += handler;
                    Click => form.Text = "Click!"; 
                }
}


def newButton = initialize(button);


L>Практический смысл, например, такой — в tcl/lisp/javascript я могу нарожать схожие мне строки/списки/объекты в функции.


Не понял...
Re[6]: [Snippets] Обновленный макрос with
От: catbert  
Дата: 14.12.10 10:47
Оценка:
Здравствуйте, Jack128, Вы писали:

J>ну в шарпе таким образом пытаются гарантировать, что смысл операции new SomeClass(10) { 1 } — добавление элемента в коллекцию элементов, а не например сложение двух чисел. ПОнятно, что это просто попытка, но тем ни менее..


Именно так:
http://blogs.msdn.com/b/madst/archive/2006/10/10/what-is-a-collection_3f00_.aspx
Re[4]: [Snippets] Обновленный макрос with
От: catbert  
Дата: 14.12.10 10:56
Оценка:
Здравствуйте, _nn_, Вы писали:

__>А может стоит этот макрос совместить с дизайнером WinForms?


Можно, но для этого надо добавить в него еще как минимум одну фичу (присваивать полученные значения переменным класса). Кроме того, нужно разобраться с CodeDom'ом и вызовами методов посреди инициализации.

Это конечно добавит читаемости в код дизайнера, но стабильности, боюсь, не добавит .

Ну, и еще, тогда этот макрос придется перенести в стандартную библиотеку.
Re: [Snippets] Обновленный макрос with
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.10 13:42
Оценка:
Здравствуйте, catbert, Вы писали:

C>Народ (http://www.rsdn.ru/forum/nemerle/4067914.1.aspx
Автор: hardcase
Дата: 07.12.10
) хотел инициализаторы коллекций, так что я решил поделиться, и обновил реализацию with-макроса в сниппетах.


Комплит водр работает?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: [Snippets] Обновленный макрос with
От: catbert  
Дата: 14.12.10 13:53
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Комплит водр работает?


Не знаю, что такое "водр" , но с правой стороны присваиваний автокомплит через Ctrl+Space работает. С левой стороны — нет, и я не представляю, как его добавить.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.