Ecosyste.ms: Awesome
An open API service indexing awesome lists of open source software.
https://github.com/sungwoncho/tru
An esoteric programming language with prefix-free brackets
https://github.com/sungwoncho/tru
esolang esoteric-programming-language programming-language
Last synced: 12 days ago
JSON representation
An esoteric programming language with prefix-free brackets
- Host: GitHub
- URL: https://github.com/sungwoncho/tru
- Owner: sungwoncho
- License: apache-2.0
- Created: 2020-08-04T08:24:37.000Z (over 4 years ago)
- Default Branch: master
- Last Pushed: 2020-08-09T08:31:19.000Z (over 4 years ago)
- Last Synced: 2024-10-19T17:04:42.280Z (24 days ago)
- Topics: esolang, esoteric-programming-language, programming-language
- Language: Python
- Homepage: https://sungwoncho.github.io/tru/
- Size: 25.4 KB
- Stars: 4
- Watchers: 3
- Forks: 0
- Open Issues: 0
-
Metadata Files:
- Readme: README.md
- License: LICENSE
Awesome Lists containing this project
README
# tru
tru is an esoteric programming language of brackets with prefix-free code.
## Examples
Below are some tru code examples.
```
# print hello world
(0)(10)(33)(100)(108)(114)(111)(119)(32)(44)(111)(108)(108)(101)(72)>><<[<><>><<>><<]>>><<
``````
# print 25th Fibonacci number
(1)(25)(1)><>(1)(0)><>(1)>>>>>><<[(0)><>(1)>>>>>><<[>><>(1)><>>><<(0)><>>>><>(1)><><<<>><>>>><>(0)><>>><>(1)>>>>>><<](0)](1)><><><>><>>>><<
``````
# sum first 1000 positive integers
(1000)>><<>>><>(1)><>1(111)[(1)>>>>1>><<>>><>(0)><>0<<<(1)><>1>><<(1)<>>><<](0)><><><>><>>>><<
``````
# quine (outputs its own source code)
(9999)(60)(60)(62)(62)(62)(60)(60)(62)(60)(93)(60)(60)(62)(62)(62)(60)(60)(60)(60)(41)(1)(40)(41)(9998)(40)(60)(60)(62)(62)(93)(41)(0)(40)(62)(60)(62)(41)(0)(40)(41)(7777)(40)(62)(60)(62)(41)(1)(40)(60)(60)(62)(62)(60)(62)(60)(62)(60)(62)(62)(62)(60)(60)(62)(62)(62)(60)(62)(41)(0)(40)(91)(60)(60)(62)(62)(60)(62)(41)(1)(40)(93)(41)(0)(40)(62)(60)(62)(41)(0)(40)(41)(8888)(40)(62)(60)(62)(41)(1)(40)(62)(60)(62)(62)(60)(62)(60)(62)(60)(62)(62)(62)(60)(60)(62)(62)(62)(60)(62)(41)(0)(40)(91)(60)(60)(62)(62)(62)(62)(60)(41)(2)(40)(62)(60)(62)(41)(1)(40)(62)(60)(62)(62)(62)(60)(60)(60)(62)(60)(62)(41)(0)(40)(62)(60)(62)(62)(62)(62)(62)(60)(41)(40)(40)(60)(60)(62)(62)(62)(60)(62)(62)(62)(62)(62)(60)(41)(7777)(40)(62)(60)(62)(41)(1)(40)(91)(41)(1)(40)(41)(1)(40)(41)(8888)(40)(62)(60)(62)(41)(1)(40)(60)(60)(62)(60)(93)(93)(41)(0)(40)(60)(60)(62)(62)(60)(62)(60)(41)(41)(40)(62)(60)(62)(62)(60)(62)(60)(62)(60)(62)(62)(62)(60)(60)(62)(62)(60)(60)(62)(62)(60)(62)(60)(41)(40)(40)(62)(60)(62)(62)(91)(60)(60)(62)(62)(60)(60)(62)(62)(62)(60)(60)(60)(60)(41)(1)(40)(41)(9998)(40)(60)(60)(62)(62)(62)(60)(62)(41)(1)(40)(91)(41)(1)(40)(60)(60)(60)(41)(1)(40)(41)(9998)(40)(62)(60)(62)(41)(0)(40)(60)(60)(62)(62)(60)(62)(60)(41)(41)(40)(62)(60)(62)(62)(60)(62)(60)(60)(60)(60)(41)(1)(40)(41)(9998)(40)(60)(60)(62)(62)(60)(62)(60)(41)(40)(40)(60)(60)(62)(60)(93)(93)(41)(0)(40)(62)(60)(62)(62)(62)(62)(60)(62)(62)(91)(60)(60)(62)(62)(60)(60)(62)(62)(62)(60)(60)(60)(60)(41)(1)(40)(41)(9998)(40)(60)(60)(62)(62)(62)(60)(62)(41)(0)(40)(91)(41)(1)(40)(60)(60)(60)(41)(1)(40)(41)(9998)(40)(62)(60)(62)(41)(1)(40)(1)><>(9998)(1)<<<(1)[(0)><>>><<(9998)(1)<<<<>>><<>><<[>><>>>><>(0)]]<><<(40)<><>><<(9998)(1)<<<<><>><>(41)<><>><<(0)><>(9998)(1)<<<(1)[(1)><>>><<(9998)(1)<<<<>>><<>><<[>><>(40)<><>><<>><<>>><><><>><>(41)<><>><<(0)]]<><<(1)><>(8888)(1)(1)[(1)><>(7777)<>>>>><>>><<(40)<>>>>><>(0)><><<<>>><>(1)><>(2)<>>>><<[(0)><>>><<>>><><><>><>(1)><>(8888)(0)><>(0)](1)><>><<[(0)><>>><<>>><><><>><<(1)><>(7777)(0)><>(0)]>><<(9998)(1)<<<<>>><<]<><<>>><<
```## Specification
Tru is a stack-based virtual machine.
There are two built-in stacks which tru programs can manipulate using the following set of instructions.
### Instructions
| Instruction | Description |
|---|---|
| `(` | Start describing an integer to push |
| `)` | Push the integer between the corresponding opening bracket to the current stack. |
| `<><>><<` | Print character: Pop from the current stack and print the value as a UTF-8 character |
| `<><>><>` | Print integer: Pop from the current stack and print the value as a number |
| `<><>>>` | Integer input: Get an integer input and push to the current stack as a number |
| `<><><` | Character input: Get an integer input and push to the current stack as a UTF-8 character |
| `>>><<` | End: Specify the end of the program |
| `>>><>` | Move: Pop from the current stack and push to the other stack |
| `<><<` | Discard: Pop from the current stack and discard |
| `>><<` | Duplicate the top value of the current stack |
| `>><>` | Swap the top two values of the current stack |
| `>>>>` | Subtract |
| `<<<` | Add |
| `<<>` | Greater than |
| `<>>` | Equals |
| `><<` | Not |
| `><>` | Select stack: Pop from the stack and set the current stack equal to the value. The stacks are indexed 0 and 1. |
| `[` | Jump: Pop the current stack and jump to the matching ] if the value is zero |
| `]` | Jump: Pop the current stack and jump to the matching [ if the value is non-zero |
| `#` | Comment: ignore all characters that follow for the rest of the line |In summary, instructions are represented by only using bracket characters:
```
(, ), [, ], <, >
```Instructions are prefix-free and can directly follow one another. For instance,
```
(1)
>><<
(2)
<<<
>><<
<><>><<
```is equivalent to
```
(1)>><<(2)<<<>><<<><>><<
```### Linebreaks and spaces
Linebreaks and spaces are permitted and ignored. However, numbers and instructions cannot be broken with linebreaks or spaces.
```
# Okay
(
10
)# Not okay
(
1
0
)# Okay
>><<# Not okay
>>
<<
```One can write a relatively readable tru program using linebreaks, spaces and comments. It can always be compressed due to the prefix-free nature of the instructions.
## Tru VM implementation
Pytru is an official tru virtual machine implemented in Python. You can use it to execute tru code.
```
# pytru requires Python 3
python3 ./tru.py input_file_path
```## License
Apache 2.0