foreach + yield
От: _NN_ www.nemerleweb.com
Дата: 15.06.13 13:51
Оценка: +1
Уже пробегала идея для автоматизация foreach + yield: url=http://www.rsdn.ru/forum/nemerle/4806737
Автор: hi_octane
Дата: 05.07.12

Как показывает личная практика фича нужна.

Вопрос какой синтаксис выглядит более очевидным ?
В Python ,например, используется: 'yield from x'.
Но в Nemerle мне кажется это может запутать.

Может быть что-то в стиле:
yield ..a;


Есть идеи ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: foreach + yield
От: Ziaw Россия  
Дата: 15.06.13 14:53
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Вопрос какой синтаксис выглядит более очевидным ?

_NN>В Python ,например, используется: 'yield from x'.
_NN>Но в Nemerle мне кажется это может запутать.

Угу. Особенно когда синтаксис linq сможет поддерживаться нормально.
yield from x in seq where x > 0;
yield from from x in seq where x > 0;


_NN>Может быть что-то в стиле:

_NN>
_NN>yield ..a;
_NN>


Снова птички. А может yield all? Насколько это коряво будет звучать по английски без from?
Re[2]: foreach + yield
От: _NN_ www.nemerleweb.com
Дата: 15.06.13 15:12
Оценка:
Здравствуйте, Ziaw, Вы писали:

Z>Снова птички. А может yield all? Насколько это коряво будет звучать по английски без from?

".." используется в макросе $"..$x" и в квазицитатах <[ {..$x} ]>
Мне кажется логично его заюзать в yield.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: foreach + yield
От: Ziaw Россия  
Дата: 15.06.13 16:06
Оценка:
Здравствуйте, _NN_, Вы писали:

Z>>Снова птички. А может yield all? Насколько это коряво будет звучать по английски без from?

_NN>".." используется в макросе $"..$x" и в квазицитатах <[ {..$x} ]>
_NN>Мне кажется логично его заюзать в yield.

Да я понял откуда он взят. Только я например, вижу там не .., а ..$.
Re: foreach + yield
От: STDray http://stdray.livejournal.com
Дата: 15.06.13 19:52
Оценка: +2
_NN>Есть идеи ?
может как в F# ?

yield! items
Re: foreach + yield
От: STDray http://stdray.livejournal.com
Дата: 15.06.13 19:56
Оценка:
_NN>Есть идеи ?
Чуть более многословно, но набирать проще и более понятно, имхо.

yieldmany items
Re[2]: foreach + yield
От: _NN_ www.nemerleweb.com
Дата: 15.06.13 20:17
Оценка:
Здравствуйте, STDray, Вы писали:

_NN>>Есть идеи ?

STD>может как в F# ?

STD>
STD>yield! items
STD>


Этот вариант выглядит хорошо и даже возможен на практике:
public macro YieldMany(seq)
syntax("yield", "!", seq)
{
  <[ foreach(s in $seq) yield s; ]>
}


Только IDE не может понять что это нормальный код:
  F() : IEnumerable[int]
  {
    yield! [1,2]; // typing fails on finding the operator op_LogicalNot(list[int-])
  }


P.S.
Кстати, syntax("yield!") невозможен, грамматика такое запрещает: MacroClassGen.n.
Можно подумать как исправить этот недостаток
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: foreach + yield
От: Аноним  
Дата: 15.06.13 20:40
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Уже пробегала идея для автоматизация foreach + yield: url=http://www.rsdn.ru/forum/nemerle/4806737
Автор: hi_octane
Дата: 05.07.12

_NN>Как показывает личная практика фича нужна.

_NN>Вопрос какой синтаксис выглядит более очевидным ?

_NN>В Python ,например, используется: 'yield from x'.
_NN>Но в Nemerle мне кажется это может запутать.

_NN>Может быть что-то в стиле:

_NN>
_NN>yield ..a;
_NN>


_NN>Есть идеи ?


дык yields,

