<div dir="ltr"><br><div class="gmail_extra"><div class="gmail_quote">2013/5/14 Loïc Hoguin <span dir="ltr"><<a href="mailto:essen@ninenines.eu" target="_blank">essen@ninenines.eu</a>></span><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 class="im">On 05/13/2013 08:27 PM, Björn-Egil Dahlberg 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">
- Deep updates of Maps are not covered by this EEP. We would welcome<br>
suggestions on this.<br>
</blockquote>
<br></div>
I think what Kenneth had in his talk was good. But<br>
<br>
Simple update:<br>
  M#{ K => V }<br>
<br>
Nested update:<br>
  M#{ K }#{ DK => DV }<br></blockquote><div><br></div><div style>I believe this was a hasty example since it would, i gather, return the inner Map.</div><div style><br></div><div style>1> M = #{ a => #{ b => 1 } }.</div>
<div style>#{ a => #{ b => 1 } }<br></div><div style>2> M#{ a }#{ b := 2 }.</div><div style>#{ b => 2 }</div><div style> </div><div style><br></div><div style><br></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">

<br>
I personally would prefer a more powerful:<br>
  M#{ K #{ DK => DV }}<br>
<br>
Because it allows you to write things like:<br>
  M#{ K #{ DK => DV }, K2 => V2 }<br>
<br>
And update multiple levels at once.<br>
<br>
I know K can be a map, but deep update only works on values, the same way normal update only works on values, so no confusion is possible, we're only updating values, not K itself. If you feel an operator is needed it can be introduced between K and # in the two examples above.<br>

<br>
Programmatically this would translate as extracting the map found at key K, and ensuring it's a map, updating this map with DK => DV, then placing this map back into the key K in map M along with setting V2 in key K2.<br>

<br>
It doesn't sound hard to implement in the compiler, it's just unrolling things for access and rolling back again for the actual update. Exactly what we do manually today.<br>
<br>
It should also be easy to compile to an optimized deep update with this syntax as you got everything in a single expression.<br>
<br>
Note: If you are not interested in it despite how simple it is please at least ensure it can be done with a parse transform.<br>
<br>
Thoughts?</blockquote><div><br></div><div style>I think we want to be explicit here. Meaning using an operator and "seeing" the value in action. (I have bad memories of perl).</div><div><div><br class="">Just some first thoughts on deep updates here to see if I get the intention right. What I think we need is someway to use an associated value within the map. I figure, something like "escaping" the key which would fetch the associated value. Let's use '~' in this example.</div>
<div><br></div><div>Say I have a nested map like above, M = #{ a => #{ b => 1 }} and I would like to update the inner b value with it self plus four. I could write it like this:</div><div><br></div><div>3> M#{ a := ~a#{ b := ~b + 4 }}.</div>
<div>#{ a => #{ b => 5 }}</div><div><br></div><div>Another possibility would perhaps be to bind values first (wrapped in { .. } )and then use them in updates, say</div><div><br></div><div>M#{ a := M }{ a := M#{ b := V }{ b := V + 4 } }</div>
<div><br></div><div>.. that looks even more horrible .. =)</div><div><br></div><div>I haven't given this much thought but I'm trying to get a sense of it. Something like this?</div><div><br></div><div style>// Björn-Egil</div>
<div><br></div></div></div></div></div>