В свое свободное время я работал на IronLua. Лексирование и разбор в данный момент сделано. Я как бы перестал работать над этим из-за разочарования, поскольку реализация сопрограмм Lua в .NET без использования грязных потоковых хаков не легка. Это связано с тем, как я компилирую функции Lua, и это проблема, которую мне нужно решить на ранних этапах проектирования компилятора.
Я исследовал реализации сопрограмм, и оказалось, что мои первоначальные чувства о продолжениях были правильными.
Поскольку создание сопрограммы, yield и другие операции являются не ключевыми словами языка, а функциями в таблице «сопрограммы», я не могу статически переключаться на компиляцию в стиле CPS, поскольку таблица сопрограмм могла быть перезаписана предыдущим сценарием. Хотя я понимаю, что сценарии, перезаписывающие таблицу сопрограмм, являются редким явлением, я бы хотел быть в безопасности и подходить к вопросу максимально четко.
Мой план - использовать стиль передачи продолжения для каждого выражения, независимо от того, находимся мы в сопрограмме или нет. За всем последует продолжение.
Помимо очевидной трудности написания компилятора в первую очередь и добавления CPS-преобразования поверх него, меня беспокоит это дизайнерское решение и его влияние на производительность.
Я ищу совет по реализации сопрограммы Lua в .NET.
Спасибо за ваше время.