<div dir="ltr">Hello Daniel!<div><br></div><div>Thanks for taking the time to write down your ideas and suggestions. <div class="gmail_extra"><br><div class="gmail_quote">On Thu, Jul 31, 2014 at 9:28 PM, Daniel Goertzen <span dir="ltr"><<a href="mailto:daniel.goertzen@gmail.com" target="_blank">daniel.goertzen@gmail.com</a>></span> wrote:<br>
<blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex"><div dir="ltr"><span><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt">
<br></p><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">1. I ported a few functions from the lists module.  The ones I found useful were filter() and mapfold().  I also found with() useful, which does the opposite of maps:without().  I would be very happy to see these 3 functions in the maps module.</span></p>
</span></div></blockquote><div><br></div><div>I too see the usefulness of these functions. I'll bring it up with the resident expert.</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-color:rgb(204,204,204);border-left-style:solid;padding-left:1ex">
<div dir="ltr"><span>
<br><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">2. In the talk there was a question about matching an empty map, and also a question about precise matching like how one would match a list.  I have always wondered similar things, so it got me thinking…</span></p>

<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">What if we use a "cons" in a map pattern to allow matching all remaining keys that were not selected in the main part of the pattern?  This would be roughly symmetric to what you can do with lists and binaries.  For example:</span></p>

<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:'Courier New';color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">#{ a:=A, c:=C | Rest } = #{a=>1, b=>2, c=>3, d=>4}.   % Rest = #{b=>2, d=>4}</span></p>

<div><span><br></span></div><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">That in itself I think has limited use, but it could be used to exactly match a map (ie, no extra pairs other than those specified in the match):</span></p>

<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:'Courier New';color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">f(#{ a:=A, c:=C | Rest })</span></p>

<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:'Courier New';color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">   when maps:size(Rest)==0 -></span></p>

<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:'Courier New';color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">…</span></p>

<div><span><br></span></div><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">If the pattern to the right of the bar is elided, we could take it to mean “match the empty map”.  The previous example could be rewritten as:</span></p>

<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:'Courier New';color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">f(#{ a:=A, c:=C |}) -></span></p>

<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:'Courier New';color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">…</span></p>

<div><span><br></span></div><br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:Arial;color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">This also lets you match just the empty map as was asked in the talk:</span></p>

<br><p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:'Courier New';color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">f(#{|}) -></span></p>

<p dir="ltr" style="line-height:1.15;margin-top:0pt;margin-bottom:0pt"><span style="font-size:15px;font-family:'Courier New';color:rgb(0,0,0);vertical-align:baseline;white-space:pre-wrap;background-color:transparent">…</span></p>

<div><br></div><div><span><br></span></div></span></div></blockquote><div><br></div><div>Richard O'Keefe had something very similar to this in his proposal for how frames should work in Erlang. You can find the details here: <a href="http://www.cs.otago.ac.nz/staffpriv/ok/frames.pdf">http://www.cs.otago.ac.nz/staffpriv/ok/frames.pdf</a>. We have been talking about doing something like this, but want to stabilize and polish off the current feature set before doing any more work on the syntax. </div>
<div><br></div><div>Lukas</div></div><br></div></div></div>