Chelodina is a transpiler that converts LOGO:
```logo TO triangle :length REPEAT 3 [ FORWARD :length RIGHT 120 ] END
TO flower :length :count REPEAT 150 [ triangle :length RIGHT 360 / :count ] END
TO web REPEAT 6 [ flower 150 18 ] END
web
```
Into Python:
```python import turtle
def triangle(p_length): for _ in range(3): turtle.forward(p_length) turtle.right(120.0)
def flower(p_length, p_count): for _ in range(150): triangle(p_length) turtle.right(360.0 / p_count)
def web(): for _ in range(6): flower(150.0, 18.0)
web() turtle.done() ```
pip install chelodina
``` usage: chelodina [-h] --input INPUT [--run]
arguments: -h, --help show this help message and exit --input INPUT Logo source file --run Run the transpiled code ```
There's some ready examples to try if you clone the repository:
chelodina --input examples/example1.logo
You can also trigger the program to run in a GUI:
chelodina --input examples/example1.logo --run
FORWARD
, BACK
, LEFT
, RIGHT
, SETPOS
, SETX
, SETY
, SETHEADING
, SETH
, HOME
DONE
, CLEARSCREEN
REPEAT
This is still on an early stage, I focused on making some examples work. Functions with similar structure are trivial to implement, but I want to focus on improving the tests first.
For grammar reference look at grammar.bnf.
Use pipenv to install dependencies:
pipenv install --dev
Run tests with:
pipenv run tests
Automatically run tests after detecting changes with:
pipenv run tests-watch
assert False
where necessary.pytest
directly: pytest --capture=no
.utils
package. Usage example:```python from chelodina import compiler from chelodina.utils.debug import parseprint
logo_code = """ to myfunction forward 51.0 left 91 end """
parsed_ast = compiler.get_ast(logo_code) parseprint(parsed) ```
And you'll see the resulting AST:
python
Module(body=[
Import(names=[
alias(name='turtle', asname=None),
]),
FunctionDef(name='myfunction', args=arguments(args=[], vararg=None, kwonlyargs=[], kw_defaults=[], kwarg=None, defaults=[]), body=[
Expr(value=Call(func=Attribute(value=Name(id='turtle', ctx=Load()), attr='forward', ctx=Load()), args=[
Num(n=51.0),
], keywords=[])),
Expr(value=Call(func=Attribute(value=Name(id='turtle', ctx=Load()), attr='left', ctx=Load()), args=[
Num(n=91.0),
], keywords=[])),
], decorator_list=[], returns=None),
Expr(value=Call(func=Attribute(value=Name(id='turtle', ctx=Load()), attr='done', ctx=Load()), args=[], keywords=[])),
])
I use black for code formatting, please install the pre-commit hook before doing a PR. This will be enforced with a linter check in the future.
You can run the command manually too:
black .
Not required, but if you install EditorConfig in your editor of choice it will make your life easier.
Bumps ipython from 7.0.0rc1 to 7.16.3.
d43c7c7
release 7.16.35fa1e40
Merge pull request from GHSA-pq7m-3gw7-gq5x8df8971
back to dev9f477b7
release 7.16.2138f266
bring back release helper from master branch5aa3634
Merge pull request #13341 from meeseeksmachine/auto-backport-of-pr-13335-on-7...bcae8e0
Backport PR #13335: What's new 7.16.28fcdcd3
Pin Jedi to <0.17.2.2486838
release 7.16.120bdc6f
fix conda buildDependabot will resolve any conflicts with this PR as long as you don't alter it yourself. You can also trigger a rebase manually by commenting @dependabot rebase
.