По поводу foreach / else
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.10 13:56
Оценка: 7 (1)
В ревизиях 9018 и 9019 появились новые макросы foreach / else, while / else.
Эти конструкции создают неоднозначность с if / else, что приводит к ломающим изменениям и заставляет писать лишние скобки.

Уверен, что конструкция:
if (x)
  foreach (y in ys)
    z(y);
else
  someElse();


применяется чаше чем:
foreach (y in ys)
  z(y);
else
  someElse();


Может быть лучше сделать синтаксис другим? Например, можно сделать так:
foreach (y in ys)
  z(y);
loop else
  someElse();
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: По поводу foreach / else
От: catbert  
Дата: 22.07.10 14:12
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>В ревизиях 9018 и 9019 появились новые макросы foreach / else, while / else.

VD>Эти конструкции создают неоднозначность с if / else, что приводит к ломающим изменениям и заставляет писать лишние скобки.

А что они делают и для чего понадобились?
Re: По поводу foreach / else
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 22.07.10 14:13
Оценка: :)
Здравствуйте, VladD2, Вы писали:

VD>Может быть лучше сделать синтаксис другим? Например, можно сделать так:

VD>
VD>foreach (y in ys)
VD>  z(y);
VD>loop else
VD>  someElse();
VD>


А так?

foreach (y in ys)
  z(y);
fiasco
  someElse();
Re: По поводу foreach / else
От: nikov США http://www.linkedin.com/in/nikov
Дата: 22.07.10 14:16
Оценка: 70 (4) +2
Здравствуйте, VladD2, Вы писали:

VD>Может быть лучше сделать синтаксис другим? Например, можно сделать так:

VD>
VD>foreach (y in ys)
VD>  z(y);
VD>loop else
VD>  someElse();
VD>


Может быть, так?

foreach (y in ys)
  z(y);
otherwise
  someElse();
Re[2]: По поводу foreach / else
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.10 14:30
Оценка:
Здравствуйте, catbert, Вы писали:

C>А что они делают и для чего понадобились?


Мне кажется это ясно из подписи к комиту и прилагаемых тестов:
http://code.google.com/p/nemerle/source/detail?r=9018
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: По поводу foreach / else
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.10 14:34
Оценка:
Здравствуйте, Mystic, Вы писали:

M>А так?


M>
M>foreach (y in ys)
M>  z(y);
M>fiasco
M>  someElse();
M>


Это как из кроссворда: Слово из шести букв, вторая буква "и", означающее "крушение всех надежд".
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: По поводу foreach / else
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.10 14:36
Оценка:
Здравствуйте, nikov, Вы писали:

N>Может быть, так?


N>
N>foreach (y in ys)
N>  z(y);
N>otherwise
N>  someElse();
N>


Можно и так. Только фиаско не надо. А то я от смеха умру.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: По поводу foreach / else
От: _nn_ www.nemerleweb.com
Дата: 22.07.10 14:38
Оценка:
Здравствуйте, nikov, Вы писали:

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


VD>>Может быть лучше сделать синтаксис другим? Например, можно сделать так:

VD>>
VD>>foreach (y in ys)
VD>>  z(y);
VD>>loop else
VD>>  someElse();
VD>>


N>Может быть, так?


N>
N>foreach (y in ys)
N>  z(y);
N>otherwise
N>  someElse();
N>


Если otherwise нигде не занято, можно взять его.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: По поводу foreach / else
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.10 14:44
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Если otherwise нигде не занято, можно взять его.


Оно используется в assertions.n, но по идее конфликтов быть не должно. Или они будут настолько редки, что этим можно пренебречь.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: По поводу foreach / else
От: _nn_ www.nemerleweb.com
Дата: 22.07.10 14:57
Оценка:
Здравствуйте, VladD2, Вы писали:

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


__>>Если otherwise нигде не занято, можно взять его.


VD>Оно используется в assertions.n, но по идее конфликтов быть не должно. Или они будут настолько редки, что этим можно пренебречь.


А если не секрет как можно создать там конфликт ?
У меня никак for/while/foreach не удается вписать в блок require.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: По поводу foreach / else
От: Mystic Украина http://mystic2000.newmail.ru
Дата: 22.07.10 15:42
Оценка: +1
Здравствуйте, VladD2, Вы писали:

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


M>>
M>>foreach (y in ys)
M>>  z(y);
M>>fiasco
M>>  someElse();
M>>


VD>Это как из кроссворда: Слово из шести букв, вторая буква "и", означающее "крушение всех надежд".

VD>

Ну да. Вообще-то я искал английский аналог для нашего родного "облом". Чтобы было с юмором (а это всегда лучше запоминается и лучше акцентируется). Плюс слово достаточно редкое, вряд ли я припомню хотя бы один идентификатор с таким именем. otherwise более официально.
Re[5]: По поводу foreach / else
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.07.10 15:45
Оценка:
Здравствуйте, _nn_, Вы писали:

__>А если не секрет как можно создать там конфликт ?


Х.з. когда создастся, то сам увидишь .

__>У меня никак for/while/foreach не удается вписать в блок require.


А что этому мешает? Он не принимает void-выражения?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: По поводу foreach / else
От: _nn_ www.nemerleweb.com
Дата: 25.07.10 06:03
Оценка: 45 (1)
Здравствуйте, VladD2, Вы писали:

Переделал на foreach..otherwise
Теперь все должно работать без неоднозначностей.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: По поводу foreach / else
От: _nn_ www.nemerleweb.com
Дата: 25.07.10 06:05
Оценка:
Здравствуйте, VladD2, Вы писали:

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


__>>А если не секрет как можно создать там конфликт ?


VD>Х.з. когда создастся, то сам увидишь .


__>>У меня никак for/while/foreach не удается вписать в блок require.


VD>А что этому мешает? Он не принимает void-выражения?


Да.
class A
{
  public F(i : int) : int
    requires ()
  {
    i
  }
}


Error: expected bool, got void in matched value: the types void and bool are not compatible [simple unify]


А блок тоже нельзя вставить:
class A
{
  public F(i : int) : int
    requires { i > 1 }
  {
    i
  }
}


Error: parse error near '{...}' group: expecting type declaration


Так что, конфликтов здесь никак не может быть.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: По поводу foreach / else
От: Иванков Дмитрий Россия  
Дата: 26.07.10 09:48
Оценка: 12 (1)
Здравствуйте, VladD2, Вы писали:

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


C>>А что они делают и для чего понадобились?


VD>Мне кажется это ясно из подписи к комиту и прилагаемых тестов:

VD>http://code.google.com/p/nemerle/source/detail?r=9018

то есть они делают совсем не то, что в питоне делают for-else (else-тело выполняется, если цикл не завершился break-ом) и while-else (выполняется, если цикл завершился по false == условие цикла), а выполняют else-тело, если основное тело не было вызвано ни разу. Все три варианта поведения мягко говоря не интуитивны. Как минимум, в документации должно быть отражено отличие от python.
Re[4]: По поводу foreach / else
От: _nn_ www.nemerleweb.com
Дата: 26.07.10 11:43
Оценка:
Здравствуйте, Иванков Дмитрий, Вы писали:

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


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


C>>>А что они делают и для чего понадобились?


VD>>Мне кажется это ясно из подписи к комиту и прилагаемых тестов:

VD>>http://code.google.com/p/nemerle/source/detail?r=9018

ИД> то есть они делают совсем не то, что в питоне делают for-else (else-тело выполняется, если цикл не завершился break-ом) и while-else (выполняется, если цикл завершился по false == условие цикла), а выполняют else-тело, если основное тело не было вызвано ни разу. Все три варианта поведения мягко говоря не интуитивны. Как минимум, в документации должно быть отражено отличие от python.


Насчет break-ов действительно не подумал.
Доделать не сложно
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[5]: По поводу foreach / else
От: _nn_ www.nemerleweb.com
Дата: 26.07.10 13:37
Оценка:
Здравствуйте, _nn_, Вы писали:

Оказалось немного запутанней чем я предполагал:

Вот новый макрос
  macro @while (cond, body, otherwiseBody)
  syntax ("while", "(", cond, ")", body, Optional("otherwise", otherwiseBody))
  {
    def otherwiseBody = otherwiseBody ?? <[ ]>;
    
    <[ 
      ($("_N_break" : global) : {
        def loop () : void
        {
          when ($cond)
          {
            ($("_N_continue" : global) : {
              $body
            }) : void;
            loop ()
          }
        }
        
        loop ();
        
        $otherwiseBody
      }) : void
    ]>
  }


Он прекрасно работает в коде и даже проходит тесты.

Одна загвоздка в нем. Его нельзя использовать в макросах.
macro FFF(c)
  {
    <[
      while (false) {}
    ]>
  }

Error: parse error near '{...}' group: unexpected token after expression in sequence (you forget a closing bracket?).


Как всегда вопросы: кто виноват и что делать ?
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[6]: По поводу foreach / else
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 13:40
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Он прекрасно работает в коде и даже проходит тесты.

__>Одна загвоздка в нем. Его нельзя использовать в макросах.
__>Как всегда вопросы: кто виноват и что делать ?

Насколько мне известно в квази-цитатах используется все тот же парсер, так что по идее если код компилируется вне цитаты, то в цитате тоже должен. Так что надо смотреть под отладчиком что происходит.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[6]: По поводу foreach / else
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 13:42
Оценка:
Здравствуйте, _nn_, Вы писали:

__>Как всегда вопросы: кто виноват и что делать ?


А почему ты не остановился на отдельном макросе?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[4]: По поводу foreach / else
От: VladD2 Российская Империя www.nemerle.org
Дата: 26.07.10 13:47
Оценка:
Здравствуйте, Иванков Дмитрий, Вы писали:

ИД> то есть они делают совсем не то, что в питоне делают for-else (else-тело выполняется, если цикл не завершился break-ом)


Э... а разве не в случае когда в коллекции нет элементов? Кстати, я бы еще хотел чтобы чтобы на null тоже else срабатывал.

ИД>и while-else (выполняется, если цикл завершился по false == условие цикла), а выполняют else-тело, если основное тело не было вызвано ни разу.


Тут я вообще ничего не понял. Мне казалось, то любой вид цикла должен вызвать else если основной цикл не сработал ни разу. Зачем еще какие-то "завершился по false == условие цикла"?

ИД>Все три варианта поведения мягко говоря не интуитивны. Как минимум, в документации должно быть отражено отличие от python.


В общем, я стал понимать еще меньше чем в начале. Можно объяснить все более подробно и доступно (для тех кто с Питоном не на "ты")?
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.