macro Yields (expr) syntax ("yields", expr)

<[ foreach(e in $expr) yield e;]>
Re: foreach + yield
От: _NN_ www.nemerleweb.com
Дата: 16.06.13 20:24
Оценка:
Здравствуйте, _NN_, Вы писали:

Голосование
Автор: _NN_
Дата: 17.06.13
Вопрос: Какой синтаксис лучше использовать в Nemerle для foreach(item in col) yield item;
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: foreach + yield
От: Аноним  
Дата: 17.06.13 07:04
Оценка:
Здравствуйте, _NN_, Вы писали:

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


_NN>Голосование
Автор: _NN_
Дата: 17.06.13
Вопрос: Какой синтаксис лучше использовать в Nemerle для foreach(item in col) yield item;


а где Yield ..a;
Re: foreach + yield
От: artelk  
Дата: 17.06.13 12:31
Оценка:
Здравствуйте, _NN_, Вы писали:

Еще вариант: yieldseq
Re: foreach + yield
От: hi_octane Беларусь  
Дата: 17.06.13 14:00
Оценка: +1 -1
_NN>Есть идеи ?

Может лучше оставить просто слово yield и пусть сам компилятор проверяет типы и возвращает коллекцию поштучно? А в редком случае когда правильного варианта нет, пусть пользователь распишет foreach? Очередное ключевое слово непонятно зачем для очевидной штуки городить.
Re[2]: foreach + yield
От: Аноним  
Дата: 17.06.13 14:05
Оценка:
Здравствуйте, hi_octane, Вы писали:

_NN>>Есть идеи ?


_>Может лучше оставить просто слово yield и пусть сам компилятор проверяет типы и возвращает коллекцию поштучно? А в редком случае когда правильного варианта нет, пусть пользователь распишет foreach? Очередное ключевое слово непонятно зачем для очевидной штуки городить.


СОГЛАСЕН
Re[3]: foreach + yield
От: hi_octane Беларусь  
Дата: 17.06.13 14:48
Оценка:
А>СОГЛАСЕН

Главное чтобы неочевидных косяков не осталось, типа:

YieldFunc[T](t:T):IEnumerable[object]
{
  yield t;
}


При T = object[] будет иметь не то поведение, какое будет иметь:

YieldFunc(t:object[]):IEnumerable[object]
{
  yield t;
}


Что может ставить в тупик.
Re[4]: foreach + yield
От: _NN_ www.nemerleweb.com
Дата: 17.06.13 17:09
Оценка:
Здравствуйте, hi_octane, Вы писали:

А>>СОГЛАСЕН


_>Главное чтобы неочевидных косяков не осталось, типа:

Ну вот, сейчас yield явно выдает одно значение, а тут вместо одного "случайно" будет последовательность.
Есть конечно хак вида:
YieldFunc(t:object[]):IEnumerable[object]
{
  yield [t]; // Пакуем а yield неявно распакует :)
}


Но насколько это очевидно ?
Мне кажется проще тогда иметь явный синтаксис происходящего.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: foreach + yield
От: hi_octane Беларусь  
Дата: 17.06.13 20:49
Оценка:
_NN>Ну вот, сейчас yield явно выдает одно значение, а тут вместо одного "случайно" будет последовательность.
_NN>Есть конечно хак вида:
_NN>
_NN>YieldFunc(t:object[]):IEnumerable[object]
_NN>{
_NN>  yield [t]; // Пакуем а yield неявно распакует :)
_NN>}
_NN>


Этот случай ошибкой времени компиляции разруливается, так как t приводится к IEnumerable[object] и поэлементно и целиком. А на generic'е временем компиляции не отделаешься.
Re[2]: foreach + yield
От: Ziaw Россия  
Дата: 19.06.13 15:17
Оценка:
Здравствуйте, hi_octane, Вы писали:

