Skip to content

Navigation Menu

Sign in
Appearance settings

Search code, repositories, users, issues, pull requests...

Provide feedback

We read every piece of feedback, and take your input very seriously.

Saved searches

Use saved searches to filter your results more quickly

Sign up
Appearance settings
/ hython Public
forked from mattgreen/hython

Haskell-powered Python 3 interpreter

License

Notifications You must be signed in to change notification settings

sicper/hython

Folders and files

NameName
Last commit message
Last commit date

Latest commit

History

460 Commits

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 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

About

Haskell-powered Python 3 interpreter

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Haskell 63.1%
  • Python 20.0%
  • Yacc 16.7%
  • Makefile 0.2%

AltStyle によって変換されたページ (->オリジナル) /