[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;
    }
  ];
}
http://nemerle.org/banners/?t=%20catbert%20
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
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: [Snippets] Обновленный макрос with
От: catbert  
Дата: 13.12.10 20:38
Оценка: 2 (1)
Здравствуйте, Ka3a4oK, Вы писали:

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


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


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

Во-вторых, создание форм с новым макросом удобнее, чем со старым, а тем более, чем без него. Просто потому что неудобно сначала декларировать вложенные контролы, а потом внешние. Ну, и еще менее удобно потом навешивать обработчики событий. А с этим макросом я формы клепаю быстрее, чем в дизайнере на C# (особенно на ноуте, где дизайнер тормозит безбожно)
http://nemerle.org/banners/?t=%20catbert%20
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" или нужно перекомпилировать?


Собрать проект с макросом а бинарник подключить макрореференсом к проекту.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
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>


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

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


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

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


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


А это действительно нужно?
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
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 приветстувуется
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
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 я могу нарожать схожие мне строки/списки/объекты в функции.


Не понял...
http://nemerle.org/banners/?t=%20catbert%20
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
http://nemerle.org/banners/?t=%20catbert%20
Re[4]: [Snippets] Обновленный макрос with
От: catbert  
Дата: 14.12.10 10:56
Оценка:
Здравствуйте, _nn_, Вы писали:

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


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

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

Ну, и еще, тогда этот макрос придется перенести в стандартную библиотеку.
http://nemerle.org/banners/?t=%20catbert%20
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-макроса в сниппетах.


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

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


Не знаю, что такое "водр" , но с правой стороны присваиваний автокомплит через Ctrl+Space работает. С левой стороны — нет, и я не представляю, как его добавить.
http://nemerle.org/banners/?t=%20catbert%20
Re[3]: [Snippets] Обновленный макрос with
От: VladD2 Российская Империя www.nemerle.org
Дата: 14.12.10 14:13
Оценка:
Здравствуйте, catbert, Вы писали:

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


Опять же погляди макру ?. я там эте проблему тоже решил.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Snippets] Обновленный макрос with
От: Ziaw Россия  
Дата: 15.12.10 09:23
Оценка: +1
Здравствуйте, catbert, Вы писали:

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


Удобно. Имхо, это должно войти в стандартную библиотеку макросов до релиза.
Re: [Snippets] Обновленный макрос with
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.12.10 17:28
Оценка: 21 (2)
Здравствуйте, catbert, Вы писали:

Допилил макрос и компилятор. Теперь для макроса with доступен интлеллисенс (хинты, переход к определению, подсветка использования, автодополнение при вводе).

Допиливание в компиляторе свелось к тому, чтобы код типа:
| <[ $(prop : name) =    $val ]> => <[ $name.$(prop : name) =  $val ]>

умно копировал местоположение имени результирующий код.

Погляди на будущее что надо делать, чтобы получить автодополнение. Там все просто. Нужно просто преобразовать PExpr.ToComplete() в Splicable.HalfId().
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Snippets] Обновленный макрос with
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.12.10 18:23
Оценка:
Здравствуйте, catbert, Вы писали:

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

Но есть одна недоработка. Эту штуку нужно поддерживать в макросе поддрежки linq. Там инициализация объекта с with должна переписываться во что-то вроде:
MemberInit(newExpr, array[Expression.Bind(..., initExpr)])
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Snippets] Обновленный макрос with
От: VladD2 Российская Империя www.nemerle.org
Дата: 21.02.11 02:00
Оценка: 10 (4) +3
Здравствуйте, catbert, Вы писали:

Предлагаю внести данный макрос в состав стандартной библиотеки. А то он слишком мал чтобы ради него цеплять отдельную сборку, но штука может оказаться полезной для многих.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: [Snippets] Обновленный макрос with
От: hardcase Пират http://nemerle.org
Дата: 15.03.11 22:04
Оценка: 143 (4)
Здравствуйте, catbert, Вы писали:

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


Макрос переехал в стандартную библиотеку в пространство имен Nemerle.Extensions.
К сожалению, использовать оригинальное имя "with" в качестве имени оператора не вышло: виртуальный оператор с таким именем, используемый для поддержки PM-а, имеет неподходящие приоритеты. Использована синтетическая штуковина: <-. Пример тут. Как и макра анонимного типа, инициализатор пока не отражен в официальной документации.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: [Snippets] Обновленный макрос with
От: catbert  
Дата: 15.03.11 22:24
Оценка:
Здравствуйте, hardcase, Вы писали:

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


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


H>Макрос переехал в стандартную библиотеку в пространство имен Nemerle.Extensions.

H>К сожалению, использовать оригинальное имя "with" в качестве имени оператора не вышло: виртуальный оператор с таким именем, используемый для поддержки PM-а, имеет неподходящие приоритеты. Использована синтетическая штуковина: <-.

Жаль. Впрочем, <- сойдет

H>Как и макра анонимного типа, инициализатор пока не отражен в официальной документации.


Как лучше всего это исправить? Мне кажется, стоит добавить доки в CSharpDiff и в раздел Macros.
http://nemerle.org/banners/?t=%20catbert%20
Re[3]: [Snippets] Обновленный макрос with
От: hardcase Пират http://nemerle.org
Дата: 15.03.11 22:30
Оценка: +1
Здравствуйте, catbert, Вы писали:

C>Как лучше всего это исправить? Мне кажется, стоит добавить доки в CSharpDiff и в раздел Macros.


Можно в принципе, но мне кажется, что эта страница слишком перегружена. Наши реализации анонимных типов и инициализаторов существенно функциональнее и вполне тянут на выделенные страницы. А в CSharpDiff можно небольшие примеры поместить с отсылкой на полные статьи.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: [Snippets] Обновленный макрос with
От: _FRED_ Россия
Дата: 16.03.11 18:04
Оценка:
Здравствуйте, hardcase, Вы писали:

