<div dir="ltr">So you are talking about idempotence.<div><br></div><div>HTTP/1.1 defined it as:<br><div><br></div><div><span style="color:rgb(51,51,51);font-family:ubuntu,Sanchez,Questrial,Verdanda,Roboto,Quicksand,&#39;lucida console&#39;,&#39;Helvetica Neue&#39;,Calibri,&#39;Droid Sans&#39;,Helvetica,Arial,sans-serif,Oxygen,&#39;Varela Round&#39;,Lato;font-size:15px;background-color:rgb(239,239,239)">Methods can also have the property of &quot;idempotence&quot; in that (aside from error or expiration issues) the side-effects of N &gt; 0 identical requests is the same as for a single request.</span><br></div></div></div><div class="gmail_extra"><br><div class="gmail_quote">On Sat, Jan 9, 2016 at 11:01 PM, Michel Fortin via swift-evolution <span dir="ltr">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank">swift-evolution@swift.org</a>&gt;</span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">Le 9 janv. 2016 à 8:16, Angelo Villegas via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a>&gt; a écrit :<br>
<br>
&gt; I&#39;m not yet really familiar with this term but correct me if I&#39;m wrong, &quot;pure&quot; (function wise) means functions won&#39;t have access to global or static, and mutable variables through their arguments, right?<br>
<br>
</span>This is actually the most important part to define. There are many ways to define it, each with different tradeoffs. Here are the two base ones:<br>
<br>
1. Pure means that the function always return the same value given the same arguments, and has no side effects (it purely computes a result from its inputs), making it possible for the compiler, or a cache, to reuse the result from a previous call. This is the simplest definition, and it provide strong guaranties. Let&#39;s call that &quot;strongly pure&quot;.<br>
<br>
2. Pure just mean that the function has no access to global variables. It can only mutate &quot;outside&quot; things through inout parameters or pointers (including class references) passed to it by the caller. So in the general case you can&#39;t reuse the results. But you can use this function to mutate the state inside a strongly pure one. A strongly pure function in this case is one with no inout or pointer in the signature.<br>
<br>
It makes more sense to use (2) to define `@pure` in my opinion. Note that this is what the D language has done, after noticing it to be much more useful than what they had before before, which was (1).<br>
<br>
All that&#39;s good in theory, but there is a major detail that needs addressing. Memory allocation breaks the guaranties of a &quot;strongly pure&quot; function. For instance, if you return a newly allocated object, or a struct with a pointer to an object, the object is going to be a different one every time. That object is mutable memory, and returning a different chunk of mutable memory is quite different in semantics from returning the same one. If you want strong purity guaranties when returning objects (and thus be able to optimize by reusing the result from a previous call), there needs to be a way to return objects that have a language-enforced guaranty of immutability... same for structs that can have a pointer to an object or other memory. Without immutability guaranties, `@pure` has almost no optimization value.<br>
<span class="HOEnZb"><font color="#888888"><br>
--<br>
Michel Fortin<br>
<a href="https://michelf.ca" rel="noreferrer" target="_blank">https://michelf.ca</a><br>
</font></span><div class="HOEnZb"><div class="h5"><br>
_______________________________________________<br>
swift-evolution mailing list<br>
<a href="mailto:swift-evolution@swift.org">swift-evolution@swift.org</a><br>
<a href="https://lists.swift.org/mailman/listinfo/swift-evolution" rel="noreferrer" target="_blank">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br>
</div></div></blockquote></div><br><br clear="all"><div><br></div>-- <br><div class="gmail_signature"><div dir="ltr">Best Regards!<br><br>Yang Wu<br>--------------------------------------------------------<br>Location: Pudong, Shanghai, China.<br>EMail    : <a href="mailto:pinxue@gmail.com" target="_blank">pinxue@gmail.com</a><br>Website: <a href="http://www.time2change.mobi" target="_blank">http://www.time2change.mobi</a> <a href="http://rockplayer.com" target="_blank">http://rockplayer.com</a><br>Twitter/Weibo : @pinxue<br><a href="http://www.pinxue.net" target="_blank"></a></div></div>
</div>