mattgreen / Hython
Programming Languages
Labels
Projects that are alternatives of or similar to Hython
hython
A toy Python 3 interpreter implemented in Haskell.
Introduction
I wanted to learn Haskell, and I wanted a big project, so I decided to write a Python 3 interpreter. The result was extremely educational and easily the coolest project I've ever worked on. Because it's implemented in a naive fashion, it won't ever be a replacement for real Python implementations.
Note: Hython only implements most of the Python3 language. It doesn't contain much of a standard library, which is a big part of what makes Python pleasant to use. Adding all of the necessary machinery needed for the existing Python 3 standard library to function is an enormous undertaking that I'm not interested in.
Status
It's finally done! Or at least, I'm declaring it that way.
Features
- [x] Lexer
- [x] Parser
- [x] Most built-in data types, including
int
,bool
,string
,list
,dict
andrange
- [x] Common unary and binary operators on common data types
- [x] A few built-in functions, including
print
- [x] Variable assignment and lookup, with support for
nonlocal
andglobal
keywords - [x] Conditional expressions with
if
andelse
- [x] All loop constructs:
for
andwhile
with support forbreak
andcontinue
within them - [x] Support for the
with
statement - [x] Destructuring (
(a,b) = [1,2]
) - [x] Functions, including nested functions, default parameters, and keyword parameters
- [x] Splat (
*
and**
) operators in caller argument lists - [x] Lambda expressions, with proper environment capture
- [x] Classes, including inheritance and proper method resolution order
- [x] Objects
- [x] Exception handling via
try
, with support for handlers, frame unwinding,finally
handlers, andelse
, along with some built-in exception classes - [x] Basic support for loading modules with the
import
statement - [x] Simple REPL
- [x] Support for the
is
operator - [ ] Support for generators and
yield
- [ ] List/generator/dict/set comprehensions
- [ ] Index slicing
- [ ] Support for decorators / metaclasses
- [ ] Multi-line input for the REPL
Code Metrics
sloccount
output as of 10/1/16:
Totals grouped by language (dominant language first):
haskell: 2159 (70.83%)
yacc: 580 (19.03%) # parser
python: 309 (10.14%) # lib
Examples
See the test directory for example code that works
Building and running
-
Install Stack
-
Clone the repository:
$ git clone https://github.com/mattgreen/hython.git $ cd hython
-
Build:
$ make
-
Run a file:
$ ./hython test/fib.py
REPL
Hython includes a simple REPL, which you can play around with:
$ ./hython
Test Suite
Hython's test suite is rather simple: it ensures the output of Hython matches that of the system's python3
for each test file.
To run the automated test suite:
$ make test