<br><br>
<div><span class="gmail_quote">On 7/30/08, <b class="gmail_sendername">Richard A. O'Keefe</b> <<a href="mailto:ok@cs.otago.ac.nz">ok@cs.otago.ac.nz</a>> wrote:</span> 
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid"><span class="q">On 29 Jul 2008, at 6:10 pm, Willem de Jong wrote:<br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">How about a SAX-like API?<br></blockquote><br></span>(1) Anyone who wants such a design can produce their own design,<br>
   AND their own code.  The EEP I am concerned with is a DVM-<br>   like design (Document *Value* Model).</blockquote>
<div> </div>
<div>Of course, but if the Erlang team creates special, fast support in C it </div>
<div>would be good if it could be used by as many people as possible.</div><br>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">(3) In the functional programming world, SAX is less attractive,<br>   because the usual techniques for using an ESIS/SAX-like interface<br>
   are heavily stateful.<br><br>   Once I had my Document Value Model kit, I found doing things the<br>   "functional" way over documents as trees was so much easier than<br>   doing things the ESIS/SAX-like way that now work with entire<br>
   forms whenever I can, and this is *C* programming I'm talking<br>   about, where stateful is supposed to be easy.</blockquote>
<div> </div>
<div>I personally like working with a SAX parser. See the example below - I quite enjoyed writing it.</div>
<div> </div>
<div><span class="q"> </span></div>
<blockquote class="gmail_quote" style="PADDING-LEFT: 1ex; MARGIN: 0px 0px 0px 0.8ex; BORDER-LEFT: #ccc 1px solid">The question is whether the things that an ESIS/SAX-like interface<br>let you do are things that people particularly *want* to do with JSON.<br>
I have no idea.</blockquote>
<div> </div>
<div>The point is, that the Erlang team would probably like to implement only 1 very<br>fast JSON parser in C. In my opinion, that should be a SAX-like parser, because<br>it is easy to create DVM output based on SAX output, but pointless to do it the<br>
other way around.</div>
<p>To give an example:</p>
<p>A sax parser may create the following events (that is: call its callback<br>function with the following arguments, while parsing):</p>
<p>E = [startDocument,startObject, {key,"menu"}, startObject, {key,"id"},<br> {value,"file"}, {key,"popup"}, startObject, {key,"menuitem"},<br> startArray,startObject, {key,"value"}, {value,"New"}, {key,"onclick"},<br>
 {value,"CreateNewDoc()"}, endObject,startObject, {key,"value"},<br> {value,"Close"}, {key,"onclick"}, {value,"CloseDoc()"}, endObject,<br> endArray,endObject,endObject,endObject, endDocument].</p>

<p>(This corresponds to a slightly shortened version of the second example found on <a href="http://json.org">json.org</a>).</p>
<p>Below an example of a callback function to process these events - this function would be called by the SAX parser when it has processed another relevant part of the JSON document. The parser passes the value<br>returned by the function to the next invocation (second argument of the function, the first argument is the SAX event). </p>

<p>dvm(startDocument, _) -><br>  start;<br>dvm(startObject, Stack) -><br>  [[]| Stack];<br>dvm(startArray, Stack) -><br>  [[]| Stack];<br>dvm({key, _} = Event, Stack) -><br>  [Event|Stack];<br>dvm({value, Value}, start) -><br>
  {value, Value};<br>dvm({value, Value}, [{key, Key}, List | T]) -><br>  [[{Key, Value} | List] | T];<br>dvm({value, Value}, [List | T]) -><br>  [[Value | List] | T];<br>dvm(endObject, [List | T]) -><br>  dvm({value, {lists:reverse(List)}}, T);<br>
dvm(endArray, [List | T]) -><br>  dvm({value, lists:reverse(List)}, T);<br>dvm(endDocument, {value, R}) -><br>  R.</p>
<p>With the events given above this gives the following output:<br>(you can use lists:foldl(fun dvm/2, [], E). to try this).</p>
<p>{[{"menu",<br>   {[{"id","file"},<br>     {"popup",<br>      {[{"menuitem",<br>         [{[{"value","New"},{"onclick","CreateNewDoc()"}]},<br>
          {[{"value","Close"},{"onclick","CloseDoc()"}]}]}]}}]}}]}</p>
<p>Regards,</p>
<p>Willem</p></div>