on Plunder

posted on 2025-01-02 by mhueschen

previously I linked to https://sr.ht/~plan/plunder/, which used to be the public git repository of the main Plunder codebase. it seems that the page is now private.

I thought it could be helpful to outline some of the main features of Plunder, which in my opinion was/is a very inventive and ingenious attempt to realize Urbit’s vision and address some of the key deficiencies of Urbit, which seemingly doom it to fall short of its goal.

<< TODO: refine this >>

  • PLAN
    • simple core calculus / representation
  • “data jets”
    • a way to “project” between simple but inefficient PLAN representations and “hardware accelerated” efficient, but more complex representations inside the runtime
  • “jets”: similar to Urbit’s concept, it is analogous to “data jets” but for functions.
    • “jetting” a PLAN-defined function allows the runtime to use more efficient code to operate on a PLAN value.
    • a “jet” usually operates on a value which is “data jetted”. for example, an array-length function might be used on an array, and under the hood, Haskell’s Data.Vector can be used.
  • code is data
    • Plunder exhibits “true homoiconicity”, arguably moreso than Lisp, because functions (called Laws in PLAN) are normal values and can be modified using other functions. many Lisps & Schemes will output #<procedure:...>, or some such, when attempting to print a function. in PLAN, this is a normal value.
  • “immortal” programs
    • because programs are just data, it is possible to create a function which will hold its state internally, receive inputs, and return outputs.
    • in Haskell, this would be approximately newtype Immortal = Immortal (Input -> (Output, Immortal)).
      • state would accumulate in the “closure” of the function - potentially huge amounts of state, as a decent PLAN runtime would support memory mapping of Pins.
  • event log + snapshots
    • a PLAN runtime is based on an event log of system calls. these are all logged, and periodically a full snapshot is written. if the runtime crashes, resumption is as simple as loading the last snapshot, then replaying all logged events since said snapshot.
    • imagining an “immortal” program from above - this mechanism allows it to run potentially forever, surviving runtime crashes, power outages, or moves between underlying machines.
    • (this of course relies on the PLAN representation itself not changing)
  • “hardware” devices
    • TODO
  • “machines”
    • TODO

Pallas / OPFN

some work publicly lives on via https://github.com/operating-function/pallas.