goto
От: VladD2 Российская Империя www.nemerle.org
Дата: 17.05.13 17:41
Оценка: 30 (3)
Реализовал goto в виде макросов goto / label в пространстве имен Nemerle.Imperative.GoTo.

За одно поправил баги иногда приводящие к сообщению "non local goto".

Кроме того индексируемое свойство UserData теперь есть у MethodBuilder-ов. Так что в него можно сохранять данные относящиеся ко всему методу. Это свойство сбрасывается вначале типизации метода. Так что очищать специально его нет смысла.

Реализация.

Пример использования:
using System.Console;
using Nemerle.Imperative;
using Nemerle.Imperative.GoTo;

module Program
{
  Main(args : array[string]) : void
  {
    goto Start;
    label Label2;
    WriteLine("Label2:");
    goto End;
    label Start;
    WriteLine("Start:");
    
    when (args.Length == 0)
      goto Label1;
    
    WriteLine("args.Length != 0");
    return;
    
    label Label1;
    WriteLine("Label1:");

    goto Label2;
    label End;
    WriteLine("End:");
  }
}

/*
BEGIN-OUTPUT
Start:
Label1:
Label2:
End:
END-OUTPUT
*/
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re: goto
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 18.05.13 09:21
Оценка: 1 (1) :))
Здравствуйте, VladD2, Вы писали:

VD>Реализовал goto в виде макросов goto / label в пространстве имен Nemerle.Imperative.GoTo.


Ушла эпоха
Автор: IT
Дата: 08.06.02
...

... << RSDN@Home 1.2.0 alpha 5 rev. 72>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[2]: goto
От: _NN_ www.nemerleweb.com
Дата: 18.05.13 09:24
Оценка: :)
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>

Не так.
Не прошло и 11-ти лет...
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: goto
От: matumba  
Дата: 18.05.13 15:43
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>Реализовал goto в виде макросов goto / label в пространстве имен Nemerle.Imperative.GoTo.

VD> label Label2;

Меня одного смущает этот совсем "неметочный" синтаксис? Почему бы не использовать классическое двоеточие? (для облегчения жизни парсеру — ДВУМЯ обрамляющими двоеточиями)

:метка: чотаделаем;
Re[2]: goto
От: hardcase Пират http://nemerle.org
Дата: 18.05.13 21:28
Оценка:
Здравствуйте, matumba, Вы писали:

M>Меня одного смущает этот совсем "неметочный" синтаксис? Почему бы не использовать классическое двоеточие?


Конфликтует с именованными блоками.

M>:метка: чотаделаем;


Теперь берем любого разработчика и спрашиваем его, что означает этот синтаксис.
/* иЗвиНите зА неРовнЫй поЧерК */
Re[2]: goto
От: hardcase Пират http://nemerle.org
Дата: 18.05.13 21:31
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

KV>Ушла эпоха
Автор: IT
Дата: 08.06.02
...


Один наш общий знакомый зафигачил генератор кода на goto лапше
/* иЗвиНите зА неРовнЫй поЧерК */
Re[3]: goto
От: matumba  
Дата: 18.05.13 22:58
Оценка:
M>>Меня одного смущает этот совсем "неметочный" синтаксис? Почему бы не использовать классическое двоеточие?

H>Конфликтует с именованными блоками.


Что есть "именованные блоки" и зачем их именовать? Первый раз о них слышу.

M>>:метка: чотаделаем;


H>Теперь берем любого разработчика и спрашиваем его, что означает этот синтаксис.


Ты лучше спроси про квазицитирование — вот где настоящий брэйнфак! А двоеточие — так, забава.
Re[4]: goto
От: _NN_ www.nemerleweb.com
Дата: 19.05.13 06:09
Оценка:
Здравствуйте, matumba, Вы писали:

M>>>Меня одного смущает этот совсем "неметочный" синтаксис? Почему бы не использовать классическое двоеточие?


H>>Конфликтует с именованными блоками.


M>Что есть "именованные блоки" и зачем их именовать? Первый раз о них слышу.


Это то почему не было goto в немерле

using System.Console;

def value = myBlock: // Объявление блока кода
{
  foreach (i in [1 .. 10])
    foreach (x in [i .. i * i])
      when (x > 30)
        myBlock(x); // принудительный выход из блока кода.
  0;
}

WriteLine(value);
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[3]: goto
От: WolfHound  
Дата: 19.05.13 14:40
Оценка:
Здравствуйте, hardcase, Вы писали:

H>Один наш общий знакомый зафигачил генератор кода на goto лапше

Ты думаешь после разговора с кем эту картинку нарисовали?
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[5]: goto
От: matumba  
Дата: 19.05.13 22:18
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Это то почему не было goto в немерле


_NN>def value = myBlock: // Объявление блока кода

_NN> myBlock(x); // принудительный выход из блока кода.

