Skip to content

Instantly share code, notes, and snippets.

@dionyziz
Last active April 20, 2020 21:13
Show Gist options
  • Save dionyziz/d322f554131aa509675a17496973a986 to your computer and use it in GitHub Desktop.
Save dionyziz/d322f554131aa509675a17496973a986 to your computer and use it in GitHub Desktop.
dionyziz@puppy ~/workspace/recursion-thm (master*) % cat examples/factorial.js
return (n) => {
if (n == 0) {
return 1
}
return n * eval(SELF)(n - 1)
}
dionyziz@puppy ~/workspace/recursion-thm (master*) % node compiler.js < examples/factorial.js > examples/factorial-compiled.js
dionyziz@puppy ~/workspace/recursion-thm (master*) % cat examples/factorial-compiled.js
(SELF => {return (n) => {
if (n == 0) {
return 1
}
return n * eval(SELF)(n - 1)
}
})((({BStr, TStr}) => {
const AStr = ((BStr, TStr) => {
const escape = (str) => {
return str.replace(
/\\/g, '\\\\'
).replace(
/`/g, '\\\`'
).replace(
/\$/g, '\\$'
)
}
return `() => {
return {
BStr: \`${escape(BStr)}\`,
TStr: \`${escape(TStr)}\`
}
}`
})(BStr, TStr)
return ((AStr, BStr, TStr) => {
return `(SELF => {${TStr}})((${BStr})((${AStr})()))`
})(AStr, BStr, TStr)
})((() => {
return {
BStr: `({BStr, TStr}) => {
const AStr = ((BStr, TStr) => {
const escape = (str) => {
return str.replace(
/\\\\/g, '\\\\\\\\'
).replace(
/\`/g, '\\\\\\\`'
).replace(
/\\\$/g, '\\\\\$'
)
}
return \`() => {
return {
BStr: \\\`\${escape(BStr)}\\\`,
TStr: \\\`\${escape(TStr)}\\\`
}
}\`
})(BStr, TStr)
return ((AStr, BStr, TStr) => {
return \`(SELF => {\${TStr}})((\${BStr})((\${AStr})()))\`
})(AStr, BStr, TStr)
}`,
TStr: `return (n) => {
if (n == 0) {
return 1
}
return n * eval(SELF)(n - 1)
}
`
}
})()))
dionyziz@puppy ~/workspace/recursion-thm (master*) % node
> const fact = (SELF => {return (n) => {
... if (n == 0) {
..... return 1
..... }
... return n * eval(SELF)(n - 1)
... }
... })((({BStr, TStr}) => {
..... const AStr = ((BStr, TStr) => {
....... const escape = (str) => {
......... return str.replace(
........... /\\/g, '\\\\'
........... ).replace(
........... /`/g, '\\\`'
........... ).replace(
........... /\$/g, '\\$'
........... )
......... }
....... return `() => {
......... return {
........... BStr: \`${escape(BStr)}\`,
........... TStr: \`${escape(TStr)}\`
........... }
......... }`
....... })(BStr, TStr)
.....
... return ((AStr, BStr, TStr) => {
... return `(SELF => {${TStr}})((${BStr})((${AStr})()))`
... })(AStr, BStr, TStr)
... })((() => {
... return {
..... BStr: `({BStr, TStr}) => {
....... const AStr = ((BStr, TStr) => {
......... const escape = (str) => {
........... return str.replace(
............. /\\\\/g, '\\\\\\\\'
............. ).replace(
............. /\`/g, '\\\\\\\`'
............. ).replace(
............. /\\\$/g, '\\\\\$'
............. )
........... }
......... return \`() => {
........... return {
............. BStr: \\\`\${escape(BStr)}\\\`,
............. TStr: \\\`\${escape(TStr)}\\\`
............. }
........... }\`
......... })(BStr, TStr)
.......
... return ((AStr, BStr, TStr) => {
... return \`(SELF => {\${TStr}})((\${BStr})((\${AStr})()))\`
... })(AStr, BStr, TStr)
... }`,
... TStr: `return (n) => {
... if (n == 0) {
..... return 1
..... }
... return n * eval(SELF)(n - 1)
... }
... `
... }
... })()))
undefined
> fact(6)
720
> % dionyziz@puppy ~/workspace/recursion-thm (master*) %
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment