August 2020

OCaml vs Ruby for implementing a programming language

  • Languages have their strong applications. OCaml is known for being awesome to build PLs. but why? What’s the fuss? I’m going to show you via concrete code examples.
    • Original Rust compiler
    • Full-stack tools: Hazel, Dark
  • I’ve built the MAL lisp in Ruby (see the TCO post) and now doing it in OCaml.
    • Like the TodoMVC of language implementations
  • Ruby isn’t bad but it’s no OCaml for this purpose.
    • dynamic OO(ish) lang with lots of mutation
    • vs. static functional lang with mostly immutable.

Little notes:

  • Link to Jon Edwards post?
  • Note ReasonML is a potential for full stack envs too.
  • Note the “Sweet spot”, Matt Might

Why it’s great

Static typing

  • so many bugs fixed
  • tagged unions
  • ad hoc nil checks in ruby are covered in ocaml
  • no annotations needed due to inference
    • maybe we’ll cover how this works sometime soon. OCaml is a great lang for implementing type inference.
  • can be a little annoying sometimes that it’s hard to get the program to run
    • I wish there were “type warnings” as Yegge said in his compilers essay, or Typescript has.
    • tricks:
    • fill in bogus code that passes type checking
    • adding type annotations to guide type inference

Pattern matching

  • tagged unions + destructuring, amazing
  • show some examples of where pattern matching rules
  • exhaustiveness checking catches weird cases

Immutable (mostly)

  • contrast environment mutation
  • note how ref makes it easy to still manage limited mutable state
  • reasoning about env state in ruby isn’t as easy

Why it’s not

  • ugh, tooling (link to Paul Biggar’s post)
  • Makefile, library linking, etc
  • some exciting news on this front from the OCaml platform keynote