Software I've written

I write software, both for a living and as a hobby. I started with BBC Basic more than 30 years ago and have never really stopped. You can see some things I'm working on over at my Github page, or you can read on for a description of some of the more interesting things I've worked on during my spare time.


Zoom is a Z-Machine interpreter I wrote, originally as a piece of demonstration code for my final year project at University. I later used it as a project for learning X11 code and Cocoa on OS X. I love interactive fiction as a genre, so I put a lot of effort into this project.


I wrote the Mac OS IDE for Inform 7, though I'm no longer the maintainer. This was an interesting project to do: it began life as a half-finished project that just ran the Inform 6 compiler which happened to be just the starting point needed when Graham Nelson was beginning the Inform 7 project. I glued a text editor and Zoom into it and it became a recognizable IDE.


A parser generator: interesting because it takes a unique approach to generalizing the LALR algorithm.

The traditional method is to deal with conflicts by attempting all the possible matches, either simultaneously (GLR) or by backtracking. This has a few issues: in languages that are really ambiguous the worst case performance is exponential; the end result is essentially indeterminate and needs further processing to be used.

TameParse instead takes the approach of making it so that matches can be made conditional based on the lookahead. That is, it adds a specifier that says 'follow this match only if the lookahead matches this context-free pattern'. This can be made to act like a backtracking parser (but it's much easier to choose which match is chosen in the final result), but because the lookahead and the final match don't need to match the same language fragment it becomes possible to disambiguate many context-sensitive features of modern languages (for example, the cast operator in C or C#).

A further innovation is the concept of 'weak' keywords, which are only distinguished from other lexical tokens in contexts where the parser actually has different behaviour for them. (The async keyword in C# is an example: it's an identifier in non-async contexts, something which is very hard to deal with in traditional parsers but which TameParse makes effortless)


Data-driven binding library for Swift. I suppose it would be called 'reactive' these days but when I were a lad we just called this stuff 'data-driven'. The trick with this library is that it makes it possible to write truly data-driven code where most modern reactive libraries have an event-driven approach instead. This is similar to the Knockout javascript library (it's also the paradigm behind spreadsheets and parametric CAD packages)

For example, with SwiftRebound you can write a Cocoa view that tracks the mouse just by implementing a draw method that draws a circle at the current mouse position. SwiftRebound will note that the drawing depends on the mouse position and will cause a redraw whenever it changes. Here's the full code for exactly that case. SwiftRebound comes with a toolset for building new reactive methods from traditional event-driven UI code.