Modified: websites/staging/thrift/trunk/content/tutorial/ocaml.html ============================================================================== --- websites/staging/thrift/trunk/content/tutorial/ocaml.html (original) +++ websites/staging/thrift/trunk/content/tutorial/ocaml.html Sat Mar 22 18:57:03 2014 @@ -87,140 +87,124 @@ </ol> <h3 id="prerequisites">Prerequisites</h3> <h3 id="client">Client</h3> -<div class="codehilite"><pre> <span class="p">:::</span><span class="n">cpp</span> -<span class="n">open</span> <span class="n">Arg</span> +<p><div class="codehilite"><pre><span class="n">open</span> <span class="n">Arg</span> <span class="n">open</span> <span class="n">Thrift</span> <span class="n">open</span> <span class="n">Tutorial_types</span> -<span class="n">open</span> <span class="n">Shared_types</span> - -<span class="n">exception</span> <span class="n">Die</span><span class="p">;;</span> -<span class="n">let</span> <span class="n">sod</span> <span class="p">=</span> <span class="k">function</span> - <span class="n">Some</span> <span class="n">v</span> <span class="o">-&</span><span class="n">gt</span><span class="p">;</span> <span class="n">v</span> - <span class="o">|</span> <span class="n">None</span> <span class="o">-&</span><span class="n">gt</span><span class="p">;</span> <span class="n">raise</span> <span class="n">Die</span><span class="p">;;</span> - -<span class="n">type</span> <span class="n">connection</span> <span class="p">=</span> <span class="p">{</span> - <span class="n">trans</span> <span class="p">:</span> <span class="n">Transport</span><span class="p">.</span><span class="n">t</span> <span class="p">;</span> - <span class="n">proto</span> <span class="p">:</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Protocol</span><span class="p">.</span><span class="n">t</span><span class="p">;</span> - <span class="n">calc</span> <span class="p">:</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">client</span> <span class="p">;</span> -<span class="p">}</span> - -<span class="n">let</span> <span class="n">connect</span> <span class="o">~</span><span class="n">host</span> <span class="n">port</span> <span class="p">=</span> - <span class="n">let</span> <span class="n">tx</span> <span class="p">=</span> <span class="n">new</span> <span class="n">TSocket</span><span class="p">.</span><span class="n">t</span> <span class="n">host</span> <span class="n">port</span> <span class="n">in</span> - <span class="n">let</span> <span class="n">proto</span> <span class="p">=</span> <span class="n">new</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">t</span> <span class="n">tx</span> <span class="n">in</span> - <span class="n">let</span> <span class="n">calc</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">client</span> <span class="n">proto</span> <span class="n">proto</span> <span class="n">in</span> - <span class="n">tx</span>#<span class="n">opn</span><span class="p">;</span> - <span class="p">{</span> <span class="n">trans</span> <span class="p">=</span> <span class="n">tx</span> <span class="p">;</span> <span class="n">proto</span> <span class="p">=</span> <span class="n">proto</span><span class="p">;</span> <span class="n">calc</span> <span class="p">=</span> <span class="n">calc</span> <span class="p">}</span> -<span class="p">;;</span> - -<span class="n">let</span> <span class="n">doclient</span> <span class="p">()</span> <span class="p">=</span> - <span class="n">let</span> <span class="n">cli</span> <span class="p">=</span> <span class="n">connect</span> <span class="o">~</span><span class="n">host</span><span class="p">:</span><span class="o">&</span><span class="n">quot</span><span class="p">;</span>127<span class="p">.</span>0<span class="p">.</span>0<span class="p">.</span>1<span class="o">&</span><span class="n">quot</span><span class="p">;</span> 9090 <span class="n">in</span> +<span class="n">open</span> <span class="n">Shared_types</span></p> +<p><span class="n">exception</span> <span class="n">Die</span><span class="p">;;</span> +<span class="n">let</span> <span class="n">sod</span> <span class="o">=</span> <span class="n">function</span> + <span class="n">Some</span> <span class="n">v</span> <span class="o">-></span> <span class="n">v</span> + <span class="o">|</span> <span class="n">None</span> <span class="o">-></span> <span class="n">raise</span> <span class="n">Die</span><span class="p">;;</span></p> +<p><span class="n">type</span> <span class="n">connection</span> <span class="o">=</span> <span class="p">{</span> + <span class="n">trans</span> <span class="o">:</span> <span class="n">Transport</span><span class="p">.</span><span class="n">t</span> <span class="p">;</span> + <span class="n">proto</span> <span class="o">:</span> <span class="n">Thrift</span><span class="p">.</span><span class="n">Protocol</span><span class="p">.</span><span class="n">t</span><span class="p">;</span> + <span class="n">calc</span> <span class="o">:</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">client</span> <span class="p">;</span> +<span class="p">}</span></p> +<p><span class="n">let</span> <span class="n">connect</span> <span class="o">~</span><span class="n">host</span> <span class="n">port</span> <span class="o">=</span> + <span class="n">let</span> <span class="n">tx</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TSocket</span><span class="p">.</span><span class="n">t</span> <span class="n">host</span> <span class="n">port</span> <span class="n">in</span> + <span class="n">let</span> <span class="n">proto</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">t</span> <span class="n">tx</span> <span class="n">in</span> + <span class="n">let</span> <span class="n">calc</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">client</span> <span class="n">proto</span> <span class="n">proto</span> <span class="n">in</span> + <span class="n">tx</span><span class="err">#</span><span class="n">opn</span><span class="p">;</span> + <span class="p">{</span> <span class="n">trans</span> <span class="o">=</span> <span class="n">tx</span> <span class="p">;</span> <span class="n">proto</span> <span class="o">=</span> <span class="n">proto</span><span class="p">;</span> <span class="n">calc</span> <span class="o">=</span> <span class="n">calc</span> <span class="p">}</span> +<span class="p">;;</span></p> +<p><span class="n">let</span> <span class="n">doclient</span> <span class="p">()</span> <span class="o">=</span> + <span class="n">let</span> <span class="n">cli</span> <span class="o">=</span> <span class="n">connect</span> <span class="o">~</span><span class="nl">host:</span><span class="s">"127.0.0.1"</span> <span class="mi">9090</span> <span class="n">in</span> <span class="k">try</span> - <span class="n">cli</span><span class="p">.</span><span class="n">calc</span>#<span class="n">ping</span> <span class="p">;</span> - <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span><span class="n">ping</span><span class="p">()</span><span class="o">\</span><span class="n">n</span><span class="o">&</span><span class="n">quot</span><span class="p">;</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> <span class="p">;</span> - <span class="p">(</span><span class="n">let</span> <span class="n">sum</span> <span class="p">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span>#<span class="n">add</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> 1<span class="p">)</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> 1<span class="p">)</span> <span class="n">in</span> - <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span>1<span class="o">+</span>1<span class="p">=</span><span class="c">%ld\n&quot; sum ;</span> + <span class="n">cli</span><span class="p">.</span><span class="n">calc</span><span class="err">#</span><span class="n">ping</span> <span class="p">;</span> + <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"ping()</span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> <span class="p">;</span> + <span class="p">(</span><span class="n">let</span> <span class="n">sum</span> <span class="o">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span><span class="err">#</span><span class="n">add</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="n">in</span> + <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"1+1=%ld</span><span class="se">\n</span><span class="s">"</span> <span class="n">sum</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span><span class="p">)</span> <span class="p">;</span> - <span class="p">(</span><span class="n">let</span> <span class="n">w</span> <span class="p">=</span> <span class="n">new</span> <span class="n">work</span> <span class="n">in</span> - <span class="n">w</span>#<span class="n">set_op</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span> <span class="p">;</span> - <span class="n">w</span>#<span class="n">set_num1</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> 1<span class="p">)</span> <span class="p">;</span> - <span class="n">w</span>#<span class="n">set_num2</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> 0<span class="p">)</span> <span class="p">;</span> + <span class="p">(</span><span class="n">let</span> <span class="n">w</span> <span class="o">=</span> <span class="k">new</span> <span class="n">work</span> <span class="n">in</span> + <span class="n">w</span><span class="err">#</span><span class="n">set_op</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span> <span class="p">;</span> + <span class="n">w</span><span class="err">#</span><span class="n">set_num1</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="p">;</span> + <span class="n">w</span><span class="err">#</span><span class="n">set_num2</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">0</span><span class="p">)</span> <span class="p">;</span> <span class="k">try</span> - <span class="n">let</span> <span class="n">quotient</span> <span class="p">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span>#<span class="n">calculate</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> 1<span class="p">)</span> <span class="n">w</span> <span class="n">in</span> - <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span><span class="n">Whoa</span>? <span class="n">We</span> <span class="n">can</span> <span class="n">divide</span> <span class="n">by</span> <span class="n">zero</span>!<span class="o">\</span><span class="n">n</span><span class="o">&</span><span class="n">quot</span><span class="p">;</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> - <span class="n">with</span> <span class="n">InvalidOperation</span> <span class="n">io</span> <span class="o">-&</span><span class="n">gt</span><span class="p">;</span> - <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span><span class="n">InvalidOperation</span><span class="p">:</span> <span class="c">%s\n&quot; io#grab_why ; flush stdout) ;</span> - <span class="p">(</span><span class="n">let</span> <span class="n">w</span> <span class="p">=</span> <span class="n">new</span> <span class="n">work</span> <span class="n">in</span> - <span class="n">w</span>#<span class="n">set_op</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span> <span class="p">;</span> - <span class="n">w</span>#<span class="n">set_num1</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> 15<span class="p">)</span> <span class="p">;</span> - <span class="n">w</span>#<span class="n">set_num2</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> 10<span class="p">)</span> <span class="p">;</span> - <span class="n">let</span> <span class="n">diff</span> <span class="p">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span>#<span class="n">calculate</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> 1<span class="p">)</span> <span class="n">w</span> <span class="n">in</span> - <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span>15<span class="o">-</span>10<span class="p">=</span><span class="c">%ld\n&quot; diff ; flush stdout) ;</span> - <span class="p">(</span><span class="n">let</span> <span class="n">ss</span> <span class="p">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span>#<span class="n">getStruct</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> 1<span class="p">)</span> <span class="n">in</span> - <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span><span class="n">Check</span> <span class="nb">log</span><span class="p">:</span> <span class="c">%s\n&quot; ss#grab_value ; flush stdout) ;</span> - <span class="n">cli</span><span class="p">.</span><span class="n">trans</span>#<span class="n">close</span> - <span class="n">with</span> <span class="n">Transport</span><span class="p">.</span><span class="n">E</span> <span class="p">(</span><span class="n">_</span><span class="p">,</span><span class="n">what</span><span class="p">)</span> <span class="o">-&</span><span class="n">gt</span><span class="p">;</span> - <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span><span class="n">ERROR</span><span class="p">:</span> <span class="c">%s\n&quot; what ; flush stdout</span> -<span class="p">;;</span> - -<span class="n">doclient</span><span class="p">();;</span> -</pre></div> - - + <span class="n">let</span> <span class="n">quotient</span> <span class="o">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span><span class="err">#</span><span class="n">calculate</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="n">w</span> <span class="n">in</span> + <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"Whoa? We can divide by zero!</span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> + <span class="n">with</span> <span class="n">InvalidOperation</span> <span class="n">io</span> <span class="o">-></span> + <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"InvalidOperation: %s</span><span class="se">\n</span><span class="s">"</span> <span class="n">io</span><span class="err">#</span><span class="n">grab_why</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span><span class="p">)</span> <span class="p">;</span> + <span class="p">(</span><span class="n">let</span> <span class="n">w</span> <span class="o">=</span> <span class="k">new</span> <span class="n">work</span> <span class="n">in</span> + <span class="n">w</span><span class="err">#</span><span class="n">set_op</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span> <span class="p">;</span> + <span class="n">w</span><span class="err">#</span><span class="n">set_num1</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">15</span><span class="p">)</span> <span class="p">;</span> + <span class="n">w</span><span class="err">#</span><span class="n">set_num2</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">10</span><span class="p">)</span> <span class="p">;</span> + <span class="n">let</span> <span class="n">diff</span> <span class="o">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span><span class="err">#</span><span class="n">calculate</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="n">w</span> <span class="n">in</span> + <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"15-10=%ld</span><span class="se">\n</span><span class="s">"</span> <span class="n">diff</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span><span class="p">)</span> <span class="p">;</span> + <span class="p">(</span><span class="n">let</span> <span class="n">ss</span> <span class="o">=</span> <span class="n">cli</span><span class="p">.</span><span class="n">calc</span><span class="err">#</span><span class="n">getStruct</span> <span class="p">(</span><span class="n">Int32</span><span class="p">.</span><span class="n">of_int</span> <span class="mi">1</span><span class="p">)</span> <span class="n">in</span> + <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"Check log: %s</span><span class="se">\n</span><span class="s">"</span> <span class="n">ss</span><span class="err">#</span><span class="n">grab_value</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span><span class="p">)</span> <span class="p">;</span> + <span class="n">cli</span><span class="p">.</span><span class="n">trans</span><span class="err">#</span><span class="n">close</span> + <span class="n">with</span> <span class="n">Transport</span><span class="p">.</span><span class="n">E</span> <span class="p">(</span><span class="n">_</span><span class="p">,</span><span class="n">what</span><span class="p">)</span> <span class="o">-></span> + <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"ERROR: %s</span><span class="se">\n</span><span class="s">"</span> <span class="n">what</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> +<span class="p">;;</span></p> +<p><span class="n">doclient</span><span class="p">();;</span> +</pre></div></p> <h3 id="server">Server</h3> -<div class="codehilite"><pre> <span class="p">:::</span><span class="n">cpp</span> -<span class="n">open</span> <span class="n">Arg</span> +<p><div class="codehilite"><pre><span class="n">open</span> <span class="n">Arg</span> <span class="n">open</span> <span class="n">Thrift</span> <span class="n">open</span> <span class="n">Tutorial_types</span> -<span class="n">open</span> <span class="n">Shared_types</span> - -<span class="n">exception</span> <span class="n">Die</span><span class="p">;;</span> -<span class="n">let</span> <span class="n">sod</span> <span class="p">=</span> <span class="k">function</span> - <span class="n">Some</span> <span class="n">v</span> <span class="o">-&</span><span class="n">gt</span><span class="p">;</span> <span class="n">v</span> - <span class="o">|</span> <span class="n">None</span> <span class="o">-&</span><span class="n">gt</span><span class="p">;</span> <span class="n">raise</span> <span class="n">Die</span><span class="p">;;</span> - -<span class="n">class</span> <span class="n">calc_handler</span> <span class="p">=</span> +<span class="n">open</span> <span class="n">Shared_types</span></p> +<p><span class="n">exception</span> <span class="n">Die</span><span class="p">;;</span> +<span class="n">let</span> <span class="n">sod</span> <span class="o">=</span> <span class="n">function</span> + <span class="n">Some</span> <span class="n">v</span> <span class="o">-></span> <span class="n">v</span> + <span class="o">|</span> <span class="n">None</span> <span class="o">-></span> <span class="n">raise</span> <span class="n">Die</span><span class="p">;;</span></p> +<p><span class="k">class</span> <span class="nc">calc_handler</span> <span class="o">=</span> <span class="n">object</span> <span class="p">(</span><span class="n">self</span><span class="p">)</span> <span class="n">inherit</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">iface</span> - <span class="n">val</span> <span class="nb">log</span> <span class="p">=</span> <span class="n">Hashtbl</span><span class="p">.</span><span class="n">create</span> 23 - <span class="n">method</span> <span class="n">ping</span> <span class="p">=</span> <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span><span class="n">ping</span><span class="p">()</span><span class="o">\</span><span class="n">n</span><span class="o">&</span><span class="n">quot</span><span class="p">;</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> - <span class="n">method</span> <span class="n">add</span> <span class="n">a</span> <span class="n">b</span> <span class="p">=</span> - <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span><span class="o">&</span><span class="n">quot</span><span class="p">;</span><span class="n">add</span><span class="p">(</span><span class="c">%ld,%ld)\n&quot; (sod a) (sod b); flush stdout ;</span> + <span class="n">val</span> <span class="n">log</span> <span class="o">=</span> <span class="n">Hashtbl</span><span class="p">.</span><span class="n">create</span> <span class="mi">23</span> + <span class="n">method</span> <span class="n">ping</span> <span class="o">=</span> <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"ping()</span><span class="se">\n</span><span class="s">"</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> + <span class="n">method</span> <span class="n">add</span> <span class="n">a</span> <span class="n">b</span> <span class="o">=</span> + <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span><span class="s">"add(%ld,%ld)</span><span class="se">\n</span><span class="s">"</span> <span class="p">(</span><span class="n">sod</span> <span class="n">a</span><span class="p">)</span> <span class="p">(</span><span class="n">sod</span> <span class="n">b</span><span class="p">);</span> <span class="n">flush</span> <span class="n">stdout</span> <span class="p">;</span> <span class="n">Int32</span><span class="p">.</span><span class="n">add</span> <span class="p">(</span><span class="n">sod</span> <span class="n">a</span><span class="p">)</span> <span class="p">(</span><span class="n">sod</span> <span class="n">b</span><span class="p">)</span> - <span class="n">method</span> <span class="n">calculate</span> <span class="n">logid</span> <span class="n">w</span> <span class="p">=</span> - <span class="n">let</span> <span class="n">w</span> <span class="p">=</span> <span class="n">sod</span> <span class="n">w</span> <span class="n">in</span> - <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span><span class="n">calculate</span><span class="p">(</span><span class="c">%ld,{%ld,%ld,%ld})\n&quot; (sod logid) (Operation.to_i w#grab_op) w#grab_num1 w#grab_num2; flush stdout ;</span> - <span class="n">let</span> <span class="n">rv</span> <span class="p">=</span> - <span class="n">match</span> <span class="n">w</span>#<span class="n">grab_op</span> <span class="n">with</span> - <span class="n">Operation</span><span class="p">.</span><span class="n">ADD</span> <span class="o">-&</span><span class="n">gt</span><span class="p">;</span> - <span class="n">Int32</span><span class="p">.</span><span class="n">add</span> <span class="n">w</span>#<span class="n">grab_num1</span> <span class="n">w</span>#<span class="n">grab_num2</span> - <span class="o">|</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span> <span class="o">-&</span><span class="n">gt</span><span class="p">;</span> - <span class="n">Int32</span><span class="p">.</span><span class="n">sub</span> <span class="n">w</span>#<span class="n">grab_num1</span> <span class="n">w</span>#<span class="n">grab_num2</span> - <span class="o">|</span> <span class="n">Operation</span><span class="p">.</span><span class="n">MULTIPLY</span> <span class="o">-&</span><span class="n">gt</span><span class="p">;</span> - <span class="n">Int32</span><span class="p">.</span><span class="n">mul</span> <span class="n">w</span>#<span class="n">grab_num1</span> <span class="n">w</span>#<span class="n">grab_num2</span> - <span class="o">|</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span> <span class="o">-&</span><span class="n">gt</span><span class="p">;</span> - <span class="k">if</span> <span class="n">w</span>#<span class="n">grab_num2</span> <span class="p">=</span> <span class="n">Int32</span><span class="p">.</span><span class="n">zero</span> <span class="n">then</span> - <span class="n">let</span> <span class="n">io</span> <span class="p">=</span> <span class="n">new</span> <span class="n">invalidOperation</span> <span class="n">in</span> - <span class="n">io</span>#<span class="n">set_what</span> <span class="p">(</span><span class="n">Operation</span><span class="p">.</span><span class="n">to_i</span> <span class="n">w</span>#<span class="n">grab_op</span><span class="p">)</span> <span class="p">;</span> - <span class="n">io</span>#<span class="n">set_why</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span><span class="n">Cannot</span> <span class="n">divide</span> <span class="n">by</span> 0<span class="o">&</span><span class="n">quot</span><span class="p">;</span> <span class="p">;</span> + <span class="n">method</span> <span class="n">calculate</span> <span class="n">logid</span> <span class="n">w</span> <span class="o">=</span> + <span class="n">let</span> <span class="n">w</span> <span class="o">=</span> <span class="n">sod</span> <span class="n">w</span> <span class="n">in</span> + <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"calculate(%ld,{%ld,%ld,%ld})</span><span class="se">\n</span><span class="s">"</span> <span class="p">(</span><span class="n">sod</span> <span class="n">logid</span><span class="p">)</span> <span class="p">(</span><span class="n">Operation</span><span class="p">.</span><span class="n">to_i</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_op</span><span class="p">)</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num1</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span><span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> <span class="p">;</span> + <span class="n">let</span> <span class="n">rv</span> <span class="o">=</span> + <span class="n">match</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_op</span> <span class="n">with</span> + <span class="n">Operation</span><span class="p">.</span><span class="n">ADD</span> <span class="o">-></span> + <span class="n">Int32</span><span class="p">.</span><span class="n">add</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num1</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span> + <span class="o">|</span> <span class="n">Operation</span><span class="p">.</span><span class="n">SUBTRACT</span> <span class="o">-></span> + <span class="n">Int32</span><span class="p">.</span><span class="n">sub</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num1</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span> + <span class="o">|</span> <span class="n">Operation</span><span class="p">.</span><span class="n">MULTIPLY</span> <span class="o">-></span> + <span class="n">Int32</span><span class="p">.</span><span class="n">mul</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num1</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span> + <span class="o">|</span> <span class="n">Operation</span><span class="p">.</span><span class="n">DIVIDE</span> <span class="o">-></span> + <span class="k">if</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span> <span class="o">=</span> <span class="n">Int32</span><span class="p">.</span><span class="n">zero</span> <span class="n">then</span> + <span class="n">let</span> <span class="n">io</span> <span class="o">=</span> <span class="k">new</span> <span class="n">invalidOperation</span> <span class="n">in</span> + <span class="n">io</span><span class="err">#</span><span class="n">set_what</span> <span class="p">(</span><span class="n">Operation</span><span class="p">.</span><span class="n">to_i</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_op</span><span class="p">)</span> <span class="p">;</span> + <span class="n">io</span><span class="err">#</span><span class="n">set_why</span> <span class="s">"Cannot divide by 0"</span> <span class="p">;</span> <span class="n">raise</span> <span class="p">(</span><span class="n">InvalidOperation</span> <span class="n">io</span><span class="p">)</span> <span class="k">else</span> - <span class="n">Int32</span><span class="p">.</span><span class="n">div</span> <span class="n">w</span>#<span class="n">grab_num1</span> <span class="n">w</span>#<span class="n">grab_num2</span> <span class="n">in</span> - - <span class="n">let</span> <span class="n">ss</span> <span class="p">=</span> <span class="n">new</span> <span class="n">sharedStruct</span> <span class="n">in</span> - <span class="n">ss</span>#<span class="n">set_key</span> <span class="p">(</span><span class="n">sod</span> <span class="n">logid</span><span class="p">)</span> <span class="p">;</span> - <span class="n">let</span> <span class="n">buffer</span> <span class="p">=</span> <span class="n">Int32</span><span class="p">.</span><span class="n">to_string</span> <span class="n">rv</span> <span class="n">in</span> - <span class="n">ss</span>#<span class="n">set_value</span> <span class="n">buffer</span> <span class="p">;</span> - <span class="n">Hashtbl</span><span class="p">.</span><span class="n">add</span> <span class="nb">log</span> <span class="p">(</span><span class="n">sod</span> <span class="n">logid</span><span class="p">)</span> <span class="n">ss</span> <span class="p">;</span> - <span class="n">rv</span> - - <span class="n">method</span> <span class="n">zip</span> <span class="p">=</span> - <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span><span class="n">zip</span><span class="p">()</span><span class="o">\</span><span class="n">n</span><span class="o">&</span><span class="n">quot</span><span class="p">;;</span> <span class="n">flush</span> <span class="n">stdout</span> - - <span class="n">method</span> <span class="n">getStruct</span> <span class="n">logid</span> <span class="p">=</span> - <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="o">&</span><span class="n">quot</span><span class="p">;</span><span class="n">getStruct</span><span class="p">(</span><span class="c">%ld)\n&quot; (sod logid) ; flush stdout ;</span> - <span class="n">Hashtbl</span><span class="p">.</span><span class="nb">find</span> <span class="nb">log</span> <span class="p">(</span><span class="n">sod</span> <span class="n">logid</span><span class="p">)</span> + <span class="n">Int32</span><span class="p">.</span><span class="n">div</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num1</span> <span class="n">w</span><span class="err">#</span><span class="n">grab_num2</span> <span class="n">in</span></p> +<div class="codehilite"><pre><span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>let<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>ss<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"o"</span><span class="nt">></span>=<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"k"</span><span class="nt">></span>new<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>sharedStruct<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></ span>in<span class="nt"></span></span> + <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>ss<span class="nt"></span><span</span> <span class="na">class=</span><span class="s">"err"</span><span class="nt">></span>#<span class="nt"></span><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>set_key<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"p"</span><span class="nt">></span>(<span class="nt"></span><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>sod<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>logid<span class="nt"></span><span</span> <span class="na">class=</span><span class="s">" ;p"</span><span class="nt">></span>)<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"p"</span><span class="nt">></span>;<span class="nt"></span></span> +<span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>let<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>buffer<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"o"</span><span class="nt">></span>=<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>Int32<span class="nt"></span><span</span> <span class="na">class=</span><span class="s">"p"</span><span class="nt">></span>.<span class="nt"></span><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>to_string<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>rv<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>in<span class="nt"></span></span> + <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>ss<span class="nt"></span><span</span> <span class="na">class=</span><span class="s">"err"</span><span class="nt">></span>#<span class="nt"></span><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>set_value<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>buffer<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"p"</span><span class="nt">></span>;<span class="nt"></span></span> + <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>Hashtbl<span class="nt"></span><span</span> <span class="na">class=</span><span class="s">"p"</span><span class="nt">></span>.<span class="nt"></span><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>add<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>log<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span><span class="s">"p"</span><span class="nt">></span>(<span class="nt"></span><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>sod<span class="nt"></span></span> <span class="nt"><span</span> <span class="na">class=</span ><span class="s">"n"</span><span class="nt">></span>logid<span >class="nt"></span><span</span> <span class="na">class=</span><span >class="s">"p"</span><span class="nt">></span>)<span >class="nt"></span></span> <span class="nt"><span</span> <span >class="na">class=</span><span class="s">"n"</span><span >class="nt">></span>ss<span class="nt"></span></span> <span >class="nt"><span</span> <span class="na">class=</span><span >class="s">"p"</span><span class="nt">></span>;<span >class="nt"></span></span> + <span class="nt"><span</span> <span class="na">class=</span><span class="s">"n"</span><span class="nt">></span>rv<span class="nt"></span></span> +</pre></div> -<span class="k">end</span> -<span class="n">let</span> <span class="n">doserver</span> <span class="p">()</span> <span class="p">=</span> - <span class="n">let</span> <span class="n">h</span> <span class="p">=</span> <span class="n">new</span> <span class="n">calc_handler</span> <span class="n">in</span> - <span class="n">let</span> <span class="n">proc</span> <span class="p">=</span> <span class="n">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">processor</span> <span class="n">h</span> <span class="n">in</span> - <span class="n">let</span> <span class="n">port</span> <span class="p">=</span> 9090 <span class="n">in</span> - <span class="n">let</span> <span class="n">pf</span> <span class="p">=</span> <span class="n">new</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">factory</span> <span class="n">in</span> - <span class="n">let</span> <span class="n">server</span> <span class="p">=</span> <span class="n">new</span> <span class="n">TThreadedServer</span><span class="p">.</span><span class="n">t</span> +<p><span class="n">method</span> <span class="n">zip</span> <span class="o">=</span> + <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"zip()</span><span class="se">\n</span><span class="s">"</span><span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span></p> +<p><span class="n">method</span> <span class="n">getStruct</span> <span class="n">logid</span> <span class="o">=</span> + <span class="n">Printf</span><span class="p">.</span><span class="n">printf</span> <span class="s">"getStruct(%ld)</span><span class="se">\n</span><span class="s">"</span> <span class="p">(</span><span class="n">sod</span> <span class="n">logid</span><span class="p">)</span> <span class="p">;</span> <span class="n">flush</span> <span class="n">stdout</span> <span class="p">;</span> + <span class="n">Hashtbl</span><span class="p">.</span><span class="n">find</span> <span class="n">log</span> <span class="p">(</span><span class="n">sod</span> <span class="n">logid</span><span class="p">)</span></p> +<p><span class="n">end</span></p> +<p><span class="n">let</span> <span class="n">doserver</span> <span class="p">()</span> <span class="o">=</span> + <span class="n">let</span> <span class="n">h</span> <span class="o">=</span> <span class="k">new</span> <span class="n">calc_handler</span> <span class="n">in</span> + <span class="n">let</span> <span class="n">proc</span> <span class="o">=</span> <span class="k">new</span> <span class="n">Calculator</span><span class="p">.</span><span class="n">processor</span> <span class="n">h</span> <span class="n">in</span> + <span class="n">let</span> <span class="n">port</span> <span class="o">=</span> <span class="mi">9090</span> <span class="n">in</span> + <span class="n">let</span> <span class="n">pf</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TBinaryProtocol</span><span class="p">.</span><span class="n">factory</span> <span class="n">in</span> + <span class="n">let</span> <span class="n">server</span> <span class="o">=</span> <span class="k">new</span> <span class="n">TThreadedServer</span><span class="p">.</span><span class="n">t</span> <span class="n">proc</span> - <span class="p">(</span><span class="n">new</span> <span class="n">TServerSocket</span><span class="p">.</span><span class="n">t</span> <span class="n">port</span><span class="p">)</span> - <span class="p">(</span><span class="n">new</span> <span class="n">Transport</span><span class="p">.</span><span class="n">factory</span><span class="p">)</span> + <span class="p">(</span><span class="k">new</span> <span class="n">TServerSocket</span><span class="p">.</span><span class="n">t</span> <span class="n">port</span><span class="p">)</span> + <span class="p">(</span><span class="k">new</span> <span class="n">Transport</span><span class="p">.</span><span class="n">factory</span><span class="p">)</span> <span class="n">pf</span> <span class="n">pf</span> <span class="n">in</span> - <span class="n">server</span>#<span class="n">serve</span> -<span class="p">;;</span> - -<span class="n">doserver</span><span class="p">();;</span> -</pre></div> - - + <span class="n">server</span><span class="err">#</span><span class="n">serve</span> +<span class="p">;;</span></p> +<p><span class="n">doserver</span><span class="p">();;</span> +</pre></div></p> <h2 id="additional-information">Additional Information</h2> </div>