_>Может лучше оставить просто слово yield и пусть сам компилятор проверяет типы и возвращает коллекцию поштучно? А в редком случае когда правильного варианта нет, пусть пользователь распишет foreach? Очередное ключевое слово непонятно зачем для очевидной штуки городить.


Это очень плохой вариант.

1) Не очевидно. Два совершенно разных по семантике действия выглядят одинаково. Их не отличить друг от друга.
2) Если вдруг какой-то тип начнет реализовывать IEnumerable, какой-то код может сломаться черт знает в каком месте, причем поломка может вылезти только в рантайме.
3) Что если я действительно хочу сделать yield IEnumerable? Одним значением.

Контринтуитивно и совершенно не способствует чтению кода.
Re: foreach + yield = yieldmany ?
От: _NN_ www.nemerleweb.com
Дата: 20.06.13 18:25
Оценка:
yieldmany лидирует с большим отрывом.

Я склоняюсь к тому что лучше не вводить лишнюю неопределенность.

Добавляем или есть еще предложения ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: foreach + yield = yieldmany ?
От: hi_octane Беларусь  
Дата: 21.06.13 09:34
Оценка:
_NN>Добавляем или есть еще предложения ?

Фильтра нет, так что это как бы не many а all. Но люди уже проголосовали, и yieldall никто даже не предложил, так что пили yieldmany. Уж всяко лучше чем какой-нить хитрый восклицательный знак.
Re[3]: foreach + yield = yieldmany ?
От: _NN_ www.nemerleweb.com
Дата: 21.06.13 10:32
Оценка:
Здравствуйте, hi_octane, Вы писали:

_NN>>Добавляем или есть еще предложения ?


_>Фильтра нет, так что это как бы не many а all. Но люди уже проголосовали, и yieldall никто даже не предложил, так что пили yieldmany. Уж всяко лучше чем какой-нить хитрый восклицательный знак.


Мы никуда не спешим, а делать необдуманно нехорошо
Насчет фильтра действительно интересная идея.

Можно сравнить на простом примере , что яснее выражает суть:
yieldall F.Where(_ > 1)
yieldall F.SelectMany(p => p + 1)
// vs.
yieldmany F.Where(_ > 1)
yieldmany F.SelectMany(p => p + 1)
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: foreach + yield
От: _NN_ www.nemerleweb.com
Дата: 10.09.13 14:06
Оценка: 9 (1)
В общем предлагаю следующий макрос:

namespace Nemerle.Core
{
  macro YieldAll(seq : PExpr)
  syntax ("yield", "..", seq) 
  {
    <[ foreach(val in $seq) yield val; ]>
  }
}


Демонстрация работы:

module M
{
  F() : IEnumerable[int]
  {
    def a = [1,2,3];
    
    yield 1;
    yield ..a;
    yield 2;
  }
}


Если все за, можно внести в компилятор.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: foreach + yield
От: Аноним  
Дата: 10.09.13 14:27
Оценка:
Здравствуйте, _NN_, Вы писали:

Лучше такие вещи не вносить, так как не ясно на сколько они востребованы.
Re[3]: foreach + yield
От: ionoy Эстония www.ammyui.com
Дата: 10.09.13 15:07
Оценка: +1
Здравствуйте, Аноним, Вы писали:

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


А>Лучше такие вещи не вносить, так как не ясно на сколько они востребованы.


yield последовательностей даже в C# частенько просят. Так почему бы в Немерле не добавить?
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[4]: foreach + yield
От: VladD2 Российская Империя www.nemerle.org
Дата: 10.09.13 20:35
Оценка:
Здравствуйте, ionoy, Вы писали:

I>yield последовательностей даже в C# частенько просят. Так почему бы в Немерле не добавить?


В компьютейшон-експрешонах используется yieldcomp. Почему бы его не использовать для единообразия?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[5]: foreach + yield
От: catbert  
Дата: 11.09.13 07:42
Оценка: +2
Здравствуйте, VladD2, Вы писали:

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


I>>yield последовательностей даже в C# частенько просят. Так почему бы в Немерле не добавить?


