hython - Haskell-powered Python 3 interpreter

jopen 9年前

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 and dict
  • 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
  • Support for decorators / metaclasses

Code Metrics

sloccount output as of 2/17/16:

Totals grouped by language (dominant language first):  haskell:       2084 (78.02%)  yacc:           587 (21.98%) # Parser

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

项目地址: https://github.com/mattgreen/hython