August 2nd, 2013

Book

(no subject)

Понял я тут внезапно, что инлайнер в случае лямбд сделан у меня в HNC неверно и работать не должен.

В общем случае аргумент при инлайне не пропадает, а превращается в локальную переменную:

let foo x = bar x + baz x in foo (quux 2) при инлайне foo должен превратиться в let x = quux 2 in bar x + baz x вместо размножения (quux 2).

Таким образом, вся эта белиберда с zip formalArgs $ map (PElem . LetNode []) actualArgs (попыткой отделаться подстановкой формальных на фактические) не имеет смысла. Туда же в мусорку идут и transferBL, не передающая подстановку формальных аргументов на фактические дальше по графу управления, и сама идея упрощенной по сравнению с учебными примерами HOOPL решётки фактов.

Вместо этого надо делать новый сияющий устранитель аргументов, одинаковых во всех вызовах, который заменит формальные аргументы на локальные let-определения по одному, если это возможно, превратив лямбду в значение без параметров, для которого сработает инлайнер значений.

Набросал тут себе на бумажке план из четырех разнонаправленных анализов и трех перезаписей, юуду имплементить. Заодно должен уйти единственный оставшийся рекурсивный вызов при перезаписи, там же в inlineApplication.
Book

The real best way to find a generic function on Hackage

Версия http://ro-che.info/ccc/02.html , только с Эдвардом Кметтом:

http://stackoverflow.com/q/18013547/805266

Upd: Petr Pudlák c длиной члена 15.6 сообщает, что я изобрел банальный параморфизм, причем с тем же порядком аргументов, что и библиотечный, и нечего по таким пустякам Эдуарда беспокоить.

Upd2: Rewriter чудненько похудел на 5 строчек. Чудность не в этой экономии, а в том, что освоена многообещающая технология избавления от рекурсивной лапши.