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