for - foreach
От: _nn_ www.nemerleweb.com
Дата: 23.01.11 13:25
Оценка: -1
На сегодня имеем 'for' в стиле С# и foreach с мощным синтаксисом, который умеет итерировать как и for.

Примеры:
// 1.
for (mutable i = 1; i <= 10; ++i)
foreach (i in [1 .. 10])

// 2.
for (mutable i = 0; i < 10; ++i) 
foreach (i in [0 .. 10 - 1]) 

// 3.
for (mutable i = 0; i < 10; i += 2) 
foreach (i in [0 , 2 .. 10 - 1])


Предложение:
1. Перенести 'for' в стиле С в Nemerle.Imperative.
2. Переименовать foreach в for.
3. Изменить синтаксис с шагом в foreach на менее конфликтный:
Сейчас неясно что должен выдавать такой код: foreach (i in [1, 1 .. 3])

for (i in [1 .. 10]) // 1..10 // шак: 1
for (i in [1 .. 10 .. 2]) // шаг: 2
for (i in [10 .. 1 .. -1]) // шаг: -1


4. Вместо ".." использовать операции сравнения < , <= , > , >= для более понятного кода.
Это улучшит итерации где надо писать Length — 1.

foreach (i in [1 .. 10])        // 1..10 , шаг 1
for     (i in [1 <= 10])        // 1..10 , шаг 1

foreach (i in [1 .. 10 - 1])    // 1..9 , шаг 1
for     (i in [1 <  10])        // 1..9  , шаг 1

foreach (i in [10, 9 .. 1])     // 10..1 , шаг -1
for     (i in [10 >= 1])        // 10..1 , шаг -1

foreach (i in [10, 9 .. 1 + 1]) // 10..2 , шаг -1
for     (i in [10 >  1])        // 10..2  , шаг -1

foreach (i in [1, 3 .. 10])     // 1..10 , шаг 2
for     (i in [1 <= 10 .. 2])   // 1..10 , шаг 2

foreach (i in [1, 4 .. 10 - 1]) // 1..9 , шаг 3
for     (i in [1 <  10 .. 3])   // 1..9  , шаг 3


P.S.
Предложение касается в большей степени Nemerle 2 , чем 1.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: for - foreach
От: BogdanMart Украина  
Дата: 23.01.11 13:37
Оценка:
Здравствуйте, _nn_, Вы писали:

__>На сегодня имеем 'for' в стиле С# и foreach с мощным синтаксисом, который умеет итерировать как и for.


__>Примеры:

__>[nemerle]
__>// 1.
__>for (mutable i = 1; i <= 10; ++i)
__>foreach (i in [1 .. 10])

Ну не совсем, например тот-же код из первого примера после декомпиляции віглядит так:

    public void @for()
    {
        int i = 0;
        i = 1;
        while (true)
        {
            if (i > 10)
            {
                break;
            }
            Console.WriteLine(i);
            i++;
        }
    }

    public void @foreach()
    {
        int num = 0;
        bool flag = false;
        int num3 = 0;
        num = 1;
        int num2 = 10;
        flag = num <= num2;
        num3 = num2 - 1;
        bool flag2 = num3 > num2;
        while (flag)
        {
            num2 = num;
            if (flag2)
            {
                flag = num >= num3;
            }
            else
            {
                flag = num <= num3;
            }
            num++;
            Console.WriteLine(num2);
        }
    }


как-бы и ёжу понятно, что for оптимальнее.

но использовать вместо кочевого слова forach for было-бы неплохо, ведь по синтаксису можно определить что хочет пользователь.
Re[2]: for - foreach
От: hardcase Пират http://nemerle.org
Дата: 23.01.11 13:42
Оценка: +1
Здравствуйте, BogdanMart, Вы писали:

BM>как-бы и ёжу понятно, что for оптимальнее.


Это лечится докручиванием foreach-макроса, правда подобный код нужен совсем нечасто.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: for - foreach
От: _nn_ www.nemerleweb.com
Дата: 23.01.11 14:21
Оценка:
Здравствуйте, hardcase, Вы писали:

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


BM>>как-бы и ёжу понятно, что for оптимальнее.


H>Это лечится докручиванием foreach-макроса, правда подобный код нужен совсем нечасто.


Конкретно нужно править Util.n.
Можно просто вызывать for из кода и будет тот же самый оптимальный код.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: for - foreach
От: WolfHound  
Дата: 23.01.11 15:46
Оценка:
Здравствуйте, _nn_, Вы писали:

Это ничего не даст.
Я против.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re: for - foreach
От: VladD2 Российская Империя www.nemerle.org
Дата: 23.01.11 15:51
Оценка:
Здравствуйте, _nn_, Вы писали:

__>На сегодня имеем 'for' в стиле С# и foreach с мощным синтаксисом, который умеет итерировать как и for.


__>Предложение:

__>1. Перенести 'for' в стиле С в Nemerle.Imperative.
__>2. Переименовать foreach в for.
__>3. Изменить синтаксис с шагом в foreach на менее конфликтный:
__>Сейчас неясно что должен выдавать такой код: foreach (i in [1, 1 .. 3])

Не надо этого никому не нужного новаторства. Тем более на надо делать конфликтующих операторов. Большая часть тех кто начинает осваивать Nemerle — это люди с опытом C#, Java или C++. Причем первых явно большинство. Так вот не надо усложнять им жизнь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: for - foreach
От: _nn_ www.nemerleweb.com
Дата: 23.01.11 15:57
Оценка:
Здравствуйте, VladD2, Вы писали:

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


__>>На сегодня имеем 'for' в стиле С# и foreach с мощным синтаксисом, который умеет итерировать как и for.


__>>Предложение:

__>>1. Перенести 'for' в стиле С в Nemerle.Imperative.
__>>2. Переименовать foreach в for.
__>>3. Изменить синтаксис с шагом в foreach на менее конфликтный:
__>>Сейчас неясно что должен выдавать такой код: foreach (i in [1, 1 .. 3])

VD>Не надо этого никому не нужного новаторства. Тем более на надо делать конфликтующих операторов. Большая часть тех кто начинает осваивать Nemerle — это люди с опытом C#, Java или C++. Причем первых явно большинство. Так вот не надо усложнять им жизнь.


А где конфликт тут ?
В Java вон оставили for , а семантика foreach и никто не жалуется.

Я не предлагаю убрать старый for совсем, а перенести его в другой namespace.
Ведь break, continue и так недоступны по умолчанию.

Насчет названия, можно оставить foreach.
Но указания диапазона в foreach все равно нет в C#. Это хотелось бы улучшить.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: for - foreach
От: Ziaw Россия  
Дата: 24.01.11 04:40
Оценка: +1
Здравствуйте, _nn_, Вы писали:

__>На сегодня имеем 'for' в стиле С# и foreach с мощным синтаксисом, который умеет итерировать как и for.


Мне видится самым прямым решением расширить синтаксис list comprehensions, правда синтаксис нужен более интуитивный. Тогда в foreach можно будет добавить оптимизацию, раскрывающую в таких ситуациях его в обычный цикл. Убирать for не вижу смысла, он не более императивный чем foreach.
Re: for - foreach
От: nCdy http://nCdy.org/
Дата: 24.01.11 05:22
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Предложение:

__>1. Перенести 'for' в стиле С в Nemerle.Imperative.
Нейтрально.
__>2. Переименовать foreach в for.
двояко, for i in T мне нравится больше, хотя семантически foreach правильнее
__>3. Изменить синтаксис с шагом в foreach на менее конфликтный:
[1 .. 10 .. 2] — это ужасно ) Звучит как сначала дойдём до 10 , потом спустимся к 2
__>4. Вместо ".." использовать операции сравнения < , <= , > , >= для более понятного кода.
Я против )
But I don't really mean it
Re[2]: for - foreach
От: _nn_ www.nemerleweb.com
Дата: 24.01.11 08:03
Оценка:
Здравствуйте, Ziaw, Вы писали:

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


__>>На сегодня имеем 'for' в стиле С# и foreach с мощным синтаксисом, который умеет итерировать как и for.


Z>Мне видится самым прямым решением расширить синтаксис list comprehensions, правда синтаксис нужен более интуитивный. Тогда в foreach можно будет добавить оптимизацию, раскрывающую в таких ситуациях его в обычный цикл. Убирать for не вижу смысла, он не более императивный чем foreach.


Как это связанно ?
List comprehension и foreach различны в семантике.
Первый возвращает список, а второй возвращает void.
Итого в List comprehension мы всегда создаем список с результатом, а в foreach никогда.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: for - foreach
От: BogdanMart Украина  
Дата: 24.01.11 10:11
Оценка:
Здравствуйте, _nn_, Вы писали:

__>На сегодня имеем 'for' в стиле С# и foreach с мощным синтаксисом, который умеет итерировать как и for.


__>Предложение:

__>1. Перенести 'for' в стиле С в Nemerle.Imperative.
__>2. Переименовать foreach в for.
__>3. Изменить синтаксис с шагом в foreach на менее конфликтный:
__>Сейчас неясно что должен выдавать такой код: foreach (i in [1, 1 .. 3])

Кстати не все, что можно сделать фором ты сделаешь форичем, ведь фор можно использовать и для других целей, так как оно позволяет выполнять любой код в своих параметрах

Например
for(mutable reader = command.ExecuteReader(sqlCommand); reader.Read()
{}

//Пример высосаны из пальца, так как там еще надо диспоуз вызвать, но суть в том что фор это не просто перечисление натуральных чисел.


+ какое там безболезненно, for и foreach используються в огромном количестве кода на Nemerle, думаю для многих такая "фитча" превратиться в неплохой нежданчик.

Но вот если оставить фору свой синтаксис, но сделать чтобы фор модно было использовать как форич -- это +1 (т.е. оставить на месте форич(для совместимости), но сделать чтобы фор парсил свой синтаксис и работал как фор и как форич, ато писать форич очень впадло)

и еще зделать, чтобы фор автоматом дописывал mutable, если не написал разработчик.
Re[2]: for - foreach
От: _nn_ www.nemerleweb.com
Дата: 24.01.11 10:23
Оценка:
Здравствуйте, BogdanMart, Вы писали:

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


__>>На сегодня имеем 'for' в стиле С# и foreach с мощным синтаксисом, который умеет итерировать как и for.


__>>Предложение:

__>>1. Перенести 'for' в стиле С в Nemerle.Imperative.
__>>2. Переименовать foreach в for.
__>>3. Изменить синтаксис с шагом в foreach на менее конфликтный:
__>>Сейчас неясно что должен выдавать такой код: foreach (i in [1, 1 .. 3])

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


BM>Например

BM>for(mutable reader = command.ExecuteReader(sqlCommand); reader.Read()
BM>{}

BM>//Пример высосаны из пальца, так как там еще надо диспоуз вызвать, но суть в том что фор это не просто перечисление натуральных чисел.

Я как раз и против такого использования for.
Такой код обычно не по делу.
Через while можно получить аналогичное поведение.
А если что-то частое, то для этого методы и макросы.

В любом случае этот макрос желательней переместить в Nemerle.Imperative, чтобы было меньше соблазна.

BM>+ какое там безболезненно, for и foreach используються в огромном количестве кода на Nemerle, думаю для многих такая "фитча" превратиться в неплохой нежданчик.

Для этого документация конечно.

BM>Но вот если оставить фору свой синтаксис, но сделать чтобы фор модно было использовать как форич -- это +1 (т.е. оставить на месте форич(для совместимости), но сделать чтобы фор парсил свой синтаксис и работал как фор и как форич, ато писать форич очень впадло)

А тогда зачем foreach нужен будет ?
Взять тот же F#, там нет for-а как С , а foreach называется for. И для перечисления используется синтаксис for i = 1 to 10 .
Никто не жалуется что нет for-а в стиле C

BM>и еще зделать, чтобы фор автоматом дописывал mutable, если не написал разработчик.

А это наверное можно сделать, но тогда нельзя будет использовать for (def x = X(); x.HasValue; x.MoveNext())
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: for - foreach
От: WolfHound  
Дата: 24.01.11 14:04
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Итого в List comprehension мы всегда создаем список с результатом, а в foreach никогда.

А ты засунь List comprehension в foreach...
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: for - foreach
От: _nn_ www.nemerleweb.com
Дата: 24.01.11 14:19
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


__>>Итого в List comprehension мы всегда создаем список с результатом, а в foreach никогда.

WH>А ты засунь List comprehension в foreach...

И как это будет выглядеть ?
foreach (i in $[ x | x in [1 .. 10] ])


Или имелось ввиду так ?
foreach ($[ i | i in [1 .. 10] ])


Тогда точно надо другой синтаксис ведь оригинальный foreach выглядит проще
foreach (i in [1 .. 10])
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: for - foreach
От: Ziaw Россия  
Дата: 24.01.11 14:51
Оценка:
Здравствуйте, _nn_, Вы писали:

Z>>Мне видится самым прямым решением расширить синтаксис list comprehensions, правда синтаксис нужен более интуитивный. Тогда в foreach можно будет добавить оптимизацию, раскрывающую в таких ситуациях его в обычный цикл. Убирать for не вижу смысла, он не более императивный чем foreach.


__>Как это связанно ?

__>List comprehension и foreach различны в семантике.
__>Первый возвращает список, а второй возвращает void.
__>Итого в List comprehension мы всегда создаем список с результатом, а в foreach никогда.

Да, но семантически, не считая возможности изменения i внутри цикла
 
for (mitable i = 0; i < 10; i++) == foreach (i in $[0 .. 9])


Поэтому все твои предложения семантически реализуемы через list comprehensions. Потом дело оптимизации в таких случаев обойтись без генерации списка.
Re[4]: for - foreach
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.01.11 15:02
Оценка:
Здравствуйте, WolfHound, Вы писали:

__>>Итого в List comprehension мы всегда создаем список с результатом, а в foreach никогда.

WH>А ты засунь List comprehension в foreach...

Он там и используется. Макрос foreach специальным образом обрабатывает именно лист-компрешеншон.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: for - foreach
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.01.11 15:04
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Предложение:

__>1. Перенести 'for' в стиле С в Nemerle.Imperative.

Значит так, Nemerle 1.0 ПОЛНОСТЬЮ закрыт для изменений. Правятся только баги!

Все новшества попавшие в транк буду нещадно вычищать.

Я понятно выражаюсь?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: for - foreach
От: _nn_ www.nemerleweb.com
Дата: 24.01.11 15:06
Оценка:
Здравствуйте, VladD2, Вы писали:

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


__>>Предложение:

__>>1. Перенести 'for' в стиле С в Nemerle.Imperative.

VD>Значит. Так Nemerle 1.0 ПОЛНОСТЬЮ закрыт для изменений. Правятся только баги!


VD>Все новшества попавшие в транк буду нещадно вычищать.


VD>Я понятно выражаюсь?


Да мы уже вроде договорились, что фич в транк писаться не будет.
Это мысли на будущее.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: for - foreach
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.01.11 15:08
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Да мы уже вроде договорились, что фич в транк писаться не будет.

__>Это мысли на будущее.

Я на всякий пожарный предупреждаю. Мне уже надоело, что как только формируется стабильная версия которую можно зарелизить, появляется новая фича и тестирование приходится продолжать.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: for - foreach
От: _nn_ www.nemerleweb.com
Дата: 24.01.11 15:08
Оценка:
Здравствуйте, Ziaw, Вы писали:

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


Z>>>Мне видится самым прямым решением расширить синтаксис list comprehensions, правда синтаксис нужен более интуитивный. Тогда в foreach можно будет добавить оптимизацию, раскрывающую в таких ситуациях его в обычный цикл. Убирать for не вижу смысла, он не более императивный чем foreach.


__>>Как это связанно ?

__>>List comprehension и foreach различны в семантике.
__>>Первый возвращает список, а второй возвращает void.
__>>Итого в List comprehension мы всегда создаем список с результатом, а в foreach никогда.

Z>Да, но семантически, не считая возможности изменения i внутри цикла

Z>
 
Z>for (mitable i = 0; i < 10; i++) == foreach (i in $[0 .. 9])
Z>


Z>Поэтому все твои предложения семантически реализуемы через list comprehensions. Потом дело оптимизации в таких случаев обойтись без генерации списка.


А часто нужно менять счетчик внутри цикла ?
Если нужно то для этого лучше использовать while.

Так сегодня и можно писать foreach (i in $[0 .. 9])
Под list comprehension я понимаю $[ x | x in l ].
Тут не создается список по любому, foreach умеет обрабатывать эту конструкцию особо.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[2]: for - foreach
От: SergASh  
Дата: 24.01.11 15:29
Оценка: +1
Здравствуйте, BogdanMart, Вы писали:

BM>и еще зделать, чтобы фор автоматом дописывал mutable, если не написал разработчик.


Ну и нахрена это "зделать" скажите на милость? Изменяемых переменных должно быть поменьше. Если программист решил такую переменную использовать, то это должно быть явно видно, особенно когда код читает не его автор. От таких, с позволения сказать, оптимизаций вреда больше чем пользы.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.