Преобразование ANF в стиле продолжения прохождения
Алгоритм преобразования кода из S-выражений в A-нормальную форму приведен по http://matt.might.net/articles/a-normalization/
Автор сделал необычный выбор написания алгоритма в стиле продолжения прохождения. (То есть дело не в том, что промежуточный код представлен в CPS на каком-либо этапе, а в том, что рукописный код, выполняющий преобразование, пишется в CPS.)
Это имеет смысл, поскольку я вижу, как это работает, а продолжение представляет тело каждого сгенерированного let
Интуитивно удивительно, что CPS должен быть для людей самым понятным способом написания кода.
Это на самом деле самая чистая форма алгоритма преобразования ANF, или есть известный лучший способ, который не использует CPS?
1 ответ
Я взглянул на оригинальную статью, и (основываясь на кратком чтении) ее преобразование сформулировано как простой набор правил переписывания. Там нет ничего, что сразу подсказывает мне необходимость CPS. Глядя на сообщение в блоге Мэтта Мейта, кажется, что он использует продолжение более или менее ванильно; то есть он либо передается на рекурсивный вызов, либо вызывается с "конечным результатом"... за исключением normalize-name
функция, которая вызывает k
в нехвостом положении. Итак, технически это на самом деле не совсем CPS.
В любом случае, мне кажется, что Мэтт просто писал это в CPS по привычке. Держу пари, он был бы рад ответить на ваш вопрос; это может быть хорошим отдыхом от того, чтобы быть главой гигантского медицинского фонда.:)
РЕДАКТИРОВАТЬ: заранее извиниться, если этот ответ не добавляет много к вашим знаниям; может быть, все, что я говорю, ты уже знаешь. Та!