urbit/pub/docs/dev/hoon/leap-in/3-app.md
2015-12-08 11:26:46 -08:00

2.3 KiB

hide next sort title
true false 3 Advanced Applications

XXX PLACEHOLDER

But what is our app state, exactly? In Unix systems, application state is just a block of memory, which you need to serialize to disk if you want to keep it around for very long.

In urbit, app state is a single (usually complex) value. In our example, we don't have any special state, so we defined state=~, meaning that our state is null. Of course, state is just a name we're assigning to it, and you're free to use whatever name you want.

Since urbit is purely functional, we can't just implicitly "have" and "change" our state. Rather, it's explicitly passed to us, in the |_ [bowl state=~] line, and we produce the new state with +>.$ in the [~ +>.$] line.

Two points you may be wondering about. Firstly, bowl is a set of general global state that is managed by the system. It includes things like now (current time), our (our urbit identity), and eny (256 bits of guaranteed-fresh entropy). For the full list of things in ++bowl, search for ++ bowl (note the double space) in /arvo/zuse.hoon.

This is a very common technique in learning hoon. While some documentation exists, often the easiest way to learn about an identifier you see in code is to search in /arvo/zuse.hoon and /arvo/hoon.hoon for it. These are our two "standard libraries", and they're usually not hard to read. Since urbit's codebase is relatively small (those two files are less than 15000 lines of code combined, and besides the standard library they include the hoon parser and compiler, plus the /arvo microkernel), you can usually use the code and the comments as reference doc.

Second point is that urbit needs no "serialize to disk" step. Everything you produce in the app state is persistent across calls to the app, restarts of the urbit, and even power failure. If you want to write to the filesystem, you can, but it's not needed for persistence. Urbit has transactional events, which makes it an ACID operating system. Persistence is just another one of those things you don't have to worry about when programming in urbit.

As fascinating as state is, we don't actually need any state to accomplish our immediate goal, which is to get apps on two urbits talking to each other. We'll discuss state more in a later chapter.