[eating sushi]

J. Devin Papineau

I was until recently a Computer Science student at the University of Waterloo. I'm currently working at SAP (formerly Sybase iAnywhere) until the end of summer.

This is me eating sushi.

Resume

View it in pdf, html, or plain text. I wrote this Haskell program to convert it into HTML and LaTeX from a source format designed to be readable in plain text. In fact, the linked plain text version is the source. Barring some LaTeX-isms in the dashes, the source is also perfectly good Markdown. The generated LaTeX uses Daniel Burrows's resume class.

Code

Various things I made. Works On My Machine certified.

px

My graphics project was a software rasterizer in C++, with an implementation templated on shader code. It uses far too much template hackery, in order to allow vertex shaders to return arbitrary varying data, and in order generically vectorize and interpolate it. See it in action,

(Sorry for the particularly low resolution and framerate in these videos— ffmpeg had to keep up with rendering.) The code depends on SDL, SDL_image, and SDL_ttf, and it needs a relatively recent GCC to compile.

chai

chai is an object-oriented “scripting” language with exceptions, lexical closures, a module system, and “lisp-style” macros. The implementation uses a simple stack-based VM, compiling programs to bytecode rather than interpreting them directly. It started as my final project for grade 12 computer science; at this point it hasn't seen changes in quite a while. The build requires Scons and the Boehm GC.

As a short example, we can define the Fibonacci sequence, and print the first few terms with their digits reversed:

chai> import: iter
chai> fibs = iter:map([a,b] -> a, iter:iter([1, 1], [a, b] -> [b, a+b]))
=> #<iter:map iterator>
chai> for: x in iter:take(10, fibs) { puts(x.to_s.reverse) }
1
1
2
3
5
8
31
12
43
55

The for-in loop is a macro that expands to a while loop:

chai> import: sourcify (from: sourcify)
chai> for_loop = (~~ for: x in iter:take(10, fibs) { puts(x.to_s.reverse) })
=> [
     #for,
     [#op_in, #x, [#call, #iter:take, 10, #fibs]],
     [#call, #puts, [#"op_.", [#"op_.", #x, #to_s], #reverse]]
   ]
chai> puts(sourcify(macroexpand1(for_loop)))
let: #|%gs-729|, #|%gs-72a| = iter:take(10, fibs).iter {
    while: (try: {
                #|%gs-729| = #|%gs-72a|()
                true
            } :: StopIterationException {
                nil
            })
    {
        my x = #|%gs-729|
        puts(x.to_s.reverse)
    }
}

I made a binding for a small part of SDL, just enough to respond to key presses and blit to the screen.

mandelbrot

A threaded Mandelbrot set renderer. Here are some renders I created of select parts of this zoom sequence:

[zoom level 0] [zoom level 7] [zoom level 8] [zoom level 14]