<div dir="ltr"><span style="font-size:13px">Hello,</span><div style="font-size:13px"><br></div><div style="font-size:13px">I would like to discuss the opportunity to improve template programming and operator overloading for XQUERY ?</div><div style="font-size:13px"><br></div><div style="font-size:13px">1) template programming : XQUERY provides a quite natural template mechanism using type switch and instance:</div><div style="font-size:13px"><br></div><div style="font-size:13px">declare function yell($animal) {</div><div style="font-size:13px"><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(181,137,0)">if</span><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(181,137,0)"> </span><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(38,139,210)">(</span><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(211,54,130)">$</span>animal <span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(181,137,0)">instance of</span><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(181,137,0)"> </span><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(133,153,0)">element</span><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(38,139,210)">(</span><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(38,139,210)">)</span><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(38,139,210)">)</span><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(181,137,0)"> </span><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(181,137,0)">then</span><span style="font-family:Monaco,Consolas,'Andale Mono','DejaVu Sans Mono',monospace;font-size:15px;white-space:pre-wrap;color:rgb(181,137,0)"> </span></div><div style="font-size:13px"><pre style="white-space:pre-wrap;margin-top:0px;margin-bottom:10px;padding:5px;border:0px;font-size:14px;vertical-align:baseline;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif;overflow:auto;width:auto;max-height:600px;word-wrap:normal;color:rgb(0,0,0);line-height:17.8048000335693px;background:rgb(238,238,238)"><code style="margin:0px;padding:0px;border:0px;vertical-align:baseline;font-family:Consolas,Menlo,Monaco,'Lucida Console','Liberation Mono','DejaVu Sans Mono','Bitstream Vera Sans Mono','Courier New',monospace,serif;white-space:inherit;background-image:initial;background-repeat:initial"><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(0,0,139);background:transparent">return</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent"> typeswitch</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent">(</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent">$</span><span style="color:rgb(34,34,34);font-family:arial,sans-serif;font-size:small;line-height:normal;white-space:normal;background-color:rgb(255,255,255)">animal</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent">)</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent">
  </span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(0,0,139);background:transparent">case</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent"> element</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent">(</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent">cow</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent">)</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent"> </span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(0,0,139);background:transparent">return</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent"> </span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(128,0,0);background:transparent">"Moo"</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent">
</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent">  </span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(0,0,139);background:transparent">default</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent"> </span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(0,0,139);background:transparent">return</span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;background:transparent"> </span><span style="margin:0px;padding:0px;border:0px;vertical-align:baseline;color:rgb(128,0,0);background:transparent">"..."</span></code></pre></div><div style="font-size:13px">else "this is not an animal"</div><div style="font-size:13px">};</div><div style="font-size:13px"><br></div><div style="font-size:13px">I think that it could be worthwhile to provide such a mechanism directly at the interpreter level. For instance, the following code seems coherent and concise :<br></div><div style="font-size:13px"><br></div><div style="font-size:13px"><div>declare function yell($animal as element(cow) ) {"Moo"}</div><div>declare function yell($animal as element() ) {".."}<br></div></div><div style="font-size:13px"><div></div><div>declare function yell($animal ) {"This is not an animal"}</div><div><br></div><div><div>As far as I understand, the previous code violates  XQUERY functions identification, achieved through a couple (name, arity). Would it be difficult to extend this identification mechanism ?</div></div><div><br></div><div>2) A quite interesting application to 1) would be to define operator overloading </div><div><br></div><div>Indeed, I don't know how to overload operators with XQUERY. For instance I would like to define something like</div><div><br></div><div>declare function operator+($left,$right){<code style="color:rgb(0,0,0);font-size:14px;white-space:pre-wrap;font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">fn:</code><code style="font-size:14px;white-space:pre-wrap;font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,64,192)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;font-weight:bold!important;min-height:inherit!important;background:none!important">for</code><code style="color:rgb(0,0,0);font-size:14px;white-space:pre-wrap;font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">-each-pair($left,$right,<code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,64,192)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;font-weight:bold!important;min-height:inherit!important;background:none!important">function</code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">(</code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,160,0)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">$a</code><span style="line-height:18.2000007629395px"> </span><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">+ </code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,160,0)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">$b</code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">) { </code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,160,0)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">$a</code><span style="line-height:18.2000007629395px"> </span><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">+ </code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,160,0)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">$b</code><span style="line-height:18.2000007629395px"> </span><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">} </code></code><span style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em;color:rgb(0,0,0);font-size:14px;white-space:pre-wrap;background-color:initial">)</span>}</div><div><br></div><div>I know that I can survive writing <br></div><div><br></div><div>declare function local:plus($left,$right){<code style="color:rgb(0,0,0);font-size:14px;white-space:pre-wrap;font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">fn:</code><code style="font-size:14px;white-space:pre-wrap;font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,64,192)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;font-weight:bold!important;min-height:inherit!important;background:none!important">for</code><code style="color:rgb(0,0,0);font-size:14px;white-space:pre-wrap;font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">-each-pair($left,$right,<code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,64,192)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;font-weight:bold!important;min-height:inherit!important;background:none!important">function</code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">(</code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,160,0)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">$a</code><span style="line-height:18.2000007629395px"> </span><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">+ </code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,160,0)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">$b</code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">) { </code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,160,0)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">$a</code><span style="line-height:18.2000007629395px"> </span><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">+ </code><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;color:rgb(0,160,0)!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">$b</code><span style="line-height:18.2000007629395px"> </span><code style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em!important;border:0px!important;border-radius:0px!important;padding:0px!important;margin:0px!important;float:none!important;outline:0px!important;overflow:visible!important;vertical-align:baseline!important;width:auto!important;min-height:inherit!important;background:none!important">} </code></code><span style="font-family:Consolas,Monaco,'DejaVu Sans Mono',monospace;line-height:1.3em;color:rgb(0,0,0);font-size:14px;white-space:pre-wrap;background-color:initial">)</span>}</div><div><br></div><div>but when one start to write algorithmic code, it is far easier and understandable to write $a+$b than array:plus($a,$b). Moreover, it can be used to expressions template, quite useful for linear algebra.</div></div></div>