Skip to main content

A Toy Programming Language written in Python

Project description

mio is a minimalistic IO programming language written in the Python Programming Language based on MIo (a port from Ruby to Python) in the book How To Create Your Own Freaking Awesome Programming Language by Marc-Andre Cournoye.

This project is being developed for educational purposes only and should serve as a teaching tool for others wanting to learn how to implement your own programming language (albeit in the style of Smalltalk, Io, etc). Many thanks go to Marc-Andre Cournoye and his wonderful book which was a great refresher and overview of the overall processing and techniques involved in programming language design and implementation. Thanks also go to the guys in the #io channel on the FreeNode IRC Network specifically jer nad locks for their many valuable tips and help.

The overall goal for this project is to create a fully useable and working programming language implementation of a langauge quite similar to Io with heavy influence from Python (because Python is awesome!). This has already largely been achived in the current version. See the RoadMap for what might be coming up next.



Number fact = method(
    (self < 2) ifTrue(return self)
    return (self * ((self - 1) fact()))

Hello World:

print("Hello World!")


  • Homoiconic
  • Message Passing
  • Higher Order Messages
  • Higher Order Functions
  • Full support for Traits
  • Object Orienated Language
  • Written in an easy to understand language
  • Supports Imperative, Functional, Object Oriented and Behavior Driven Development styles.


The simplest and recommended way to install mio is with pip. You may install the latest stable release from PyPI with pip:

> pip install mio-lang

If you do not have pip, you may use easy_install:

> easy_install mio-lang

Alternatively, you may download the source package from the PyPI Page or the Downloads page on the Project Website; extract it and install using:

> python install

You can also install the latest-development version by using pip or easy_install:

> pip install mio-lang==dev


> easy_install mio-lang==dev

For further information see the mio documentation.


mio 0.0.4 (2013-10-27)

  • Moved the implementation of super to the mio std. lib
  • Only set _ as the last result in the Root object (the Lobby)
  • Added support for (), [] and {} special messages that can be used to define syntactic suguar for lists, dicts, etc.
  • Implemented Dict object type and {a=1, b=2} syntactic sugar to the builtint (mio std. lib) dict() method.
  • Refactored the File object implementation and made it’s repr more consistent with other objects in mio.
  • Fixed keyword argument support.
  • Fixed a few minor bugs in the Message object and improved test coverage.
  • Added ? as a valid operator and an implementation of Object ?message in the mio std. lib.
  • Fixed a bug with Range’s internal iterator causing Range asList not to work.
  • Fixed a bug with Object foreach and continue.
  • Achived 100% test coverage!
  • Implemented *args and **kwargs support for methods and blocks.
  • Removed Object methods print, println, write and writeln in favor of the new builtin print function in the mio std. lib
  • Added an implemenation of map to the mio std. lib
  • Fixed a bug with the parser where an argument’s previous attribute was not getting set correctly.
  • Reimplemented not in the mio std. lib and added -=, *= and /= operators.
  • Added a Object :foo (primitive) method using the : operator. This allows us to dig into the host object’s internal methods.
  • Added an implementation of abs builtin using the primitive method.
  • Changed the import function to return the imported module (instead of ``None``) so you can bind imported modules to explicitly bound names.
  • Added from an alias to import and Module import so you can do:
bar = from(foo) import(bar)
  • Fixed some minor bugs in Object foreach and Object while where a ReturnState was not passed up to the callee.
  • Added implementations of all and any to the mio std. lib.
  • Added this.mio (The Zen of mio ala Zen of Python)
  • Added List insert method and internal __len__.
  • Moved the implementations of the Importer and Module objects to the host language (Python).
  • Added support for modifying the Importer search path.
  • Restructured the mio std. library and moved all bootstrap modules into ./lib/bootstrap
  • Added (almost) Python-style string literal support. Triple Quote, Double, Quote, Single Quote, Short and Long Strings
  • Added support for exponents with number literals.
  • Added internal tomio and frommio type converion function.
  • Added an FFI implementation that hooks directly into the host language (Python).
  • Implemented the antigravity module in mio.
  • Added support for exposing builtin functions as well in the FFI.
  • Simplified the two examples used in the docs and readme and write a simple bash script to profile the factorial example.
  • Changed the calling semantics so that calls to methods/blocks are explicitly made with ().
  • Added a new internal attribute to Object called binding used to show the binding of a bound object in repr(s).

mio 0.0.3 (2013-10-20)

  • Improved test coverage
  • Improved the Range object
  • Fixed the scoping of block (s).
  • Fixed the write and writeln methods of Object to not join arguments by a single space.
  • Don’t display None results in the REPL.
  • Improved the __repr__ of the File object.
  • Added open and with builtins to the mio standard library.
  • Implemented a basic import system in the mio standard library.
  • Implemented Dict items method.

mio 0.0.2 (2013-10-19)

  • Include lib as package data
  • Allow mio modules to be loaded from anywhere so mio can be more usefully run from anywhere
  • Added bool type converion
  • Improved the documentation and added docs for the grammar
  • Changed Lobby object to be called Root
  • Added an -S option (don’t load system libraries).
  • Added unit test around testing for last value with return
  • Refactored Message.eval to be non-recursive
  • Set _ in the context as the last valeu
  • Implemented Blocks and Methods
  • Fixed return/state issue by implementing Object evalArg and Object evalArgAndReturnSelf in Python (not sure why this doesn’t work in mio itself)
  • Implemented Object evalArgAndReturnNone

mio 0.0.1 (2013-10-19)

  • Initial Release

Project details

Release history Release notifications

History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


History Node


This version
History Node


History Node


History Node


History Node


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Filename, size & hash SHA256 hash help File type Python version Upload date
mio_lang-0.0.4-py2.7.egg (172.8 kB) Copy SHA256 hash SHA256 Egg 2.7 Oct 27, 2013
mio-lang-0.0.4.tar.gz (220.2 kB) Copy SHA256 hash SHA256 Source None Oct 27, 2013

Supported by

Elastic Elastic Search Pingdom Pingdom Monitoring Google Google BigQuery Sentry Sentry Error logging CloudAMQP CloudAMQP RabbitMQ AWS AWS Cloud computing Fastly Fastly CDN DigiCert DigiCert EV certificate StatusPage StatusPage Status page