Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/seldom-se/tower
Tower is an esolang with painfully vertical data storage
https://github.com/seldom-se/tower
esolang esoteric-language esoteric-programming-language programming-language rust
Last synced: about 1 month ago
JSON representation
Tower is an esolang with painfully vertical data storage
- Host: GitHub
- URL: https://github.com/seldom-se/tower
- Owner: Seldom-SE
- License: other
- Created: 2022-02-09T20:44:25.000Z (almost 3 years ago)
- Default Branch: main
- Last Pushed: 2022-02-11T22:48:44.000Z (almost 3 years ago)
- Last Synced: 2024-10-30T14:50:29.966Z (3 months ago)
- Topics: esolang, esoteric-language, esoteric-programming-language, programming-language, rust
- Language: Rust
- Homepage:
- Size: 24.4 KB
- Stars: 0
- Watchers: 1
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# T
# o
# w
# e
# r[![MIT/Apache 2.0](https://img.shields.io/badge/license-MIT%2FApache-blue.svg)](./LICENSE)
## What is...it?
It's a esolang with painfully vertical data storage. You only get 3 registers to work with, though you can compress the registers into archives, but an archive takes a register, and it's difficult to avoid overwriting your own data when extracting them.
It's still a work-in-progress while I figure out whether it's powerful enough to solve complex problems. I think it's almost done, though.
Yes, the name is written vertically like that. I'm avoiding writing it as much as I can.
## Syntax
### Data Types
There are two data types: numbers and archives. Numbers can also be treated as UTF-8 characters in certain statements and expressions. Numbers are stored as 32-bit signed integers. Nonzero numbers are truthy, and zero is falsy.
Archives have up to three registers of their own, each of which may contain a number or another archive. All archives are truthy.
### Statements
Any character tries to be a statement by default. A symbol only becomes an expression if a previous statement or expression coerces it into one. Later characters have coercion priority over earlier ones. For example (you may want to reference the tables below for this example), in `?&bc#a[`, `?` coerces `&` into an expression, which coerces `b` and `c` into expressions. `#` is the next available character, so `?` coerces it into a statement, and `#` coerces `a` into an expression. `?&bc#a` is a complete statement, so `[` becomes a statement by default.
| Statement | Description | Example | Example notes |
| --- | --- | --- | --- |
| `. ` | Print the expression as a number | `.:1` | Prints `1` |
| `, ` | Print the expression as a character | `,;A` | Prints `A` |
| `a `, `b `, `c ` | Store the expression in register `a`, `b`, or `c` | `a:1` | Stores `1` in register `a` |
| `? ` | Execute the statement if the expression is truthy | `?:0.:1` | Prints nothing |
| `[` | Jump forward, just after the matching `]` | `?:1[.:1].:0` | Skips `1` and prints `0` |
| `]` | Jump back, just after the matching `[` | `?:0[.:1].:0` | Prints `1` forever |
| `# ` | Extracts the expression, if it's an archive. Registers are overwritten with the registers stored in the archive. Registers that do not have a value in the archive are not overwritten. | `#a` | Extracts the archive `a` |### Expressions
| Expression | Description | Example | Example notes |
| --- | --- | --- | --- |
| `: ` | A number literal | `.:-1` | Prints `-1` |
| `; ` | A character literal | `.;A` | Prints `65` |
| `.` | Read a number from the buffer. If the buffer is empty, it is refilled from stdin. | `a.` | Stores a number from stdin to register `a` |
| `,` | Read the next character from the buffer. If the buffer is empty, it is refilled from stdin. The buffer will always end with `\r`, then `\n`. | `,,` | Echos a character from the buffer to stdout |
| `a`, `b`, `c` | Gets the value of register `a`, `b`, or `c` | `.a` | Prints the value of register `a` as a number |
| `+ ` | Add two numbers | `.+:1:2` | Prints `3` |
| `- ` | Subtract two numbers | `.-:1:2` | Prints `-1` |
| `* ` | Multiply two numbers | `.*:4:3` | Prints `12` |
| `/ ` | Divide two numbers | `./:12:5` | Prints `2` |
| `% ` | Modulo two numbers | `.%:12:5` | Prints `2` |
| `! ` | Logical NOT. Evaluates to `1` for any falsey value, and `0` for any truthy value. All archives are truthy. | `.!:-1` | Prints `0` |
| `& ` | Logical AND | `.&:1a` | Prints `1` if register `a` is truthy, and `0` otherwise |
|| <Expr>
| Logical OR |.|:0a
| Prints `1` if register `a` is truthy, and `0` otherwise |
| `= ` | Checks whether the expressions equal. Any archive is considered equal to any other archive. | `.=:-1-:3:2` | Prints `1` |
| `< ` | Checks whether the first expression is less than the second | `.<:3:5` | Prints `1` |
| `> ` | Checks whether the first expression is greater than the second | `.>:3:5` | Prints `0` |
| `? ` | Conditional. If the first expression is truthy, it resolves to the second expression. Otherwise, it resolves to the third expression. | `,?;A;B;C` | Prints `C` |
| `[ ]` | Creates an archive of the given registers | `c[ac]` | Creates an archive containing the current values of registers `a` and `c`, and stores it in register `c` |`+`, `-`, `*`, `/`, `%`, `>`, and `<` evaluate to `0` if either expression is an archive
## Examples
You can find the examples in the `examples` directory. I recommend trying to solve some of these problems yourself first, and looking at examples if you need help. If following examples are roughly ordered by difficulty.
| Example | Description |
| --- | --- |
| `hello_world.twr` | Prints `Hello, world!` |
| `fibonacci.twr` | Prints Fibonacci numbers until it crashes from overflow |
| `primes.twr` | Prints prime numbers |
| `factorial.twr` | Calculates the factorial of a given number |
| `99_bottles.twr` | Prints the lyrics to "99 Bottles of Beer". Reuses as much of the text as is practical. |
| `echo.twr` | Echos the given input to output |
| `bracket_checker.twr` | Checks whether given brackets are balanced |
| `sort.twr` | This is an unfinished implementation of a sorting algorithm. Once this example is completed, and necessary modifications are made to the language, I plan to release its 1.0. |## Installation
Install Rust and clone the repo.
## Usage
Run a .twr file with `tower `. If running through cargo (which you should), it will look like `cargo run `.
## Contributing
If you have a suggestion, bug report, or contribution, feel free to open an issue or pr.
## License
T\
o\
w\
e\
r\
is dual-licensed under either* MIT License (LICENSE-MIT or http://opensource.org/licenses/MIT)
* Apache License, Version 2.0 (LICENSE-APACHE or http://www.apache.org/licenses/LICENSE-2.0)at your option.