goto для state machine
От: Flem1234  
Дата: 22.04.11 11:44
Оценка:
Хочу сделать что-то типа континюэшенов, только которые сериализуюся и сохраняются на диск.

Но как сделать передачу управления внутри метода? goto в Немерле нет (или я просто не могу найти), а с неймед блоком не могу понять, как работать, и можно ли добиться чего-то похожего.

например преобразовывать:
workflow() : void
{
   WriteLine("Раз");
   save;             // Сохранили контекст
   WriteLine("Два");
}

в это:
workflow() : void
{
   __state = 1;
   when (__state == 1)  goto l1:
   when (__state == 2)  goto l2:
   l1:
   WriteLine("Раз");
   __state++; // save;
   // Тут сериализация и выход
   l2:
   WriteLine("Два");
}
Re: goto для state machine
От: BogdanMart Украина  
Дата: 22.04.11 12:08
Оценка:
Здравствуйте, Flem1234, Вы писали:

F>Хочу сделать что-то типа континюэшенов, только которые сериализуюся и сохраняются на диск.


F>Но как сделать передачу управления внутри метода? goto в Немерле нет (или я просто не могу найти), а с неймед блоком не могу понять, как работать, и можно ли добиться чего-то похожего.


match(__state)
{ 
  |1 =>
   WriteLine("Раз");
   __state++; // save;
   // Тут сериализация и выход

  |2 => WriteLine("Два");
}
Re: goto для state machine
От: catbert  
Дата: 22.04.11 12:11
Оценка:
Здравствуйте, Flem1234, Вы писали:

F>Но как сделать передачу управления внутри метода? goto в Немерле нет (или я просто не могу найти), а с неймед блоком не могу понять, как работать, и можно ли добиться чего-то похожего.


Nemerle так делает, когда генерирует код для yield. Но я вам не покажу, как он это делает, потому что не могу найти трансформацию в самом коде Nemerle.

VladD2 говорил, что yield вполне мог бы быть макросом, а это означает, что для реализации продолжений возможностей неймед-блоков должно хватить.
Re[2]: goto для state machine
От: hardcase Пират http://nemerle.org
Дата: 22.04.11 12:20
Оценка:
Здравствуйте, catbert, Вы писали:

C>Nemerle так делает, когда генерирует код для yield. Но я вам не покажу, как он это делает, потому что не могу найти трансформацию в самом коде Nemerle.


В любом случае этот код не для слабонервных.
А оператор Goto можно легко эмулировать с помощью TExpr.Goto (но это граничит с хаком).
/* иЗвиНите зА неРовнЫй поЧерК */
Re: goto для state machine
От: WolfHound  
Дата: 22.04.11 12:32
Оценка: 1 (1) +1
Здравствуйте, Flem1234, Вы писали:

F>Хочу сделать что-то типа континюэшенов, только которые сериализуюся и сохраняются на диск.

Добавь свой билдер к: https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/ComputationExpressions/
Там весь рокетсайнс уже сделан.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[2]: goto для state machine
От: VladD2 Российская Империя www.nemerle.org
Дата: 22.04.11 22:32
Оценка:
Здравствуйте, WolfHound, Вы писали:


F>>Хочу сделать что-то типа континюэшенов, только которые сериализуюся и сохраняются на диск.

WH>Добавь свой билдер к: https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/ComputationExpressions/
WH>Там весь рокетсайнс уже сделан.

С ComputationExpression не ясно как сохранять и восстанавливать состояние.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[3]: goto для state machine
От: WolfHound  
Дата: 23.04.11 07:37
Оценка:
Здравствуйте, VladD2, Вы писали:

VD>С ComputationExpression не ясно как сохранять и восстанавливать состояние.

Изучи как устроен Async. Там все сделано. Только сериализации нет.
В принципе если его допилить так чтобы его можно было сериализовать то будет все что нужно.
Теоритически это должно быть не сложно.
... << RSDN@Home 1.2.0 alpha 4 rev. 1472>>
Пусть это будет просто:
просто, как только можно,
но не проще.
(C) А. Эйнштейн
Re[4]: goto для state machine
От: VladD2 Российская Империя www.nemerle.org
Дата: 24.04.11 23:15
Оценка:
Здравствуйте, WolfHound, Вы писали:

VD>>С ComputationExpression не ясно как сохранять и восстанавливать состояние.

WH>Изучи как устроен Async. Там все сделано. Только сериализации нет.
WH>В принципе если его допилить так чтобы его можно было сериализовать то будет все что нужно.
WH>Теоритически это должно быть не сложно.

В теории, теория и практика эквивалентны, на практике — нет.

ЗЫ

Если сделать сериализацию состояния и клонирование, то можно сделать офигительный ворквлоу. На его основе можно будет очень легко реализовывать сайты с логикой визарда и поддержкой возврата назад/вперед. Ну, и много чего.
Есть логика намерений и логика обстоятельств, последняя всегда сильнее.
Re[2]: goto для state machine
От: Flem1234  
Дата: 26.04.11 13:59
Оценка:
Здравствуйте, WolfHound, Вы писали:

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


F>>Хочу сделать что-то типа континюэшенов, только которые сериализуюся и сохраняются на диск.

WH>Добавь свой билдер к: https://code.google.com/p/nemerle/source/browse/nemerle/trunk/snippets/ComputationExpressions/
WH>Там весь рокетсайнс уже сделан.

Хм, а можешь раскрыть тему? Я не могу понять, есть ли получение и работа с контекстом выполнения в Computation Expressions. В каком классе это происходит?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.