An open API service indexing awesome lists of open source software.

https://github.com/matheusfillipe/mangle

Exolang that can take any utf8 text as valid code and return some result out of it
https://github.com/matheusfillipe/mangle

exolang interpreter joke programming-language pyo3 python repl rust scripting-language word-counter

Last synced: 7 months ago
JSON representation

Exolang that can take any utf8 text as valid code and return some result out of it

Awesome Lists containing this project

README

          

[![Website](https://img.shields.io/badge/website-mangle.ga-blue.svg)](https://mangle.ga)
[![Pypi](https://badge.fury.io/py/mangle.svg)](https://pypi.org/project/mangle/)
[![Crates.io](https://img.shields.io/crates/v/mangle.svg)](https://crates.io/crates/mangle)
[![Chat with me on irc](https://img.shields.io/badge/-IRC-gray?logo=gitter)](https://mangle.ga/irc)
[![GitHub license](https://img.shields.io/badge/license-MIT-blue.svg)](https://raw.githubusercontent.com/matheusfillipe/mangle/master/LICENSE)
[![CircleCI Build Status](https://circleci.com/gh/matheusfillipe/mangle.svg?style=shield)](https://circleci.com/gh/matheusfillipe/mangle)
[![codecov](https://codecov.io/gh/matheusfillipe/mangle/branch/master/graph/badge.svg)](https://codecov.io/gh/matheusfillipe/mangle)

### WIP: This is a work in progress, there is nothing working yet

# Mangle

An exolang (A scripting programming language just for fun) without any reserved keywords that can run any utf8 compatible with more than 2 space separated words on it.

## Installation

`cargo install mangle`

### Python bindings

Python bindings are available for python > 3.7. You can install them with:

`pip install mangle`

Then you can get started evaluating mangle from python with:

```python
import mangle
mangle.eval("cat is fat")
>> '5'
```

More info at: https://github.com/matheusfillipe/mangle/tree/master/python

## How it works
There are only labels, variables and operators. All variables are globally scoped, there are no locals, classes or anything fancy. All variables are dynamically typed and shadowed.

### Sentences
The only type of scope is sentences. Sentences are like english sentences, any text that comes before the punctuation marks: `.,;:?!`. All the other symbols will be interpreted as variable names, operators, labels, strings or numbers.

If a text has none of those punctuation marks it will run as a single sentence.

### Sentence Labels
The label of a sentence is the last word before the punctuation mark except by the first sentence. Labels are the way to have subroutines on this language. They define a scope with a body that you can `goto` from any other subroutine.

The first sentence on the interpreted code is the equivalent of the main function in another languages, so it has no need for a label. If the first sentence doesn't call any function, all the others labels will execute in the order they are until you exit or jump to another label.

### Data Types
The only types are strings, ints and stacks.

#### Int
The `length of a word - 1` define its numerical value. For example "a" evaluates to 0 and "cat" to 2.

#### Strings
The words themselves can be also interpreted as strings. You can't easily build multiword strings like "a bird" though since that would read as: `"a` and `bird"` each as individual words.

#### Stacks
Strings themselves are a stack of ints that the interpreter itself decodes at runtime. You can add ints to a stack by adding to its variable.

WIP...

## Operator
Operators are defined by the word's length. Here is the table of operators on this language

| Word Length | Operator | syntax | Example | Description |
|:-----------:|:--------:|:---------------------------:|:----------:|:-------------------------------:|
| 1 | | | | |
| 2 | Assign | _OP_ **receiver** **Value** | is cat fat | Assigns variable cat to value 3 |
| 3 | | | | |
| 4 | | | | |
| 5 | | | | |
| 6 | | | | |
| 7 | | | | |
| 8 | | | | |
| 9 | | | | |
| 10 | | | | |
| 11 | | | | |

## But then spaces are keywords heh?
Well... In some interpretation yes, I guess I lied then, sorry about it. You can still pass the `-F` argument to change the word separator (like field separator in awk) to any other character.