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
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.