LINUX.ORG.RU

[генераторы][продолжения][кодогенерация][ФП ГМ] Как избавиться от yield?

 


0

1

Есть функция, читающая данные из потока. Задача состоит в том чтобы получить функцию, которая вместо вызова процедуры чтения просто ожидала поступления новых данных. В данном случае вполне достаточно просто заменить все вызовы процедуры чтения на yield и оставить остальное как есть.

Только одна проблемка: целевой язык не поддерживает yield, так что необходимо придумать как заменить этот код, учитывая что yield находиться внутри циклов и ветвлений и не только.

Ваши предложения?


Ответ на: комментарий от mashina

>целевой язык предлагается угадать?

Вообще-то это ECMAScript, но только им я ограничиваться не собираюсь.

SV0L0CH
() автор топика
Ответ на: комментарий от SV0L0CH

Выглядит страшно но при должном умении вся лишняя пунктуация скрывается.

bga_ ★★★★
()
Ответ на: комментарий от SV0L0CH

Переменные выносишь во внешний скоуп.
Создаешь контроллер var y = new ES3Yield(function(s, args){ return eval(s) }) передавая ему eval скопа переменных.
Код разбиваешь на блоки оканчивающиеся на yield.
Встроенные операторы меняешь на аналоги while(x) b -> y._while('x', b). yield x -> y._yield(x)
Блоки оборачиваешь в function(){ }
Подряд несколько идущих блоков объединяешь в тупл. [function(){ }, function(){ }]
Исполняемой функцией будет топовый блок обернутый в var _yRun = y._def(block)
Реальной функцией будет var _run = function(внешние аргументы){ if(y._isReset()){ инициализировать внутренние переменные внешними } return _yRun() };
По коду юнит тестов можно разобратся.

bga_ ★★★★
()
Ответ на: комментарий от bga_

Код просмотрел(в читабельном для меня виде он занял меньше четырёх сотен строк), выглядит приемлемо, хоть сам есчё не тестировал.

Интересует откуда он и каковы условия распостранения. Есть вероятность того что его придётся включить в проект(хотя буду стараться обойтись без этого).

SV0L0CH
() автор топика
Ответ на: комментарий от SV0L0CH

Код мой. Лицензия New BSD. Рад что кому то он понадобился еще.

bga_ ★★★★
()

1) native threads

2) CPS-преобразование

3) Использование green threads (например, на основе getcontext/swapcontext/makecontext)

А других вариантов как бы и не дано.

dmitry_vk ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.