Contains the class `Hindent`. Import and use this class to format and execute Scheme code.
Project description
Hindent is a syntax wrapper around lisp/scheme. The difference between Hindent and lisp/scheme is very simple: wherever lisp/scheme uses parenthesis, Hindent uses hanging indents. For example:
# Hindent
+
2
2
# lisp
(+ 2 2)
And some more examples:
display
+
2
2
(display (+ 2 2))
display
car
quote
1
2
3
(display (car (quote (1 2 3))))
define
x
4
+
2
x
(define x 4)
(+ 2 x)
How it works
Hindent simply parses the Hindent code and inserts parenthesis where appropriate to convert it to lisp/scheme. So, it is mostly a parser, but a fancy word for it could be a transpiler.
Installation
- Clone this repository or simply grab the python file
- Install chez scheme (
brew install chezscheme
) and make sure it's on your path by runningchez
.- This also works with other lisps or schemes. If
you want to do that, the
notes in the
initialize
method will explain how to do it.
- This also works with other lisps or schemes. If
you want to do that, the
notes in the
Usage
I think a nice way to interactively run programs is with jupyter.
So, I recommend opening up a jupyter notebook. Then, simply start to
import Hindent
with from Hindent
, and the docstrings/code-hover
will guide you from there.
One heads up is that when running, the
newline
anddisplay
functions are helpful. If you don't usedisplay
, then lisp will not output anything. So, if you are experimenting, and you want to see results of what you run, you need to usedisplay
. And regardingnewline
, if you don't use it, all of the output will be smushed together.
Parsing Spec
- the transpiler supports literate programming. So, most of the
source code is natural language.
- to denote a block of code, put a lone period on a line before the code, and a lone period on a line after the code.
- the parser/transpiler will put a new line after the source code to ensure the final dedent is correct
- any amount of whitespace that contributes to a blank line
(other than the last line) should be replaced with a single
new line character. For example,
\n\n\n
should be replaced with\n
, and\n \n
should also be replaced with\n
- lines that start with
;
are comments and will be ignored - calculate the number of spaces each line starts with.
- Then divide by 2 to determine the indentation level
- then, for each line find the difference in indentation level
between that line and the following line
- if the indentation level goes up one, then add an opening parenthesis before the line
- if the indentation level goes down, then add a closing parenthesis after the line according to the number of dedents.
- if the indentation level remains the same, then we have to check one more thing:
- if the current indentation level (and also the indentation level of the following line) is at 0, then wrap the current line in parenthesis
- if the current indentation level (and also the indentation level of the following line) is nonzero, then do nothing
ToDo
- allow for end-of-line comments
- VS Code extension
- file icon
- syntax highlight code vs comments/natural language
- maybe get it out of running as a subprocess so it returns things more easily
- make a sphinx site
- convert readme to rst
- make into a package and push to pypi
Project details
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.