Не, ну мрак же! А как же принцип "если что-то имеет разную сущность, то и выглядеть должно по-другому"? Да и метки — в классическом виде это просто теги к операторам, а здесь они возведены в ранг каких-то функций.
Лучше пусть не будет им.блоков, но метка будет с нормальным двоеточием. Поглядите как это сделано в Ди — и удобно, и понимабельно.
Re[6]: goto
От: uncommon Ниоткуда  
Дата: 20.05.13 00:48
Оценка:
Здравствуйте, matumba, Вы писали:

M>Не, ну мрак же! А как же принцип "если что-то имеет разную сущность, то и выглядеть должно по-другому"? Да и метки — в классическом виде это просто теги к операторам, а здесь они возведены в ранг каких-то функций.


В лиспе так и есть, теги:
(tagbody
  tag-or-compound-form*)
Re[6]: goto
От: _NN_ www.nemerleweb.com
Дата: 20.05.13 06:07
Оценка: 1 (1) +2
Здравствуйте, matumba, Вы писали:

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


_NN>>Это то почему не было goto в немерле


_NN>>def value = myBlock: // Объявление блока кода

_NN>> myBlock(x); // принудительный выход из блока кода.

M>Не, ну мрак же! А как же принцип "если что-то имеет разную сущность, то и выглядеть должно по-другому"? Да и метки — в классическом виде это просто теги к операторам, а здесь они возведены в ранг каких-то функций.

M>Лучше пусть не будет им.блоков, но метка будет с нормальным двоеточием. Поглядите как это сделано в Ди — и удобно, и понимабельно.
Не согласен.
Именованные блоки очень удобны.
В них есть только выход из блока.
Вы не можете пойти куда попало из них, в отличии от goto , который это позволяет.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re[7]: goto
От: matumba  
Дата: 20.05.13 21:53
Оценка:
Здравствуйте, _NN_, Вы писали:

_NN>Именованные блоки очень удобны. В них есть только выход из блока.

_NN>Вы не можете пойти куда попало из них, в отличии от goto , который это позволяет.

Ну тык гото для этого и придуман, что когда структурированным кодом задача решается слишком громоздко, можно "подшаманить" переходом в любое допустимое место! Т.е. нет смысла городить конструкции, меньшие по мощности, чем гото. В D, например, goto позволяет впрыгивать/выпрыгивать даже из if и for.
Re[8]: goto
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 21.05.13 16:37
Оценка: +1
Здравствуйте, matumba, Вы писали:

M>В D, например, goto позволяет впрыгивать/выпрыгивать даже из if и for.


Внезапно:

def jvalue = label1: {
  for(mutable i = 0; i < 100; i++)
    for(mutable j = 0; j < 100; j++)
      for(mutable n = 0; n < 100; n++)
         when (some_condition) label1(j)
  -1
}
// В jvalue - значение j на момент досрочного выхода из цикла или -1 в противном случае


... << RSDN@Home 1.2.0 alpha 5 rev. 72>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[8]: goto
От: kochetkov.vladimir Россия https://kochetkov.github.io
Дата: 21.05.13 16:46
Оценка: +1
Здравствуйте, matumba, Вы писали:

M>В D, например, goto позволяет впрыгивать/выпрыгивать даже из if и for.


Как имеющий непосредственное отношение к разработке инструментов статического анализа кода, за выделенное сразу сломал бы обе руки. И тем, кто придумал, и тем, кто использует

P.S: И ноги, пожалуй, тоже
... << RSDN@Home 1.2.0 alpha 5 rev. 72>>

[Интервью] .NET Security — это просто
Автор: kochetkov.vladimir
Дата: 07.11.17
Re[9]: goto
От: matumba  
Дата: 21.05.13 17:56
Оценка:
Здравствуйте, kochetkov.vladimir, Вы писали:

M>>В D, например, goto позволяет впрыгивать/выпрыгивать даже из if и for.


KV>Как имеющий непосредственное отношение к разработке инструментов статического анализа кода, за выделенное сразу сломал бы обе руки. И тем, кто придумал, и тем, кто использует


Как показывает практика, мир гораздо сложнее и умнее тех, кто считает, что может решать за других Аппля тому смешной пример.
Re[8]: goto
От: _NN_ www.nemerleweb.com
Дата: 21.05.13 19:03
Оценка: +1
Здравствуйте, matumba, Вы писали:

M>Ну тык гото для этого и придуман, что когда структурированным кодом задача решается слишком громоздко, можно "подшаманить" переходом в любое допустимое место! Т.е. нет смысла городить конструкции, меньшие по мощности, чем гото. В D, например, goto позволяет впрыгивать/выпрыгивать даже из if и for.


Так goto это более мощное средство по сравнению с именованными блоками.
Каждое средство для своего применения.

Я вот не припомню когда реально в коде нужен именно goto который прыгает куда попало.
А вам часто такое нужно ?
Вот выход из блока как раз удобно, лишнего не даст сделать.

Как я понимаю, тут goto понадобился для кодогенерации.
Хочу заметить не в самом коде генерации, а уже в генерируемом коде.
http://rsdn.nemerleweb.com
http://nemerleweb.com
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.