News for hackers. Stuff that matters.
Re:Bootstrapping Urbit from Ethereum by pcmonk on Wednesday September 20, 2017 @11:36PM (#15300411)
> "A value in Hoon is called a noun" - or you could just call it a value.

A "value" sounds like an abstract concept. A noun is one of two things: a natural number or a pair of nouns. Calling it a "value" makes it sound much more abstract than it is.

> "A core has no exact equivalent in conventional languages, but the closest equivalent is an object. An object has methods; a core has functionally computed attributes (arms). An arm that produces a gate is the Hoon equivalent of a conventional method;" - or you could just say that objects in Hoon (the language) can have methods and attributes, and you would never need to invent the core/arm/gate terminology.

A core is not an object in any meaningful sense. You can create stuff that looks like objects with them, but they're used for a lot more than that. For example, all gates/functions are cores, but there's no sense in which you'd call those "objects".

> They try to give themselves an out by saying stuff like "Hoon has concepts like all these abstractions, but they remain false cognates." When you dig into it, the only unique things are the words. It's like children trying to come up with a code- "instead of door we'll say blorp and instead of close we'll say bleep. Now bleep the blorp before we continue inventing our code.

The thing about revolutionary concepts is that their underlying principles are different than what you're used to, so if they look similar on the surface, you're lulled into thinking they're basically the same. But anyone who's put significant effort into programming in Urbit will tell you the system is fundamentally different. Not in the sense of "you could never understand what's going on here"; but rather, "we made these few different design decisions in the beginning, and that permeates everything".

Re:Bootstrapping Urbit from Ethereum by tptacek on Wednesday September 20, 2017 @11:56PM (#15300481)
For example, all gates/functions are cores, but there's no sense in which you'd call those "objects".

To me, all you're doing here is describing an object-based language in which functions are first-class. Obviously, Urbit didn't invent this concept. Its predecessors used normal names for these terms. Why does Urbit invent new ones?

We could productively stay focused on just this one example, and see if there's a better reason for Urbit to call its objects "cores" and its methods or attached functions or computed attributes "arms".

Re:Bootstrapping Urbit from Ethereum by pcmonk on Thursday September 21, 2017 @12:10AM (#15300540)
> To me, all you're doing here is describing an object-based language in which functions are first-class. Obviously, Urbit didn't invent this concept. Its predecessors used normal names for these terms. Why does Urbit invent new ones?

That's a pretty (unintentionally) misleading description of it. What is an object? An Urbit function has basically nothing that an OOP object has. No class, no inheritance, no attributes, and no methods. It's just a way of encapsulating a formula (VM assembly expression) in a way that's convenient to call with formulas. It uses the the "core" pattern because it's convenient.

"Arm" is a pretty specific term that refers to the way an "element" of a core is represented in the core. When you want to map a particular use of cores to its underlying representation in the "core" pattern, you want to be able to talk about specific data structures.

In general, Urbit errs on the sides of giving names to concepts that could only otherwise be described in multiple sentences. Most projects just don't give names to those concepts. Urbit needs better human descriptions of its concepts, but using traditional names for them would be misleading.

Re:Bootstrapping Urbit from Ethereum by tptacek on Thursday September 21, 2017 @12:15AM (#15300550)
How are these not problems that every VM for a high-level programming language also addresses?
Re:Bootstrapping Urbit from Ethereum by pcmonk on Thursday September 21, 2017 @12:28AM (#15300598)
They absolutely do, with their own terms. Isn't an S-expression just a list? Isn't a method just a "member function", which is really just a function, which is really just a subroutine? Every language comes up with its own terms, especially for things that are a little different from previous work.

Urbit isn't trying to solve many new problems; it's trying to solve old problems in different ways. They just want to be able to talk about the constructs in their solutions.

Re:Bootstrapping Urbit from Ethereum by tptacek on Thursday September 21, 2017 @12:31AM (#15300608)
Right, I get that. So I guess my question is: in what ways justifying new terminology are the approaches taken by Urbit different? And whether or not they're different enough from prior art to merit obscure new terms, are those differences worthwhile, or are they different for the sake of being different? Because not all of the last 30 odd years of systems and programming research was pointless.
Re:Bootstrapping Urbit from Ethereum by pcmonk on Thursday September 21, 2017 @12:47AM (#15300676)
> not all of the last 30 odd years of systems and programming research was pointless.

Indeed, which is why it's a shame our primary server OSes (Unix-likes) can't incorporate them. Urbit can.

As for what are the approaches different, there have been many words spilled over that, but here's a few examples to wit, most of which exist in one or two other systems, but aren't widely used:

- All events are transactions, down to the VM level. There's no concept of an event that left garbage around because power was cut or the machine was rebooted. You can always crash an event, making it as if it never happened.

- Single-level store. Never worry about ORM because your in-memory state never goes away (because all events are transactions).

- Persistent connections with exactly-once messaging. Disconnection is just seen as long latency.

- Strict, purely functional language with a strong type system but no Hindley-Milner (so you don't need category theory).

- Sane indentation for a functional language, known as "backstep".

- The file system is a typed revision control system, which allows intelligent diffs on types other than plain text.

Most, if not all, of these, have been described in research, but nobody's bothered to build a system with them.

Re:Bootstrapping Urbit from Ethereum by mrkgnao on Thursday September 21, 2017 @04:49AM (#15301620)
Rust uses Hindley-Milner type inference. OCaml uses Hindley-Milner. Swift apparently uses a variant of the system with more features.

None of these make use of monads or anything rooted in category theory.

https://en.wikipedia.org/wiki/Hindley%E2%80%93Milner_type_sy...

HM is a type system that also gives you an algorithm to infer types without having to do the "List<Integer> foo = new ArrayList<Integer>()" dance from languages without type inference. That's it. It has nothing to do with category theory.

Re:Bootstrapping Urbit from Ethereum by steveklabnik on Thursday September 21, 2017 @09:16AM (#15303008)
(Rust doesn't use Hindley-Milner, though the plan is to try to move closer to it in the future)
Re:Bootstrapping Urbit from Ethereum by mrkgnao on Thursday September 21, 2017 @11:40AM (#15304555)
Oh, thanks for the correction.

It would appear that my knowledge is out of date: did Rust use something closer to H-M in the past? (Going off of https://github.com/rust-lang/rust/pull/15955 here.)

Re:Bootstrapping Urbit from Ethereum by steveklabnik on Thursday September 21, 2017 @11:57AM (#15304740)
For more, see here: https://www.reddit.com/r/rust/comments/6fs5q9/language_serve... see aturon's reply about that PR/blog post.

Rust has done almost everything in the past; I wouldn't be surprised if somewhere back in there it was actually HM. :)

Re:Bootstrapping Urbit from Ethereum by jolux on Wednesday September 27, 2017 @05:08PM (#15352371)
Arguably optionals are monadic.
Re:Bootstrapping Urbit from Ethereum by mrkgnao on Friday October 06, 2017 @12:48AM (#15414493)
Optionals are also "applicative", but Haskellers used them for a long time before applicative functors became popular. A concept can support a certain way of thinking about it without everyone needing to think that way :)
Re:Bootstrapping Urbit from Ethereum by jolux on Friday October 06, 2017 @11:56PM (#15422198)
you don't need to think that way, no, but i was pretty sure that rust optionals were modeled after the maybe monad. perhaps not.
Re:Bootstrapping Urbit from Ethereum by jolux on Friday October 06, 2017 @11:57PM (#15422204)
oh ok i misread your original, you were only referring to type inference. i thought you were saying none of the languages mentioned had monads.
Re:Bootstrapping Urbit from Ethereum by occultist_throw on Thursday September 21, 2017 @11:20PM (#15309185)
> Persistent connections with exactly-once messaging. Disconnection is just seen as long latency.

Bullshit.

https://groups.csail.mit.edu/tds/papers/Lynch/jacm85.pdf

Unless you and Yarvin really think there's a valid answer to the 2 Generals problem... Im sure there's a Fields medal in there if you do.

"Every major message queue in existence which provides any guarantees will market itself as at-least-once delivery. If it claims exactly-once, it’s because they are lying to your face in hopes that you will buy it or they themselves do not understand distributed systems. Either way, it’s not a good indicator."

~ http://bravenewgeek.com/you-cannot-have-exactly-once-deliver...

Re:Bootstrapping Urbit from Ethereum by pcmonk on Saturday September 23, 2017 @04:49PM (#15321632)
From the second link:

> FLP and the Two Generals Problem are not design complexities, they are impossibility results.

Two generals, in its impossible form, isn't applicable here. For example, this proof[0] depends on the deterministic form being impossible to solve in a finite number of messages. But why would we care about doing it in a finite number of messages? By that measure, at-least-once delivery is impossible too, yet neither you nor the blogger seem to have a problem with that. The solution is easy and common: send a message, ack new messages, retry if you don't receive an ack, never ack an ack, and always ack a dupe. As long as you aren't disconnected forever, this will give you at least once delivery.

FLP only applies in the case of faulty processes. Specifically, FLP arises because the faulty process must either (1) ack the message before handling it, or (2) handle it before acking it. (1) fails if it crashes after acking before handling, causing it to forget it ever received the message (at-most-once). (2) fails if it handles the message, but doesn't persist that fact to disk, so that when the dupe is received it doesn't know it already handled it (at-least-once).

Urbit processes events transactionally (like a database), so you're guaranteed that if you received an ack it's because the other person has persisted that message or its results, and it won't forget about (i.e. they've persisted any state changes related to it). No faulty process, no problem. FLP impossibily doesn't apply.

I suggest actually learning about proposed solutions to problems rather than recalling that someone convinced you they were impossible to solve. Proofs are powerful because they're incontrovertibly true, but they only apply if their conditions are met.

[0] https://en.wikipedia.org/wiki/Two_Generals%27_Problem#Proof

Re:Bootstrapping Urbit from Ethereum by rhencke on Saturday September 23, 2017 @12:25PM (#15320402)
Urbit claims, like you, exactly-once messaging is impossible: https://news.ycombinator.com/item?id=14666015

But that doesn't mean we can't provide systems where, for all practical purposes, it is a guarantee.

Another way to think about it: SHA1 cannot provide a unique hash for every possible set of content - there are overlaps. This is the pigeonhole principle.

Yet, we have entire systems designed around assuming SHA1 is and will always be a unique hash for a piece of content (Git), and, for all practical purposes, it is a guarantee good enough to work despite that.

[dead]
Re:Bootstrapping Urbit from Ethereum by rhencke on Saturday September 23, 2017 @05:07PM (#15321733)
From all reference I have read, the phrase "exactly-once messaging" does not have a strict technical definition. Neither of your links define or use the exact term "exactly-once messaging". If you can point me to a definition of this specific phrase's standard terminology, I would be grateful. But, I cannot find one.

I don't understand why you address me with such a hostile tone. What have I done to deserve this? You accuse me of playing word games, but this is not my intent. I am just trying to have a conversation about the technical aspects of a system.

Re:Bootstrapping Urbit from Ethereum by Munksgaard on Thursday September 21, 2017 @01:40AM (#15300838)
I'm curious: What's the advantage of ditching Hindley-Milner?
Re:Bootstrapping Urbit from Ethereum by Chattered on Thursday September 21, 2017 @02:45AM (#15301052)
I want to give urbit a try. I have a planet, but last time I fired it up the latency was so bad that I wasn't having fun. I'll try again sometime.

I can even get behind runes, and I set up abbreviations in Emacs to learn their names. And generally, I like the philosophy of language where short, one syllable, old/middle English words are used in place of the less familiar Latin/Greek derived words. I don't have a problem with revising our existing vocabulary in this way.

But the attitude to type theory strikes me as anti intellectual, precisely because we get nonsense claims about Hindley Milner requiring category theory. This sort of misinformation does no good for anyone.

Re:Bootstrapping Urbit from Ethereum by vmchale on Thursday September 21, 2017 @08:59PM (#15308623)
None whatsoever. Hindley-Milner is in fact used widely in language design because of its relatively good error messages (as well as ease of implementation). Also it really doesn't have much to do with category theory.
Re:Bootstrapping Urbit from Ethereum by vmchale on Thursday September 21, 2017 @09:08PM (#15308666)
>Sane indentation for a functional language, known as "backstep"

This is A) not an impressive problem to solve, and B) not actually a problem in Haskell or Elm.

Re:Bootstrapping Urbit from Ethereum by jerkstate on Wednesday September 20, 2017 @11:50PM (#15300465)
> A noun is one of two things: a natural number or a pair of nouns

To most of us, a "noun" is a person, place, thing, idea, or feeling.

I started replying to the other stuff you were saying, but I started getting this feeling like you're in on the joke and I'm not.

Re:Bootstrapping Urbit from Ethereum by pcmonk on Thursday September 21, 2017 @12:12AM (#15300545)
To most of us an "object" is something you can touch. We overload these terms all the time.
Re:Bootstrapping Urbit from Ethereum by aboodman on Wednesday September 20, 2017 @11:59PM (#15300498)
> A core is not an object in any meaningful sense. You can create stuff that looks like objects with them, but they're used for a lot more than that. For example, all gates/functions are cores, but there's no sense in which you'd call those "objects".

In many, many languages, a function is also an object.