VD>В компьютейшон-експрешонах используется yieldcomp. Почему бы его не использовать для единообразия?


Лучше yieldcomp заменить на yield.. тогда.
Re[6]: foreach + yield
От: VladD2 Российская Империя www.nemerle.org
Дата: 12.09.13 13:40
Оценка:
Здравствуйте, catbert, Вы писали:

C>Лучше yieldcomp заменить на yield.. тогда.


Боюсь, что могут возникнуть проблемы с парсингом.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[7]: foreach + yield
От: _NN_ www.nemerleweb.com
Дата: 12.09.13 15:24
Оценка:
Здравствуйте, VladD2, Вы писали:

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


C>>Лучше yieldcomp заменить на yield.. тогда.


VD>Боюсь, что могут возникнуть проблемы с парсингом.

Точно возникнут ?
Ну и как бы никто не заставляем трогать.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[8]: foreach + yield
От: CodingUnit Россия  
Дата: 12.09.13 15:51
Оценка: +1
Здравствуйте, _NN_, Вы писали:

C>>>Лучше yieldcomp заменить на yield.. тогда.


VD>>Боюсь, что могут возникнуть проблемы с парсингом.


Лучше чем эти неоднозначные двоеточия yieldcomp или yieldmany. yieldcomp все же в computation expressions назван так из за самих comp expression отсюда comp, но у нас по контексту просто выдача многих, можно yieldmany, но точно не yield.. которое ни о чем не говорит и ничего общего не имеет со сплайсами ..$expr потому что только в сплайсах ..$ точки имеют место.
Re[9]: foreach + yield
От: _NN_ www.nemerleweb.com
Дата: 12.09.13 16:50
Оценка:
Здравствуйте, CodingUnit, Вы писали:

Тогда уже yieldall , ведь мы возвращаем все элементы коллекции.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[10]: foreach + yield
От: CodingUnit Россия  
Дата: 12.09.13 16:51
Оценка:
Здравствуйте, _NN_, Вы писали:

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


_NN>Тогда уже yieldall , ведь мы возвращаем все элементы коллекции.


Ну или yieldall
Re: foreach + yield
От: ionoy Эстония www.ammyui.com
Дата: 12.09.13 16:59
Оценка:
Здравствуйте, _NN_, Вы писали:

Предлагаю закрытое голосование. Каждый, кто хочет отметиться, пишет ответ с вариантом за который он голосует. Голоса учитываются только от людей, которые хоть как-то с Немерле используют или использовали.
Через месяц (чтобы все успели прочитать) подводим результаты.

Я голосую за:

yield ..lst;
www.livexaml.com
www.ammyui.com
www.nemerleweb.com
Re[2]: foreach + yield
От: Аноним  
Дата: 12.09.13 17:20
Оценка:
Здравствуйте, ionoy, Вы писали:

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


yield ..lst;

использовал пока работали винформы.
Re[2]: foreach + yield
От: CodingUnit Россия  
Дата: 12.09.13 18:43
Оценка:
Здравствуйте, ionoy, Вы писали:

я голосую за yieldall
Re[2]: foreach + yield
От: _NN_ www.nemerleweb.com
Дата: 12.09.13 19:36
Оценка:
Здравствуйте, ionoy, Вы писали:

Я больше сколняюсь к yield .. чем yieldall.

Кроме того синтаксис .. можно будет в будущем применить для других целей и это будет консистентно.
Например синтаксис для раскрытия туплов (когда туплы не будут самораскрываться в будущем )

F(a : int, b : string) : void {}

def x = (1, "a");
// F(x); // сейчас можно так, но лучше бы нельзя было =)
F(..x); // Будущий синтаксис
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[10]: foreach + yield
От: VladD2 Российская Империя www.nemerle.org
Дата: 13.09.13 12:39
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Тогда уже yieldall , ведь мы возвращаем все элементы коллекции.


Можно и так. По мне так что в лоб, что по лбу.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.