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
|
|
|
|
```
|
|
|
|
|
2021-01-25 11:11:40 +00:00
|
|
|
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!';
|
2021-01-25 11:11:40 +00:00
|
|
|
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
|
|
|
|
|
2021-06-03 13:27:35 +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 13:27:35 +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 13:27:35 +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 13:27:35 +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 13:27:35 +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.
|
2021-06-03 12:27:57 +00:00
|
|
|
|
|
|
|
|
|
|
|
<!-- 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/
|
2021-06-03 13:27:35 +00:00
|
|
|
[TSC checker]:
|
|
|
|
https://github.com/microsoft/TypeScript/blob/v4.1.2/src/compiler/checker.ts
|
2021-06-03 12:27:57 +00:00
|
|
|
[PR 29602]: https://github.com/microsoft/TypeScript/pull/29602
|