Занялся давеча генерацией C#, узнал, что этот недоязык не позволяет описать и тут же на месте вызвать лямбду, вроде:
(x => x * 2)(21)
А вывод типов там такой слабенький, что почти и нету; пришлось самому делать.
А скажите, друзья, насколько легко понять, не запуская, что вычисляет этот код?
Thunk fmain = () => run>, Kont>>>(x0 =>
() => run
>, Kont>>(x0, pair>,
Kont>(k1 => () => run(k1, 8), x => { throw new Res(x);
})), unrec
>, Kont>>((w2, rec3) => () =>
run>(w2.fst, a18 => () => run(b19 => () => run>(z7 => match(z7, u5 => () => run>, Kont>>>>(u4 => () => run>,
Kont>>>(u4, rec3), x14 => () => run
>, Kont<
int>>>(x14, pair>, Kont>(k15 => () => run>(w2.fst, a16 => () => run(b17 => () => run(k15, (a16 - b17)),
1)), a8 => () => run>, Kont>>>>(u4 =>
() => run>, Kont>>>(u4, rec3), x10 => ()
=> run
>, Kont>>(x10, pair>,
Kont>(k11 => () => run>(w2.fst, a12 => () => run(
b13 => () => run(k11, (a12 - b13)), 2)), b9 => () => run(
w2.snd, (a8 + b9)))))))), u6 => () => run(w2.snd, 1)), less(a18,
b19)), 3))));
(полный текст с определениями
здесь)
Это у меня примитивный вариант недопростотипизированной лямбды (с функциями, произведениями и суммами типов) транслируется с семантикой call-by-need по заветам SPJ и Mycroft'a в строгое промежуточное представление, где совсем нет аппликаций, зато есть первоклассные продолжения, а из него уже генерится шарп.