Реализовал goto в виде макросов goto / label в пространстве имен Nemerle.Imperative.GoTo.
За одно поправил баги иногда приводящие к сообщению "non local goto".
Кроме того индексируемое свойство UserData теперь есть у MethodBuilder-ов. Так что в него можно сохранять данные относящиеся ко всему методу. Это свойство сбрасывается вначале типизации метода. Так что очищать специально его нет смысла.
Здравствуйте, VladD2, Вы писали:
VD>Реализовал goto в виде макросов goto / label в пространстве имен Nemerle.Imperative.GoTo. VD> label Label2;
Меня одного смущает этот совсем "неметочный" синтаксис? Почему бы не использовать классическое двоеточие? (для облегчения жизни парсеру — ДВУМЯ обрамляющими двоеточиями)
M>>Меня одного смущает этот совсем "неметочный" синтаксис? Почему бы не использовать классическое двоеточие?
H>Конфликтует с именованными блоками.
Что есть "именованные блоки" и зачем их именовать? Первый раз о них слышу.
M>>:метка: чотаделаем;
H>Теперь берем любого разработчика и спрашиваем его, что означает этот синтаксис.
Ты лучше спроси про квазицитирование — вот где настоящий брэйнфак! А двоеточие — так, забава.
Здравствуйте, 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);
Здравствуйте, hardcase, Вы писали:
H>Один наш общий знакомый зафигачил генератор кода на goto лапше
Ты думаешь после разговора с кем эту картинку нарисовали?
... << RSDN@Home 1.2.0 alpha 5 rev. 62>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Здравствуйте, _NN_, Вы писали:
_NN>Это то почему не было goto в немерле
_NN>def value = myBlock: // Объявление блока кода _NN> myBlock(x); // принудительный выход из блока кода.
Не, ну мрак же! А как же принцип "если что-то имеет разную сущность, то и выглядеть должно по-другому"? Да и метки — в классическом виде это просто теги к операторам, а здесь они возведены в ранг каких-то функций.
Лучше пусть не будет им.блоков, но метка будет с нормальным двоеточием. Поглядите как это сделано в Ди — и удобно, и понимабельно.
Здравствуйте, matumba, Вы писали:
M>Не, ну мрак же! А как же принцип "если что-то имеет разную сущность, то и выглядеть должно по-другому"? Да и метки — в классическом виде это просто теги к операторам, а здесь они возведены в ранг каких-то функций.
Здравствуйте, matumba, Вы писали:
M>Здравствуйте, _NN_, Вы писали:
_NN>>Это то почему не было goto в немерле
_NN>>def value = myBlock: // Объявление блока кода _NN>> myBlock(x); // принудительный выход из блока кода.
M>Не, ну мрак же! А как же принцип "если что-то имеет разную сущность, то и выглядеть должно по-другому"? Да и метки — в классическом виде это просто теги к операторам, а здесь они возведены в ранг каких-то функций. M>Лучше пусть не будет им.блоков, но метка будет с нормальным двоеточием. Поглядите как это сделано в Ди — и удобно, и понимабельно.
Не согласен.
Именованные блоки очень удобны.
В них есть только выход из блока.
Вы не можете пойти куда попало из них, в отличии от goto , который это позволяет.
Здравствуйте, _NN_, Вы писали:
_NN>Именованные блоки очень удобны. В них есть только выход из блока. _NN>Вы не можете пойти куда попало из них, в отличии от goto , который это позволяет.
Ну тык гото для этого и придуман, что когда структурированным кодом задача решается слишком громоздко, можно "подшаманить" переходом в любое допустимое место! Т.е. нет смысла городить конструкции, меньшие по мощности, чем гото. В D, например, goto позволяет впрыгивать/выпрыгивать даже из if и for.
Здравствуйте, 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 в противном случае
Здравствуйте, matumba, Вы писали:
M>В D, например, goto позволяет впрыгивать/выпрыгивать даже из if и for.
Как имеющий непосредственное отношение к разработке инструментов статического анализа кода, за выделенное сразу сломал бы обе руки. И тем, кто придумал, и тем, кто использует
Здравствуйте, kochetkov.vladimir, Вы писали:
M>>В D, например, goto позволяет впрыгивать/выпрыгивать даже из if и for.
KV>Как имеющий непосредственное отношение к разработке инструментов статического анализа кода, за выделенное сразу сломал бы обе руки. И тем, кто придумал, и тем, кто использует
Как показывает практика, мир гораздо сложнее и умнее тех, кто считает, что может решать за других Аппля тому смешной пример.
Здравствуйте, matumba, Вы писали:
M>Ну тык гото для этого и придуман, что когда структурированным кодом задача решается слишком громоздко, можно "подшаманить" переходом в любое допустимое место! Т.е. нет смысла городить конструкции, меньшие по мощности, чем гото. В D, например, goto позволяет впрыгивать/выпрыгивать даже из if и for.
Так goto это более мощное средство по сравнению с именованными блоками.
Каждое средство для своего применения.
Я вот не припомню когда реально в коде нужен именно goto который прыгает куда попало.
А вам часто такое нужно ?
Вот выход из блока как раз удобно, лишнего не даст сделать.
Как я понимаю, тут goto понадобился для кодогенерации.
Хочу заметить не в самом коде генерации, а уже в генерируемом коде.