Skip to content

mattgreen/hython

Folders and files

NameName
Last commit message
Last commit date

Latest commit

fcbde98 · Aug 1, 2017
Oct 1, 2016
Sep 29, 2016
Oct 1, 2016
Jul 18, 2015
Feb 18, 2016
Jul 14, 2016
Aug 1, 2017
Sep 29, 2016
Sep 29, 2016
Aug 13, 2015
Dec 28, 2015

Repository files navigation

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

  • Lexer
  • Parser
  • Most built-in data types, including int, bool, string, list, dict and range
  • Common unary and binary operators on common data types
  • A few built-in functions, including print
  • Variable assignment and lookup, with support for nonlocal and global keywords
  • Conditional expressions with if and else
  • All loop constructs: for and while with support for break and continue within them
  • Support for the with statement
  • Destructuring ((a,b) = [1,2])
  • Functions, including nested functions, default parameters, and keyword parameters
  • Splat (* and **) operators in caller argument lists
  • Lambda expressions, with proper environment capture
  • Classes, including inheritance and proper method resolution order
  • Objects
  • Exception handling via try, with support for handlers, frame unwinding, finally handlers, and else, along with some built-in exception classes
  • Basic support for loading modules with the import statement
  • Simple REPL
  • 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

  1. Install Stack

  2. Clone the repository:

     $ git clone https://github.com/mattgreen/hython.git
     $ cd hython
    
  3. Build:

     $ make
    
  4. 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

Reference Information