H>К сожалению, использовать оригинальное имя "with" в качестве имени оператора не вышло: виртуальный оператор с таким именем, используемый для поддержки PM-а, имеет неподходящие приоритеты. Использована синтетическая штуковина: <-.


Вот тебе, бабушка, и Юрьев… то есть оператор стрелка
Help will always be given at Hogwarts to those who ask for it.
Re[3]: [Snippets] Обновленный макрос with
От: hardcase Пират http://nemerle.org
Дата: 16.03.11 18:38
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Вот тебе, бабушка, и Юрьев… то есть оператор стрелка


Подругому не получилось. Вообще у нас уже есть оператор стрелка (в другую сторону), он используется для декларации функционального типа:
int * string -> bool
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[4]: [Snippets] Обновленный макрос with
От: _FRED_ Россия
Дата: 16.03.11 19:03
Оценка: 5 (1)
Здравствуйте, hardcase, Вы писали:

_FR>>Вот тебе, бабушка, и Юрьев… то есть оператор стрелка


H>Подругому не получилось.


Ага. Стрелка в обратную сторону выглядит страшно не удобно. Но чего-то на замену тоже не придумывается. Жаль, что нельзя сделать как в шарпе

H>Вообще у нас уже есть оператор стрелка (в другую сторону), он используется для декларации функционального типа:

H>int * string -> bool


Такие стрелки как-то мозг не ломают (текст-то набирается справа на лево).
Help will always be given at Hogwarts to those who ask for it.
Re[5]: [Snippets] Обновленный макрос with
От: catbert  
Дата: 16.03.11 21:33
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Ага. Стрелка в обратную сторону выглядит страшно не удобно. Но чего-то на замену тоже не придумывается. Жаль, что нельзя сделать как в шарпе


По-моему, как в шарпе сделать можно. Для этого придется склеить макросы анонимных типов и инициализатора.
http://nemerle.org/banners/?t=%20catbert%20
Re[5]: [Snippets] Обновленный макрос with
От: VladD2 Российская Империя www.nemerle.org
Дата: 16.03.11 22:42
Оценка:
Здравствуйте, _FRED_, Вы писали:

_FR>Ага. Стрелка в обратную сторону выглядит страшно не удобно. Но чего-то на замену тоже не придумывается. Жаль, что нельзя сделать как в шарпе


Чтобы сделать как в шарпе надо курочить компилятор. Макросы Н1 на это не способны. Думаю, что в Н2 макрам это будет под силу.

H>>Вообще у нас уже есть оператор стрелка (в другую сторону), он используется для декларации функционального типа:

_FR>
H>>int * string -> bool
_FR>


_FR>Такие стрелки как-то мозг не ломают (текст-то набирается справа на лево).


В F# <- используется вместо оператора присвоения.
http://nemerle.org/Banners/?g=dark
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: [Snippets] Обновленный макрос with
От: _FRED_ Россия
Дата: 17.03.11 05:30
Оценка:
Здравствуйте, VladD2, Вы писали:

_FR>>Ага. Стрелка в обратную сторону выглядит страшно не удобно. Но чего-то на замену тоже не придумывается. Жаль, что нельзя сделать как в шарпе

VD>Чтобы сделать как в шарпе надо курочить компилятор. Макросы Н1 на это не способны. Думаю, что в Н2 макрам это будет под силу.



H>>>Вообще у нас уже есть оператор стрелка (в другую сторону), он используется для декларации функционального типа:

H>>>int * string -> bool

_FR>>Такие стрелки как-то мозг не ломают (текст-то набирается справа на лево).
VD>В F# <- используется вместо оператора присвоения.

Ага, что очень мешает даже при чтении книжек Но дело конечно же в привычке
Help will always be given at Hogwarts to those who ask for it.
Re[7]: [Snippets] Обновленный макрос with
От: Аноним  
Дата: 17.03.11 06:42
Оценка:
Здравствуйте, _FRED_, Вы писали:

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


_FR>>>Ага. Стрелка в обратную сторону выглядит страшно не удобно. Но чего-то на замену тоже не придумывается. Жаль, что нельзя сделать как в шарпе

VD>>Чтобы сделать как в шарпе надо курочить компилятор. Макросы Н1 на это не способны. Думаю, что в Н2 макрам это будет под силу.

_FR>


H>>>>Вообще у нас уже есть оператор стрелка (в другую сторону), он используется для декларации функционального типа:

_FR>
H>>>>int * string -> bool
_FR>

_FR>>>Такие стрелки как-то мозг не ломают (текст-то набирается справа на лево).
VD>>В F# <- используется вместо оператора присвоения.

_FR>Ага, что очень мешает даже при чтении книжек Но дело конечно же в привычке


withs не лучше будет?

а то стрелочка пугает
Re[8]: [Snippets] Обновленный макрос with
От: artelk  
Дата: 17.03.11 10:11
Оценка:
Здравствуйте, Аноним, Вы писали:

А>withs не лучше будет?


А>а то стрелочка пугает


А within?
Re[2]: [Snippets] Обновленный макрос with
От: _nn_ www.nemerleweb.com
Дата: 17.03.11 10:30
Оценка:
Здравствуйте, hardcase, Вы писали:

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


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


H>Макрос переехал в стандартную библиотеку в пространство имен Nemerle.Extensions.

H>К сожалению, использовать оригинальное имя "with" в качестве имени оператора не вышло: виртуальный оператор с таким именем, используемый для поддержки PM-а, имеет неподходящие приоритеты. Использована синтетическая штуковина: <-. Пример тут. Как и макра анонимного типа, инициализатор пока не отражен в официальной документации.

new в PM вроде не используется.
Может все же можно его использовать ?

def a = A() new { X = 1, Y = 2 };
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[4]: [Snippets] Обновленный макрос with
От: Rival Таиланд
Дата: 17.03.11 12:12
Оценка:
Здравствуйте, hardcase, Вы писали:

а может set?
def a = A() set { X = 1, Y = 2 };

