{"ScriptPreparationCode":"NNN = 100\r\n\r\nfunction v0 () {\r\n function voidf(k) { return k(undefined); };\r\n\r\nfunction pk(x, y) {\r\n console.log(\u0022pk\u0022, x, y);\r\n return voidf;\r\n}\r\n\r\nfunction trampoline(thunk) {\r\n // console.log(\u0027trampoline start\u0027, thunk)\r\n while (thunk \u0026\u0026 typeof thunk === \u0022function\u0022) {\r\n // console.log(\u0027boing\u0027);\r\n thunk = thunk();\r\n }\r\n return thunk\r\n}\r\n\r\nfunction add(a, b) {\r\n return a \u002B b;\r\n}\r\n\r\nfunction times(a, b) {\r\n return a * b;\r\n}\r\n\r\nlet program =\r\n(function( kxx ) { return (function( ) { return (function( k ) { return k ( (function( kk, factorial_0 ) { return (function( ) { return (function( kxx ) { return (function( ) { return (function( k ) { return k ( (function( kk, t_3 ) { return (function( ) { return (function( kxx ) { return (function( ) { return factorial_0 ( (function( v ) { return (function( ) { return (function( k ) { return k ( NNN ) ;}) ( (function( v0 ) { return (function( ) { return (function( k ) { return k ( 1 ) ;}) ( (function( v1 ) { return (function( ) { return v ( kxx, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;}) ( kk ) ;}) ;}) ) ;}) ( (function( v ) { return (function( ) { return (function( k ) { return (function( ) { factorial_0 = (function( k ) { return k ( (function( kk, n_1, total_2 ) { return (function( ) { return (function( k ) { return (function( kpr ) { return (function( ) { return n_1 ( (function( v0 ) { return (function( ) { return (function( k ) { return k ( 0 ) ;}) ( (function( v1 ) { return kpr ( v0 === v1 ) ;}) ) ;}) ;}) ) ;}) ;}) ( (function( kif ) { return /* if */ kif ? (function( ) { return total_2 ( k ) ;}) : (function( ) { return (function( kxx ) { return (function( ) { return factorial_0 ( (function( v ) { return (function( ) { return (function( kpr ) { return (function( ) { return n_1 ( (function( v0 ) { return (function( ) { return (function( k ) { return k ( -1 ) ;}) ( (function( v1 ) { return kpr ( add ( v0, v1 ) ) ;}) ) ;}) ;}) ) ;}) ;}) ( (function( v0 ) { return (function( ) { return (function( kpr ) { return (function( ) { return n_1 ( (function( v0 ) { return (function( ) { return total_2 ( (function( v1 ) { return kpr ( times ( v0, v1 ) ) ;}) ) ;}) ;}) ) ;}) ;}) ( (function( v1 ) { return (function( ) { return v ( kxx, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;}) ( k ) ;}) ;}) ) ;}) ( kk ) ;}) ;}) ) ;}); return k ( voidf ) ;}) ;}) ( (function( v0 ) { return (function( ) { return v ( kxx, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;}) ( kk ) ;}) ;}) ) ;}) ( (function( v ) { return (function( ) { return voidf ( (function( v0 ) { return (function( ) { return v ( kxx, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ;}) ) ;}) ;})\r\n;\r\n\r\nfunction output(x) {\r\n pk(\u0027output\u0027, x);\r\n return function() {};\r\n}\r\n\r\n\r\ntrampoline(function() {return program (output);}); \r\n}\r\n\r\nfunction v1strict() {\r\n\u0022use strict\u0022;\r\n\r\nfunction voidf(k) { return k(undefined); };\r\n\r\nfunction pk() {\r\n console.log.apply(console, arguments);\r\n}\r\n\r\nfunction trampoline(thunk) {\r\n // console.log(\u0027trampoline start\u0027, thunk)\r\n while (thunk \u0026\u0026 typeof thunk === \u0022function\u0022) {\r\n // console.log(\u0027boing\u0027);\r\n thunk = thunk();\r\n }\r\n return thunk\r\n}\r\n\r\nfunction prepend(v, a) {\r\n // a.slice().unshift(0); // avoid mutation with copy\r\n a.unshift(v);\r\n return a;\r\n}\r\n\r\nfunction apply(func, args) {\r\n return func.apply(this, args);\r\n}\r\n\r\nfunction add(a, b) {\r\n return a \u002B b;\r\n}\r\n\r\nfunction times(a, b) {\r\n return a * b;\r\n}\r\n\r\nlet program =\r\n(function( k ) { return (function( k ) { return k ( (function( k, fact_0 ) { return (function( k ) { return (function( k ) { return k ( (function( k, t_3 ) { return (function( k ) { return fact_0 ( (function( v ) { return (function( k ) { return k ( NNN ) ;}) ( (function( v0 ) { return (function( k ) { return k ( 1 ) ;}) ( (function( v1 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ) ;}) ( k ) ;}) ) ;}) ( (function( v ) { return (function( k ) { return (function( ) { fact_0 = (function( k ) { return k ( (function( k, n_1, total_2 ) { return (function( k ) { return (function( k ) { return n_1 ( (function( v0 ) { return (function( k ) { return k ( 0 ) ;}) ( (function( v1 ) { return k ( v0 === v1 ) ;}) ) ;}) ) ;}) ( (function( kif ) { return /* if */ kif ? (function( ) { return total_2 ( k ) ;}) : (function( ) { return (function( k ) { return fact_0 ( (function( v ) { return (function( k ) { return n_1 ( (function( v0 ) { return (function( k ) { return k ( -1 ) ;}) ( (function( v1 ) { return k ( add ( v0, v1 ) ) ;}) ) ;}) ) ;}) ( (function( v0 ) { return (function( k ) { return total_2 ( (function( v0 ) { return n_1 ( (function( v1 ) { return k ( times ( v0, v1 ) ) ;}) ) ;}) ) ;}) ( (function( v1 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ) ;}) ( k ) ;}) ;}) ) ;}) ( k ) ;}) ) ;}); return k ( voidf ) ;}) ;}) ( (function( v0 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ( k ) ;}) ) ;}) ( (function( v ) { return voidf ( (function( v0 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ) ;})\r\n;\r\n\r\nfunction output(x) {\r\n pk(\u0027output\u0027, x);\r\n return function() {};\r\n}\r\n\r\n\r\ntrampoline(function() {return program (output);}); \r\n}\r\n\r\nfunction v1() {\r\n function voidf(k) { return k(undefined); };\r\n\r\nfunction pk() {\r\n console.log.apply(console, arguments);\r\n}\r\n\r\nfunction trampoline(thunk) {\r\n // console.log(\u0027trampoline start\u0027, thunk)\r\n while (thunk \u0026\u0026 typeof thunk === \u0022function\u0022) {\r\n // console.log(\u0027boing\u0027);\r\n thunk = thunk();\r\n }\r\n return thunk\r\n}\r\n\r\nfunction prepend(v, a) {\r\n // a.slice().unshift(0); // avoid mutation with copy\r\n a.unshift(v);\r\n return a;\r\n}\r\n\r\nfunction apply(func, args) {\r\n return func.apply(this, args);\r\n}\r\n\r\nfunction add(a, b) {\r\n return a \u002B b;\r\n}\r\n\r\nfunction times(a, b) {\r\n return a * b;\r\n}\r\n\r\nlet program =\r\n(function( k ) { return (function( k ) { return k ( (function( k, fact_0 ) { return (function( k ) { return (function( k ) { return k ( (function( k, t_3 ) { return (function( k ) { return fact_0 ( (function( v ) { return (function( k ) { return k ( NNN ) ;}) ( (function( v0 ) { return (function( k ) { return k ( 1 ) ;}) ( (function( v1 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ) ;}) ( k ) ;}) ) ;}) ( (function( v ) { return (function( k ) { return (function( ) { fact_0 = (function( k ) { return k ( (function( k, n_1, total_2 ) { return (function( k ) { return (function( k ) { return n_1 ( (function( v0 ) { return (function( k ) { return k ( 0 ) ;}) ( (function( v1 ) { return k ( v0 === v1 ) ;}) ) ;}) ) ;}) ( (function( kif ) { return /* if */ kif ? (function( ) { return total_2 ( k ) ;}) : (function( ) { return (function( k ) { return fact_0 ( (function( v ) { return (function( k ) { return n_1 ( (function( v0 ) { return (function( k ) { return k ( -1 ) ;}) ( (function( v1 ) { return k ( add ( v0, v1 ) ) ;}) ) ;}) ) ;}) ( (function( v0 ) { return (function( k ) { return total_2 ( (function( v0 ) { return n_1 ( (function( v1 ) { return k ( times ( v0, v1 ) ) ;}) ) ;}) ) ;}) ( (function( v1 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}), (function( kv ) { return kv ( v1 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ) ;}) ( k ) ;}) ;}) ) ;}) ( k ) ;}) ) ;}); return k ( voidf ) ;}) ;}) ( (function( v0 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ) ;}) ( k ) ;}) ) ;}) ( (function( v ) { return voidf ( (function( v0 ) { return (function( ) { return v ( k, (function( kv ) { return kv ( v0 ) ;}) ) ;}) ;}) ) ;}) ) ;})\r\n;\r\n\r\nfunction output(x) {\r\n pk(\u0027output\u0027, x);\r\n return function() {};\r\n}\r\n\r\n\r\ntrampoline(function() {return program (output);}); \r\n}\r\n\r\nfunction vanilla() {\r\n function factorial (n) {\r\n \treturn n === 0 ? 1 : n * factorial(n -1); \r\n }\r\n \r\n console.log(factorial(NNN));\r\n}\r\n\r\nfunction tailcall() {\r\n function factorial (n, total) {\r\n \treturn n === 0 ? total : factorial(n - 1, total * n); \r\n }\r\n \r\n console.log(factorial(NNN, 1))\r\n}","TestCases":[{"Name":"v0","Code":"v0()","IsDeferred":false},{"Name":"v1 use strict","Code":"v1strict()","IsDeferred":false},{"Name":"v1","Code":"v1()","IsDeferred":false},{"Name":"tailcall","Code":"tailcall()","IsDeferred":false},{"Name":"vanilla","Code":"vanilla()","IsDeferred":false}]}