https://github.com/andy2046/tco-node
javascript lib for tail call optimization
https://github.com/andy2046/tco-node
javascript tail-call-optimization tco trampoline
Last synced: 6 months ago
JSON representation
javascript lib for tail call optimization
- Host: GitHub
- URL: https://github.com/andy2046/tco-node
- Owner: andy2046
- License: mit
- Created: 2017-11-02T03:25:00.000Z (almost 8 years ago)
- Default Branch: master
- Last Pushed: 2017-11-04T05:29:12.000Z (almost 8 years ago)
- Last Synced: 2025-04-13T00:14:48.720Z (6 months ago)
- Topics: javascript, tail-call-optimization, tco, trampoline
- Language: JavaScript
- Homepage:
- Size: 80.1 KB
- Stars: 5
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# tco-node
tco-node is a JavaScript library for tail call optimization.## Examples
```js
import { tco, trampoline } from 'tco-node';const sum = tco(function(x, y) {
if (y > 0) {
return sum(x + 1, y - 1)
} else {
return x
}
})console.log( sum(1, 100000) ) // => 100001
function isEvenInner (num) {
if (num === 0) {
return true
}if (num === 1) {
return false
}return function() {
return isEvenInner(Math.abs(num) - 2)
}
}console.log( trampoline(isEvenInner, 99999) )
// => falseconsole.log( trampoline(isEvenInner, 99998) )
// => trueconst isEven = trampoline.bind(null, isEvenInner)
console.log( isEven(99999) )
// => falsefunction factorial (n) {
function recur (n, acc) {
if (n === 0) {
return acc
} else {
return recur.bind(null, n-1, n*acc)
}
}
return function () {
return recur.bind(null, n, 1)
}
}console.log( trampoline(factorial(100000)) )
// => Infinityfunction _even (n) {
if (n === 0) {
return true
} else {
return _odd.bind(null, n-1)
}
}function _odd (n) {
if (n === 0) {
return false
} else {
return _even.bind(null, n-1)
}
}function even (n) {
return trampoline(_even.bind(null, n))
}function odd (n) {
return trampoline(_odd.bind(null, n))
}console.log(
even(99999),
odd(99999),
even(99998),
odd(99998)
)
// false true true false```
## Installation
```
npm install --save tco-node
```## Usage
You can import from `tco-node`:```js
import { tco, trampoline } from 'tco-node';
// or
const { tco, trampoline } = require('tco-node');
```