Re: манипуляция с внутренними структурами Perl5 из Perl?

Serge simne at yandex.ua
Thu Apr 7 19:30:42 PDT 2011


Вот пример кода конечного автомата телефона:
в нем состояния реализованы как функции; receive это блокируемый запрос к ядру за сообщением; после receive идут паттерны сообщений; -> означает примерно то же что начало блока (конец блока обычно end).
Да, переключение состояния можно красиво сделать через goto, но как красиво хранить состояние? - Вот в данном примере состояние хранится красиво - соответствующая функция обращаясь к ядру (receive) останавливается как раз там где надо и где реально удобно, и когда приходит сообщение - ядро возвращает исполнение в правильную точку.
Причем как я уже говорил, у нас параллельно работает несколько потоков, и неизвестно, кому первому прийдет сообщение - как ядро может забрать со стека адрес возврата и записать другой адрес?
Очень не хочется делать перегрузку функций - неужели нельзя добиться чего-то близкого более простыми средствами?

off() ->
receive
on -> disconnected()
end

disconnected() ->
receive
{ring, Someone} ->
ringing(Someone);
pickupReceiver ->
dialing([])
off -> off()
end

ringing(Who) ->
receive
pickupReceiver -> talking(Who);
{abort, Someone} -> disconnected();
off -> off()
end

dialing(Digits) ->
receive
{key, backspace} ->
dialing(lists:tail(Digits));
{key, Digit} ->
dialing([Digit|Digits]);
hangUp -> disconnected();
off -> off()
after ?DIAL_TIMEOUT ->
connecting(lists:reverse(Digits))
end

07.04.2011, 16:56, "Alex Varyanick" <q at cono.org.ua>:
> 2011/4/7 Serge <simne at yandex.ua>;:
>
>>  Подскажите (стандартные желательно) модули, позволяющие манипулировать со стеком параметров Перл.
>>  Я хочу сделать чтобы при вызовах некоторой функции-ядра, она могла возвращать управление не тому кто ее вызвал а какой-то другой функции.
>>
>>  Например, есть функции sub1, sub2, sub3 и некоторое ядро. В начале работы ядро вызвало sub1; sub1 вызвала ядро на предмет сообщений, но ядру пока нечего ответить - ядро снимает со стека параметры от sub1 и снимает адрес возврата sub1 и вызывает sub2, итд.
>>  Получается что таким образом что sub1, sub2, sub3 находятся в некотором состоянии ожидания сообщения.
>>
>>  Допустим, пришло сообщение для sub2 - ядро должно выложить на стек параметров какие-то возвращаемые sub2 значения и адрес возврата в sub2 и выполнить return.
>>
>>  Я понимаю что это достаточно легко сделать написав на Си XS-расширение, но я хочу сделать чтобы код был максимально легко портируемым, без компиляции, лучше всего стандартным модулем.
>>
>>  Спасибо.
>
> perldoc -f goto
>
> Перл умеет красиво разворачивать стек.
>
> --
> Varyanick I. Alex
> icq: 102 575 440
> skype: cono..
> q at cono.org.ua



More information about the Kiev-pm mailing list