type-unlambda/README.md

63 lines
2.0 KiB
Markdown
Raw Normal View History

2020-11-06 09:07:33 +00:00
# README
2021-06-03 12:27:57 +00:00
[![MIT License][]](LICENSE)
2020-11-06 09:07:33 +00:00
2021-06-03 12:27:57 +00:00
[Unlambda][] interpreter implemented in TypeScript's type system.
2020-11-06 09:07:33 +00:00
## Getting Started
Installation:
```sh
2020-11-23 03:52:07 +00:00
npm install --save-dev typescript
2020-11-06 09:07:33 +00:00
npm install --save-dev @esolangs/type-unlambda
```
Example usage:
2020-11-06 09:07:33 +00:00
```typescript
import Unlambda from '@esolangs/type-unlambda';
type Code = '``@c`d``s`|k`@c';
type Input = 'Hello!';
type Output = Unlambda<Code, Input>; // Output == '!olleH'
2020-11-06 09:07:33 +00:00
```
Screenshots:
![Reverse print string](https://user-images.githubusercontent.com/19173506/98339205-4efdfd80-2046-11eb-880d-f2b2333d61a0.png)
## Notes
2020-11-06 12:08:09 +00:00
You're likely to get the following error when trying to run a program with type-unlambda:
2020-11-06 09:07:33 +00:00
> Type instantiation is excessively deep and possibly infinite.ts(2589).
2021-06-03 12:27:57 +00:00
To write loops in TypeScript's type system, we have to use recursions, like we do in other purely functional
programming languages. Meanwhile, we use [CPS][] to implement continuations, which also introduces heavy recursion.
However, TypeScript's type system is not meant for general purpose programming, and recursion has its limits.
2020-11-06 09:07:33 +00:00
2021-06-03 12:27:57 +00:00
In [src/compiler/checker.ts][TSC checker], there is a hard-coded limit for type instantiation:
2020-11-06 09:07:33 +00:00
```typescript
if (instantiationDepth === 50 || instantiationCount >= 5000000) {
// ...
return errorType;
}
```
2021-06-03 12:27:57 +00:00
You may expect that there is an option somewhere that this limit can be configured, like `-ftemplate-depth=n` in
gcc/clang. Unfortunately, there isn't, [and it's likely to stay that way][PR 29602].
2020-11-06 09:07:33 +00:00
2021-06-03 12:27:57 +00:00
To workaround this limitation, we modify the code of `tsserver` or `tsc` in `node_modules`, until the error no longer
applies. Changing `instantiationDepth` to `1000` is sufficient to run the example above.
<!-- Reference Links -->
[MIT License]: https://img.shields.io/badge/license-MIT-blue.svg
[Unlambda]: http://www.madore.org/~david/programs/unlambda/
[CPS]: https://en.wikipedia.org/wiki/Continuation-passing_style/
[TSC checker]: https://github.com/microsoft/TypeScript/blob/v4.1.2/src/compiler/checker.ts
[PR 29602]: https://github.com/microsoft/TypeScript/pull/29602