или rec от record:
def a = A() rec { X = 1, Y = 2 };
«История жизни – это, по существу, развитие сознания, которое завуалировано морфологией.» Пьер Тейяр де Шарден
Re[9]: [Snippets] Обновленный макрос with
От: Аноним  
Дата: 17.03.11 12:29
Оценка:
Здравствуйте, artelk, Вы писали:

A>Здравствуйте, Аноним, Вы писали:


А>>withs не лучше будет?


А>>а то стрелочка пугает


A>А within?


Думаю разницы нет... можно любое
Re[5]: [Snippets] Обновленный макрос with
От: hardcase Пират http://nemerle.org
Дата: 17.03.11 12:32
Оценка:
Здравствуйте, Rival, Вы писали:

В качестве операторов оба варианта не подойдут — переменные с такими именами не редкость.
http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: [Snippets] Обновленный макрос with
От: para  
Дата: 17.03.11 12:49
Оценка: 1 (1)
Здравствуйте, hardcase, Вы писали:

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


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


H>Макрос переехал в стандартную библиотеку в пространство имен Nemerle.Extensions.

H>К сожалению, использовать оригинальное имя "with" в качестве имени оператора не вышло: виртуальный оператор с таким именем, используемый для поддержки PM-а, имеет неподходящие приоритеты. Использована синтетическая штуковина: <-. Пример тут. Как и макра анонимного типа, инициализатор пока не отражен в официальной документации.

having ?
Re[5]: [Snippets] Обновленный макрос with
От: BogdanMart Украина  
Дата: 20.03.11 10:32
Оценка:
Здравствуйте, catbert, Вы писали:

C>Ну, и еще, тогда этот макрос придется перенести в стандартную библиотеку.


А в чем проблема?
Re[2]: [Snippets] Обновленный макрос with
От: BogdanMart Украина  
Дата: 20.03.11 11:08
Оценка: 1 (1)
Здравствуйте, lomeo, Вы писали:

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



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


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

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


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


Идея забавная, и в принципе реализуемая, в виде макрос который преобразовывает код после себя.

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


Как то так, может попробую реализовать, если время найду.
Re: [Snippets] Обновленный макрос with
От: BogdanMart Украина  
Дата: 30.03.11 19:12
Оценка:
Здравствуйте, catbert, Вы писали:

Крутая макра!!! НАконецто можно декларативно создавать формочки из немерловского кода.
Если доработать то и поддержка XAMLa будет не нужна.

Чего не хватало в оригинальном макросе -- возмодности присваивать промежуточные результаты глобальной области видимости (те. формочка создаеться макросом и все ее содержымое, но какой-то TextBox также помещается в переменную)

Набросал решение. выглядит примерно так:

      mutable txtBox;
      mutable lbl;
      
      def _w = Window() <-
      {
        Width = 200;
        Height = 100;
        Content = StackPanel() <-
        {
          Children <-
          [
            txtBox <- TextBox() <- { Text = "Some text"},
            Button() <- 
            {
              Content = "Copy";
              Click += (_) => { lbl.Content = txtBox.Text }
            },
            lbl <- Label()
          ]
        }
      }
      
      _ = _w.ShowDialog();


Обратить внимание на места lbl <- Label() и txtBox <- TextBox() то есть помещаем во внешнюю переменную(или поле класса) текущие контролы.

Приимущества:
  • Весь код формы находиться в одном месте, а не размазан по местам где создаются нужные переменные(и контрольчики)
  • нужные контрольчики лежат в переменных

    Ну мешать эту макру с "<-" не обязательно, просто этот символ для этого действия ажеться логичным(и другого не придумал) а оператор "=" как ихвестно имеет тип возврата void по этому надо как то выкручиваться

    Желаю услышать ваши мнения. Если катит то доведу до ума и закомичу ибо ИМХО полезная доработка для этого макроса.
  • Re[2]: [Snippets] Обновленный макрос with
    От: catbert  
    Дата: 01.04.11 10:18
    Оценка: 11 (1)
    Здравствуйте, BogdanMart, Вы писали:

    ВМ>Чего не хватало в оригинальном макросе -- возмодности присваивать промежуточные результаты глобальной области видимости


    А так не работает?

    mutable pnl : StackPanel;
    mutable txtBox : TextBox;
    
    def w = Window() <-
    {
        Content = pnl <-
        {
            Children <-
            [
                 txtBox <- { blah blah }
            ]
        }
    }


    Так, правда, приходится создавать переменные сверху. Чтобы автоматически добавлять переменные в область видимости (но это уже другой вопрос!), можно добавить оператор as, как в паттерн-матчинге:

    def w = Window() <-
    {
        Content = StackPanel() as pnl <-
        {
            Children <-
            [
                 TextBox() as this.txtBox <- { blah blah } // если написано this, то генерируется член класса, а не локальная переменная
            ]
        }
    }


    Преимущество в том, что повторно используется стандартный синтаксис ввода в область видимости. Недостаток в том, что Немерле при этом на шаг приближается к С++, где все выражения вроде int *&, (int*)&, const int *, const * int, * const int позволены и имеют различную семантику. Но это так, философия
    http://nemerle.org/banners/?t=%20catbert%20
    Re[3]: [Snippets] Обновленный макрос with
    От: hardcase Пират http://nemerle.org
    Дата: 01.04.11 11:34
    Оценка:
    Здравствуйте, catbert, Вы писали:

    C>Так, правда, приходится создавать переменные сверху. Чтобы автоматически добавлять переменные в область видимости (но это уже другой вопрос!), можно добавить оператор as, как в паттерн-матчинге:


    C>
    C>def w = Window() <-
    C>{
    C>    Content = StackPanel() as pnl <-
    C>    {
    C>        Children <-
    C>        [
    C>             TextBox() as this.txtBox <- { blah blah } // если написано this, то генерируется член класса, а не локальная переменная
    C>        ]
    C>    }
    C>}
    C>


    Идея хорошая с именами — они позволят записать инициализацию циклических структур:

    def x = Node() as n <-
    {
      Parent = n
    };


    Фактически это имя можно использовать вместо временного имени, генерируемого компилятором.
    http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
    Re[3]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 01.04.11 13:21
    Оценка:
    Здравствуйте, catbert, Вы писали:

    C>
    C>def w = Window() <-
    C>{
    C>    Content = StackPanel() as pnl <-
    C>    {
    C>        Children <-
    C>        [
    C>             TextBox() as this.txtBox <- { blah blah } // если написано this, то генерируется член класса, а не локальная переменная
    C>        ]
    C>    }
    C>}
    C>


    Выглядит уже симпатично. Не придумал как cделать..
    Вот только с введением переменных во внешнюю область видимости могут быть сложности.. Компилятор вроде бы автоматически ставит блок вокруг тела макроса.. значит объявленные переменные будут внутри блока.
    Re[4]: [Snippets] Обновленный макрос with
    От: Ziaw Россия  
    Дата: 01.04.11 13:45
    Оценка:
    Здравствуйте, BogdanMart, Вы писали:

    BM>Выглядит уже симпатично. Не придумал как cделать..

    BM>Вот только с введением переменных во внешнюю область видимости могут быть сложности.. Компилятор вроде бы автоматически ставит блок вокруг тела макроса.. значит объявленные переменные будут внутри блока.

    ставит если макрос из нескольких выражений, попробуй так:

    <[
    def var = {
    your code
    }
    ]>;
    Re[5]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 01.04.11 18:46
    Оценка:
    Здравствуйте, Ziaw, Вы писали:

    Z>ставит если макрос из нескольких выражений, попробуй так:


    Z><[

    Z>def var = {
    Z> your code
    Z>}
    Z>]>;

    А вот и нет

      public macro Macro2()
      {
        <[
          def var = 8
        ]>;
      }

       Main() : void
        {
          Macro2();      
          def a = var;
        }


    Main.n:26:15:26:18: ←[01;31merror←[0m: unbound name `var'


    Тоесть полюбому не даст(напрямую, кончено можно из Тайпера получить MethodBuilder и потом колдовать, но брррр).

    А еслибы и заработало с одним выражением, так нам надо и проретурнить и присвоить выражению.
    Re[3]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 01.04.11 19:10
    Оценка:
    Здравствуйте, catbert, Вы писали:

    Могу реализовать и залить в таком виде:

    C>
    C>mutable pnl : StackPanel;
    C>mutable txtBox : TextBox;
    C>def w = Window() <-
    C>{
    C>    Content = StackPanel() as pnl <-
    C>    {
    C>        Children <-
    C>        [
    C>             TextBox() as this.txtBox <- { blah blah } // если написано this, то генерируется член класса, а не локальная переменная
    C>        ]
    C>    }
    C>}
    C>


    Из макроса их объявить более глобально -- это куча гемора связанная с доставанием MethodBuilder'a из Typer'a а это уже шаманство.
    Проще будет объявить нужную переменную

    вариант с
    mutable label = Label();
    Window() <-{ Contetn = label <- {....} }


    Не катит, потому что создания переносятся вверх... а если использовать первый способ то намного удобнее. И можно изменять тип контролов по требовании с меньшими затратами (все в одном месте лежит).

    Хотя если вы знаете как по хорошему объявить переменную во внешней области.. то попробуйте..

    ПС, как мне кажется даже с объявлением полей класса могут возникнуть проблемы, так как другие методы могут быть уже обработаны к этому моменту и не находить соответствующих полей(+ непонятно какую область видимости им давать, или может их свойствами, или вообще DependencyProperty) по этому лучше оставить объявление мест хранения объектиков на откуп пользователю.
    Re[4]: [Snippets] Обновленный макрос with
    От: hardcase Пират http://nemerle.org
    Дата: 01.04.11 19:51
    Оценка:
    Здравствуйте, BogdanMart, Вы писали:

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


    BM>Могу реализовать и залить в таком виде:


    Предлагаю следующее решение.

    Случай 1: использование имени внутри инициализатора

    def x = X() as current <-
    {
       // используем current для создания циклических структур данных
    }




    Случай 2: возврат ссылки на некоторый внутренний подобъект во внешний контекст

    mutable obj;
    
    def x = X() <- 
    {
      Y = Y() as out obj <-
      {
        A = ... // используем инициализированный obj здесь 
        B = ...
      }
    }
    
    // а также уже после блока
    http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
    Re[5]: [Snippets] Обновленный макрос with
    От: hardcase Пират http://nemerle.org
    Дата: 01.04.11 19:56
    Оценка:
    Здравствуйте, hardcase, Вы писали:

    H>
    H>mutable obj;
    
    H>def x = X() <- 
    H>{
    H>  Y = Y() as out obj <-
    H>  {
    H>    A = ... // используем инициализированный obj здесь 
    H>    B = ...
    H>  }
    H>}
    
    H>// а также уже после блока
    H>


    Конкретно именно так работать не будет ввиду специфики разбора out-выражение, но можно поискать решения типа:

    mutable obj;
    
    def x = X() <- 
    {
      Y = out Y() as obj <-
      {
        A = ... // используем инициализированный obj здесь 
        B = ...
      }
    }
    
    // а также уже после блока
    http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
    Re[6]: [Snippets] Обновленный макрос with
    От: Ziaw Россия  
    Дата: 01.04.11 20:11
    Оценка: +1
    Здравствуйте, BogdanMart, Вы писали:

    BM>Тоесть полюбому не даст(напрямую, кончено можно из Тайпера получить MethodBuilder и потом колдовать, но брррр).


    Макросы гигиеничны, переменную надо задавать так: $("var" : usesite).

    BM>А еслибы и заработало с одним выражением, так нам надо и проретурнить и присвоить выражению.


    Все работает.
    Re[7]: [Snippets] Обновленный макрос with
    От: Ziaw Россия  
    Дата: 01.04.11 20:38
    Оценка:
    Здравствуйте, Ziaw, Вы писали:

    BM>>А еслибы и заработало с одним выражением, так нам надо и проретурнить и присвоить выражению.


    Z>Все работает.


    Впрочем туплю, не понял сразу проблему с тем, что выражение должно иметь значение.
    Re[5]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 01.04.11 20:57
    Оценка:
    Здравствуйте, hardcase, Вы писали:

    H>Случай 1: использование имени внутри инициализатора


    H>
    H>def x = X() as current <-
    H>{
    H>   // используем current для создания циклических структур данных
    H>}
    H>


      public macro @as(obj, ing, initializer) // пробовал public macro @<-(obj, ing, initializer) как было в оригинале, не помогло..
      syntax( obj, "as", ing, "<-", initializer)
      {    
        WithMacroImpl.Run(obj, initializer);
      }


    def _w = Window() as temp <-  {}

    выдает: Error: found pattern expression () inside a raw expression
    Re[6]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 01.04.11 21:43
    Оценка:
    Здравствуйте, BogdanMart, Вы писали:

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


    BM>выдает: Error: found pattern expression () inside a raw expression


    Вообщем as и in использовать не дает... мож что то не так делаю.

    Уже и так делал(макрос обявлен так же но параметр паршу):
        public Run(obj : PExpr, initializer : PExpr) : PExpr
        {
          def (name, assignment) =
            match (obj)
            {
              | <[ $obj in $inn ]> when inn is PExpr.Ref => (inn, <[ $inn = $obj;]>)
              | _                  => 
                def name = <[ $(Macros.NewSymbol("initializedObject") : name) ]>;
                (name, <[def $name = $obj;]>)
            }   
          def statements = MakeStatements(initializer, name);
          ;
            
          <[
            $(assignment);
            $(statements);
            $(name)
          ]>
        }


    а такой синтаксис пашет Window() $ tmp <- {} -- но это бредовый синтаксис и не понятно нифига...
    Re[8]: [Snippets] Обновленный макрос with
    От: catbert  
    Дата: 01.04.11 22:11
    Оценка: +1
    Здравствуйте, Ziaw, Вы писали:

    Z>Впрочем туплю, не понял сразу проблему с тем, что выражение должно иметь значение.


    Это что за проблема?
    http://nemerle.org/banners/?t=%20catbert%20
    Re[6]: [Snippets] Обновленный макрос with
    От: hardcase Пират http://nemerle.org
    Дата: 02.04.11 06:34
    Оценка:
    Здравствуйте, BogdanMart, Вы писали:

    BM>
    BM>  public macro @as(obj, ing, initializer) // пробовал public macro @<-(obj, ing, initializer) как было в оригинале, не помогло..
    BM>  syntax( obj, "as", ing, "<-", initializer)
    BM>  {    
    BM>    WithMacroImpl.Run(obj, initializer);
    BM>  }
    BM>


    Синтаксис трогать не нужно, я думаю достаточно этого:
    match(obj)
    {
      | <[ $ctor as $(var : name) ]>     => случай_1
      | <[ out $ctor as $(var : name) ]> => случай_2
    }
    http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
    Re[7]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 02.04.11 09:36
    Оценка:
    Здравствуйте, hardcase, Вы писали:

    H>Синтаксис трогать не нужно, я думаю достаточно этого:

    H>
    H>match(obj)
    H>{
    H>  | <[ $ctor as $(var : name) ]>     => случай_1
    H>  | <[ out $ctor as $(var : name) ]> => случай_2
    H>}
    H>


    Так тоже не хочет.. (found pattern expression () inside a raw expression)
    Собственно писал на пост выше..
    Re[8]: [Snippets] Обновленный макрос with
    От: hardcase Пират http://nemerle.org
    Дата: 02.04.11 10:34
    Оценка: 8 (1)
    Здравствуйте, BogdanMart, Вы писали:

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


    H>>Синтаксис трогать не нужно, я думаю достаточно этого:

    H>>
    H>>match(obj)
    H>>{
    H>>  | <[ $ctor as $(var : name) ]>     => случай_1
    H>>  | <[ out $ctor as $(var : name) ]> => случай_2
    H>>}
    H>>


    BM>Так тоже не хочет.. (found pattern expression () inside a raw expression)

    BM>Собственно писал на пост выше..

    С out действительно проблема.
    Но можно поступить несколько хитрее — искать mutable переменные в текущем контексте:

      /// syntax is <[ obj <- { Foo = bar; ... } ]>
      /// or <[ obj <- ( Foo = bar, ... ) ]>
      /// or <[ obj <- [ foo, bar, ... ] ]>
      public macro @<-(obj, initializer)
      {
        def obj = match(obj)
        {
          | <[ $obj as $(n : name) ]> => 
            match(Macros.ImplicitCTX().LocalContext.FindLocal(n))
            {
              | Some(localValue) when localValue.IsMutable =>
                Message.Hint(n.Location, $"case2, mutable variable name detected: $n");
    
              | _ =>
                Message.Hint(n.Location, $"case1, variable name detected: $n");
            }
            obj
    
          | <[ $obj as $n ]> => 
            Message.Error(n.Location, $"variable name expected, but `$n' found");
            obj
            
          | _ => obj
        }
    
        WithMacroImpl.Run(obj, initializer);
      }


    Т.о. семантика выражения Ctor() as x определяется наличием объявления mutable переменной x в текущем контексте.
    http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
    Re[9]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 02.04.11 10:40
    Оценка:
    Здравствуйте, hardcase, Вы писали:


    Офигеть.Почти так же писал матч... и ни черта не работало... мистика какая-то. Спасибо!
    Re[10]: [Snippets] Обновленный макрос with
    От: hardcase Пират http://nemerle.org
    Дата: 02.04.11 11:00
    Оценка:
    Здравствуйте, BogdanMart, Вы писали:

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



    BM>Офигеть.Почти так же писал матч... и ни черта не работало... мистика какая-то. Спасибо!


    На самом деле такая полиморфность поведения X() as x не удачна, использование выражения out возможно лишь в правой части оператора <-
    X() as x <- out ....
    Но по-моему это некрасиво...

    Как вариант, избавиться от неоднозначности (для программиста) можно таким способом:
    X() as x! <- ....  // кстати !x тоже будет работать :)
    http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
    Re[11]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 02.04.11 12:38
    Оценка:
    Здравствуйте, hardcase, Вы писали:

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


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



    BM>>Офигеть.Почти так же писал матч... и ни черта не работало... мистика какая-то. Спасибо!


    H>На самом деле такая полиморфность поведения X() as x не удачна, использование выражения out возможно лишь в правой части оператора <-

    H>
    H>X() as x <- out ....
    H>
    Но по-моему это некрасиво...


    H>Как вариант, избавиться от неоднозначности (для программиста) можно таким способом:

    H>
    H>X() as x! <- ....  // кстати !x тоже будет работать :)
    H>


    Спасибо, выглядит неплохо. Единственно что пользователь может для своего класса перегрузить "!" но такое врятли произойдет (что он будет пытаться проинициализоровать объект порожденный оператором ! )
    Re[12]: [Snippets] Обновленный макрос with
    От: Ziaw Россия  
    Дата: 02.04.11 17:43
    Оценка: 1 (1)
    Здравствуйте, BogdanMart, Вы писали:

    BM>Спасибо, выглядит неплохо. Единственно что пользователь может для своего класса перегрузить "!" но такое врятли произойдет (что он будет пытаться проинициализоровать объект порожденный оператором ! )


    афайк, разбор макроса произойдет до применения оператора.
    Re[11]: [Snippets] Обновленный макрос with
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 02.04.11 22:18
    Оценка:
    Здравствуйте, hardcase, Вы писали:

    H>Как вариант, избавиться от неоднозначности (для программиста) можно таким способом:

    H>
    H>X() as x! <- ....  // кстати !x тоже будет работать :)
    H>


    Блин! На фиг этот птичий язык уперся? Вы в погоне за прекрасным делаете какую-то жопу. И это явно не жопа молодой красивой девушки.
    http://nemerle.org/Banners/?g=dark
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[12]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 02.04.11 22:56
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Блин! На фиг этот птичий язык уперся? Вы в погоне за прекрасным делаете какую-то жопу. И это явно не жопа молодой красивой девушки.


    Предложи как по лучше его завернуть в плане синтаксиса.
    (а фитча сама по себе нужная, в стандартной либе валяется, но возможности присваивать значения явно не хватает)
    Re[13]: [Snippets] Обновленный макрос with
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 02.04.11 23:03
    Оценка:
    Здравствуйте, BogdanMart, Вы писали:

    BM>Предложи как по лучше его завернуть в плане синтаксиса.


    Я вообще этим делом не пользуюсь. Да и хватает того что нужно сделать без этого.

    BM>(а фитча сама по себе нужная, в стандартной либе валяется, но возможности присваивать значения явно не хватает)


    Я не уверен, что она нужна. Надо что-то менять в объекте, получи это и меняй.
    http://nemerle.org/Banners/?g=dark
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[14]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 03.04.11 00:35
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    BM>>Предложи как по лучше его завернуть в плане синтаксиса.


    VD>Я вообще этим делом не пользуюсь. Да и хватает того что нужно сделать без этого.


    BM>>(а фитча сама по себе нужная, в стандартной либе валяется, но возможности присваивать значения явно не хватает)


    VD>Я не уверен, что она нужна. Надо что-то менять в объекте, получи это и меняй.


    Вся фишка немерлы в том тчобы писать меньше более структурированного кода а получать больше пользы.

    Попробуй создать пользовательский интерфес средней сложности из кода (и без этого макроса) и увидишь какой "красивый" код получиться в результате.

    Но если не нравиться то перенеси обратно в снипеты из основной либы. Но по моему это как раз таки огромным козырем станет для немерлы. Шарп ито в каком то виде это делать умеет.

    по поводу полезности:
            public Tags : IDTags
            {
                get
                {                
                    IDTags() <-
                             {
                                 Title = Title;
                                 Artist = ArtistName;
                                 Album = AlbumName;
                                 Year = if(Year == 0) this.Album.Year else this.Year;
                                 No = TrackNo;
                                 Genre = Genre;
                                 Length = length;
                                 Size = Size;
                                 Rate = Rate;
                             }                
                }
            }
    против
    
            public Tags : IDTags
            {
                get
                {                
                    def tags = IDTags();
                               
                    tags.Title = Title;
                    tags.Artist = ArtistName;
                    tags.Album = AlbumName;
                    tags.Year = if(Year == 0) this.Album.Year else this.Year;
                    tags.No = TrackNo;
                    tags.Genre = Genre;
                    tags.Length = length;
                    tags.Size = Size;
                    tags.Rate = Rate;
                    
                    tags              
                }
            }


    По моему првый способ НАМНОГО выразительнее. Хотя конкретно в этом случае отсутствие этого макроса сильно большого дискомфорта не создаст, а вот при создании древовидных структур жесть начнется.
    Re[14]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 03.04.11 00:42
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Я не уверен, что она нужна. Надо что-то менять в объекте, получи это и меняй.


    Оу, речи шла об возврате значения... не сразу это понял. ну это опционально, но местами удобно. Желательно чтобы механизм был один на весь язык. Ато каждый себе реализует эту штуку по своему а код в результате не читаемый.
    Re[15]: [Snippets] Обновленный макрос with
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 03.04.11 00:47
    Оценка:
    Здравствуйте, BogdanMart, Вы писали:

    VD>>Я не уверен, что она нужна. Надо что-то менять в объекте, получи это и меняй.


    BM>Оу, речи шла об возврате значения... не сразу это понял.


    О том и речь. Если из-за финтифлюшки получится наврот который мало кто понять сможет, то на фиг она нужна?
    Все равно ее использовать не будут, так как будут бояться запутаться. А если кто-то воспользуется, то потом никто понять не может.

    В общем, с наворотами важно вовремя остановиться. Ведь совершенству предела нет, а в погони за ним легко не заметить и перейти грань разумного.
    http://nemerle.org/Banners/?g=dark
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[16]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 03.04.11 00:57
    Оценка:
    Здравствуйте, VladD2, Вы писали:

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


    VD>>>Я не уверен, что она нужна. Надо что-то менять в объекте, получи это и меняй.


    BM>>Оу, речи шла об возврате значения... не сразу это понял.


    VD>О том и речь. Если из-за финтифлюшки получится наврот который мало кто понять сможет, то на фиг она нужна?

    VD>Все равно ее использовать не будут, так как будут бояться запутаться. А если кто-то воспользуется, то потом никто понять не может.

    VD>В общем, с наворотами важно вовремя остановиться. Ведь совершенству предела нет, а в погони за ним легко не заметить и перейти грань разумного.



    Да... это точно. Ну оно не понятно получилось. Но скажем я обявлю у себя макрос

    macro AssignAndReturn(exp1, exp2)
    {
     <[
       def tmp = $exp2;
       $exp1 = tmp;
       tmp;
      ]>
    }
    
    и буду  его использовать как  
    
    def label;
    
    Window() <-
     {
       Contetn = AssignAndReturn (label, Button()) <- {Content = "Click me!"}
     }


    Ну если использовать для дома для семьи то покатит, а если вдруг выложить где то как пример то уже и страшно и непонятно и надо разъяснять что твориться. (собрался клепать интерфейс на немерле в декларативном стиле)

    P.S. > Почему в немерле оператор = имеет тип возврата void, если бы не это то и проблемы такой бы не было... в принципе
    Re[17]: [Snippets] Обновленный макрос with
    От: _nn_ www.nemerleweb.com
    Дата: 03.04.11 06:53
    Оценка:
    Здравствуйте, BogdanMart, Вы писали:

    BM>P.S. > Почему в немерле оператор = имеет тип возврата void, если бы не это то и проблемы такой бы не было... в принципе


    Это правильно.
    Чтобы нельзя было писать
    if (a = 1) ...


    А вообще такое поведение никогда не нужно.

    Точно так же как и ++, -- возвращают void.
    http://rsdn.nemerleweb.com
    http://nemerleweb.com
    Re[16]: [Snippets] Обновленный макрос with
    От: hardcase Пират http://nemerle.org
    Дата: 03.04.11 09:02
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>О том и речь. Если из-за финтифлюшки получится наврот который мало кто понять сможет, то на фиг она нужна?

    VD>Все равно ее использовать не будут, так как будут бояться запутаться. А если кто-то воспользуется, то потом никто понять не может.

    VD>В общем, с наворотами важно вовремя остановиться. Ведь совершенству предела нет, а в погони за ним легко не заметить и перейти грань разумного.


    Собственно до грани разумного еще далеко, а финтифлюшка вполне полезная вырисовалась: именование под-объектов в выражении инициализатора (мне эта штука иногда нужна). Для этого предлагалось использовать оператор "as" в двух сценариях:
    1) имя доступное лишь внутри выражения инициализации — для создания обратных ссылок: X() as x <- { используем где-то тут x }
    2) имя переменной, в которое будет помещена ссылка на под-объект: X() as x! <- { ... } // где-то выше по коду объявлена изменяемая переменная x либо поле или свойство.
    http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
    Re[17]: [Snippets] Обновленный макрос with
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 03.04.11 12:44
    Оценка:
    Здравствуйте, BogdanMart, Вы писали:

    BM>P.S. > Почему в немерле оператор = имеет тип возврата void, если бы не это то и проблемы такой бы не было... в принципе


    Потому же почему в нем имеют такой тип операторы ++ и -- — боролись со случайными ошибками. Ведь в императивных конструкциях их допустить очень легко. Не знаю уж добро при этом получилось или зло. Мне как старому сишнику по началу было непривычно и неудобно. Но на самом деле оно особо не напрягает.
    http://nemerle.org/Banners/?g=dark
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[17]: [Snippets] Обновленный макрос with
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 03.04.11 12:51
    Оценка:
    Здравствуйте, hardcase, Вы писали:

    H>Собственно до грани разумного еще далеко,


    На мой взгляд "X() as x! <- ..." — это уже за гранью разумного.

    H>а финтифлюшка вполне полезная вырисовалась: именование под-объектов в выражении инициализатора (мне эта штука иногда нужна). Для этого предлагалось использовать оператор "as" в двух сценариях:

    H>1) имя доступное лишь внутри выражения инициализации — для создания обратных ссылок: X() as x <- { используем где-то тут x }
    H>2) имя переменной, в которое будет помещена ссылка на под-объект: X() as x! <- { ... } // где-то выше по коду объявлена изменяемая переменная x либо поле или свойство.

    Лучше уж тогда было бы разрешить возврат значения оператором "<-" в рамках вашего макроса.

    Его бы и для "=" бы разрешить. Но будут неоднозначности. Ведь человек может иметь в иду что выражение присваивающее значение переменной еще и возвращает его из составного выражения (функции, например).

    Но в рамках вашего макроса инициализации — это прокатывает. Будете писать:

    "X() <- x <- ..."
    http://nemerle.org/Banners/?g=dark
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[17]: [Snippets] Обновленный макрос with
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 03.04.11 12:53
    Оценка:
    Здравствуйте, hardcase, Вы писали:

    H>Собственно до грани разумного еще далеко, а финтифлюшка вполне полезная вырисовалась: именование под-объектов в выражении инициализатора (мне эта штука иногда нужна). Для этого предлагалось использовать оператор "as" в двух сценариях:

    H>1) имя доступное лишь внутри выражения инициализации — для создания обратных ссылок: X() as x <- { используем где-то тут x }
    H>2) имя переменной, в которое будет помещена ссылка на под-объект: X() as x! <- { ... } // где-то выше по коду объявлена изменяемая переменная x либо поле или свойство.

    Кстати, оператор <- можно был бы использовать и как замену оператору = которая бы возвращала бы значение (как = в C#). Не знаю уж получится ли совместить инициализатор и присвоение. Но если получится — это было бы прелестно.
    http://nemerle.org/Banners/?g=dark
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re[18]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 03.04.11 13:14
    Оценка:
    Здравствуйте, VladD2, Вы писали:

    VD>Кстати, оператор <- можно был бы использовать и как замену оператору = которая бы возвращала бы значение (как = в C#). Не знаю уж получится ли совместить инициализатор и присвоение. Но если получится — это было бы прелестно.


    Получилось, но выглядит довольно коряво
    Автор: BogdanMart
    Дата: 30.03.11
    Re[19]: [Snippets] Обновленный макрос with
    От: hardcase Пират http://nemerle.org
    Дата: 03.04.11 16:16
    Оценка: +1
    Здравствуйте, BogdanMart, Вы писали:

    BM>Получилось, но выглядит довольно коряво
    Автор: BogdanMart
    Дата: 30.03.11


    Хмм, а по-моему неплохо. Аналог цепочечных сишненьких присваиваний.
    http://nemerle.org/Banners/?t=Developer!&g=dark /* иЗвиНите зА неРовнЫй поЧерК */
    Re[20]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 03.04.11 16:43
    Оценка:
    Здравствуйте, hardcase, Вы писали:


    H>Хмм, а по-моему неплохо. Аналог цепочечных сишненьких присваиваний.


    дык я могу сразу закомитить, но оно не поможет в создании рекурсивных структур.. (
    Re[20]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 03.04.11 22:30
    Оценка:
    Здравствуйте, hardcase, Вы писали:

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


    BM>>Получилось, но выглядит довольно коряво
    Автор: BogdanMart
    Дата: 30.03.11


    H>Хмм, а по-моему неплохо. Аналог цепочечных сишненьких присваиваний.


    Блин, уже откатил то изменение
    Re[20]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 05.04.11 21:08
    Оценка:
    Здравствуйте, hardcase, Вы писали:

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


    BM>>Получилось, но выглядит довольно коряво
    Автор: BogdanMart
    Дата: 30.03.11


    H>Хмм, а по-моему неплохо. Аналог цепочечных сишненьких присваиваний.


    Проблемма с обратной совместимостью с тестами уже закомичеными
     a = Point() <- X = 5;
    те когда без скобочек(стоит ли его поддерживать в таком случае) .
    Re[20]: [Snippets] Обновленный макрос with
    От: BogdanMart Украина  
    Дата: 05.04.11 23:33
    Оценка: 22 (1)
    Здравствуйте, hardcase, Вы писали:

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


    BM>>Получилось, но выглядит довольно коряво
    Автор: BogdanMart
    Дата: 30.03.11


    H>Хмм, а по-моему неплохо. Аналог цепочечных сишненьких присваиваний.

    Имплементировал в r9752. Получилось что поддерживает <- для присвоения и для инициализации. И даже выкрутился для такого случая def p = Point() <- X=5;

    Но код слегка запутанный вышел, так как пришлось две вещи лепить в один макрос.
    Re: Баг в макросе <-
    От: VladD2 Российская Империя www.nemerle.org
    Дата: 28.05.11 17:11
    Оценка:
    Здравствуйте, catbert, Вы писали:

    Разберись, плиз:
    http://code.google.com/p/nemerle/issues/detail?id=1333

    Баг точно проявлется под WF 4.0, но уверен, что и под 2+ тоже будет.
    http://nemerle.org/Banners/?g=dark
    Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
    Re: [Snippets] Обновленный макрос with
    От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
    Дата: 01.04.12 16:53
    Оценка:
    Можно вопрос? Вот это не компилируется:
    _ = Device.CreateWithSwapChain
        ( null
        , DriverType.Hardware
        , DeviceCreationFlags.None
        , SwapChainDescription()
        , out device
        , out swapChain
        );

    а вот это нет:
    _ = Device.CreateWithSwapChain
        ( null
        , DriverType.Hardware
        , DeviceCreationFlags.None
        , SwapChainDescription() <-
        {
        }
        , out device
        , out swapChain
        );

    error : a ref or out argument must be an assignable variable

    swapChainDescription не является ни ref ни out аргументом. В чём может быть проблема?
    Ce n'est que pour vous dire ce que je vous dis.
    Re[2]: [Snippets] Обновленный макрос with
    От: catbert  
    Дата: 01.04.12 20:11
    Оценка: 6 (1)
    Здравствуйте, Don Reba, Вы писали:

    DR>Можно вопрос? Вот это не компилируется:

    DR>swapChainDescription не является ни ref ни out аргументом. В чём может быть проблема?

    Единственное, что могу предположить — какие-то странные взаимодействия между struct-ом как аргументом для кода и блоками выражений.

    Попробуйте заменить SwapChainDescription() <- {} на
    {def x = SwapChainDescription(); x}


    Этот код должен генерироваться макросом. Если ошибка останется, то это уже глюк компилятора, и я наверное ничем не смогу помочь. Если ошибка исчезнет, то глюк таки в макросе.
    http://nemerle.org/banners/?t=%20catbert%20
    Re[3]: [Snippets] Обновленный макрос with
    От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
    Дата: 02.04.12 06:42
    Оценка:
    Здравствуйте, catbert, Вы писали:

    C>Этот код должен генерироваться макросом. Если ошибка останется, то это уже глюк компилятора, и я наверное ничем не смогу помочь. Если ошибка исчезнет, то глюк таки в макросе.


    Спасибо. Похоже на глюк компилятора.
    Ce n'est que pour vous dire ce que je vous dis.
    Re[4]: [Snippets] Обновленный макрос with
    От: Don Reba Канада https://stackoverflow.com/users/49329/don-reba
    Дата: 02.04.12 10:06
    Оценка:
    https://github.com/rsdn/nemerle/issues/323
    Ce n'est que pour vous dire ce que je vous dis.
     
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.