<div dir="ltr"><div class="gmail_default" style="font-family:monospace,monospace">More precisely, UBF consists of THREE layers.</div><div class="gmail_default" style="font-family:monospace,monospace"><quote src=""></div><div class="gmail_default" style="font-family:monospace,monospace"><ul><li>
UBF(a) is a "language neutral" data transport format, roughly
  equivalent to well-formed XML.
</li><li>
UBF(b) is a programming language for describing types in UBF(a) and
  protocols between clients and servers.  This layer is typically
  called the "protocol contract".  UBF(b) is roughly equivalent to
  Verified XML, XML-schemas, SOAP and WDSL.
</li><li>
UBF(c) is a meta-level protocol used between a UBF client and a UBF
  server.
</li></ul>
<p></quote></p><p><br></p><p>UBF(b) is analogous to an Interface Definition Language like Avro or Protobufs OMG IDL.</p><p>It has one major extension, namely states.  The client and server are modelled as finite state automata and messages may only be valid in certain states, and responses indicate transitions to other states.  This is where "contracts" are specified.  The only thing quite like it is in one of Microsoft's extensions to C#, I think it was Sing# but it might have been Midori.</p><p>UBF(c) is the layer where contract checking actually happens.</p><p>UBF(a) makes distinctions that JSON does not:  the distinction between strings and binaries, the distinction between lists and tuples, and the distinction between integers and floats (JSON does not guarantee that 10 is an integer or that 10.0 is not an integer).  JSON can represent one thing that UBF(a) could not, and that is maps with strings as keys, because UBF was designed when Erlang did not have maps.  JSON is limited to string keys only.  It would not take much to extend UBF(a) to maps.</p><p>The Smalltalk community have adopted an extension of JSON called STON, but don't really have an analogue of UBF(b) or UBF(c).  <br></p></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Sun, 7 Nov 2021 at 05:02, Ulf Wiger <<a href="mailto:ulf@wiger.net">ulf@wiger.net</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div dir="auto">UBF consists of two parts: UBF(a), which describes the daya types, and UBF(b), which describes the interaction part.<div dir="auto"><br></div><div dir="auto"><a href="https://ubf.github.io/ubf/ubf-user-guide.en.html#specifications" target="_blank">https://ubf.github.io/ubf/ubf-user-guide.en.html#specifications</a><br></div><div dir="auto"><br></div><div dir="auto">BR,</div><div dir="auto">Ulf W</div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">Den lör 6 nov. 2021 16:14 <<a href="mailto:hamishberridge@tutanota.com" target="_blank">hamishberridge@tutanota.com</a>> skrev:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">
  
    
  
  <div>
<div>Does the role of contract checker act something like validator? If so, does that imply binary_to_term/ term_to_binary does not use that because the communication happens within Erlang environment? I could totally go wrong as I am not familiar with it; but I am curious, because I learned a lot of concepts from Erlang and from reading Joe Armstrong's thesis, even though I never wrote any Erlang code at all. Really appreciate those writings. That helps me a lot in learning system design, and many other parts in programming as well.   <br></div><div dir="auto"><br></div><div>Oct 28, 2021, 21:51 by <a href="mailto:ulf@wiger.net" rel="noreferrer" target="_blank">ulf@wiger.net</a>:<br></div><blockquote style="border-left:1px solid rgb(147,163,184);padding-left:10px;margin-left:5px"><div dir="ltr"><div><br></div><div>The key feature of UBF was that beyond being a serialization format, it was also a contract checker.<br></div><div>That was a very nice feature. If you'd like to do something like that today, perhaps you'd go for JSON or MessagePack encoding, JSON-Schema and Jesse.<br></div><div><br></div><div>Needless to say, Joe's solution was far more elegant. It was also far less supported, even when he was alive. Joe was always searching for the next interesting challenge, and as memory serves, he parked UBF thinking that he wasn't 100% satisfied with it. It didn't bother him to park something for a decade while trying to address that final wrinkle.<br></div><div><br></div><div>BR,<br></div><div>Ulf W<br></div><div><br></div><div><a shape="rect" rel="noopener noreferrer noreferrer" href="https://gmail.app.vereign.com/#CiAzy_GB8f6QvveZ4EbTaXoDdsWTb_ETB6W49Cwj1RyD1xIggbHUSgcbmAeIDsfNGcBv5GttvylTY3bzBmlLx8UQ6AA=" id="gmail-m_-9035087059174709079m_3983489346511247079seal-container-v1-2b121f83eea49a7b1f47514a026bd644601f52a0f203394da1d6a9ca74505d2f" target="_blank"><img style="width: 145px; height: 219px;" alt="Vereign Seal" id="gmail-m_-9035087059174709079m_3983489346511247079seal-image-2b121f83eea49a7b1f47514a026bd644601f52a0f203394da1d6a9ca74505d2f" width="145" height="219"></a><br></div></div><div><br></div><div><div dir="ltr">On Thu, Oct 28, 2021 at 7:45 AM <<a href="mailto:hamishberridge@tutanota.com" rel="noopener noreferrer noreferrer" target="_blank">hamishberridge@tutanota.com</a>> wrote:<br></div><blockquote style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex"><div><div><br></div><div dir="auto">I haven't used Erlang, so I suppose my question is very naive. I read that UBF[1] is not maintained. So I am wondering what's used by Erlang as serialization format? Is there a new one that replaces UBF? Or UBF is still used as it, it's just not much change as it's stable? <br></div><div dir="auto"><br></div><div dir="auto">If there are UBF alternative options, what options are available? <br></div><div dir="auto"><br></div><div dir="auto">Many thanks<br></div><div dir="auto"><br></div><div dir="auto">[1]. <a href="https://github.com/ubf/ubf" rel="noopener noreferrer noreferrer" target="_blank">https://github.com/ubf/ubf</a><br></div></div></blockquote></div></blockquote><div dir="auto"><br></div>  </div>

</blockquote></div>
</blockquote></div>