<div dir="ltr">I realized just now that the macros would only help me partially, as compiling with the 17.0 compiler will produce a beam that won't run on R15... I will have to find a different solution or to abandon the patched version.<div>

<br></div><div>Anyway, a patch for the ?OTP_VERSION is available at <a href="https://github.com/vladdu/otp/compare/erlang:master...version_macro">https://github.com/vladdu/otp/compare/erlang:master...version_macro</a>. Of course, maybe the name is not the right one and there's documentation to add, if this is a change that is wanted.</div>

<div><br></div><div>regards,</div><div>Vlad</div></div><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Feb 28, 2014 at 9:36 AM, Vlad Dumitrescu <span dir="ltr"><<a href="mailto:vladdu55@gmail.com" target="_blank">vladdu55@gmail.com</a>></span> wrote:<br>

<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir="ltr">Hi,<div><br></div><div>I've been hit by this too, as I have a patched debugger that I need to compile on older versions too and there are issues with unicode/maps/named funs. Unfortunately, there might be cases where code will still have to be duplicated, because macros can only wrap full forms.</div>


<div><br></div><div>From a brief look att epp.erl, it feels like adding a ?OTP_RELEASE or ?OTP_VERSION predefined macro would be easy and the only possible problem is if there are user-defined macros with the same name. </div>



<div><br></div><div><div>predef_macros(File) -></div><div>     Machine = list_to_atom(erlang:system_info(machine)),</div><div>     {ok, Release0} = file:read_file(code:root_dir()++"/OTP_VERSION"),</div><div>


     Release = string:strip(Release0, right, $\n),</div><div>     ...</div></div><div><div><span style="white-space:pre-wrap">      </span>{{atom,'OTP_RELEASE'}, <span style="white-space:pre-wrap"> </span>      {none,[{string,1,Release}]}},</div>



</div><div><div>     ...</div><div></div></div><div><br></div><div>By the way, wouldn't it be useful to have an erlang:system_info() that reads the file and strips the 'ok' and the whitespace?</div><div><br></div>


<div>best regards,</div><div>Vlad</div></div><div class="HOEnZb"><div class="h5"><div class="gmail_extra"><br><br><div class="gmail_quote">On Fri, Feb 28, 2014 at 1:08 AM, ANTHONY MOLINARO <span dir="ltr"><<a href="mailto:anthonym@alumni.caltech.edu" target="_blank">anthonym@alumni.caltech.edu</a>></span> wrote:<br>


<blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div style="word-wrap:break-word">I also have felt this pain with the transition from behaviour_info to callbacks for behaviours.  Ideally, the preprocessor would define a macro along the lines of ?MODULE, ?MODULE_STRING, ?FILE, ?LINE, and ?MACHINE which is the full list according to <a href="http://www.erlang.org/doc/reference_manual/macros.html" target="_blank">http://www.erlang.org/doc/reference_manual/macros.html</a>.<div>


<br></div><div>If there was one additional macro call ?RELEASE with the major release, then it would be possible to conditionally compile at least dialyzer stuff (I don't know about the file encoding, I guess it would depend on whether the check is done during the preprocessor or at a later step).  This would probably prevent the proliferation of different compile macros which seem to crop up as every individual library adds their own based on a rebar or makefile check.</div>


<span><font color="#888888"><div><br></div><div>-Anthony</div></font></span><div><br><div><div><div><div>On Feb 27, 2014, at 3:06 PM, Jesper Louis Andersen <<a href="mailto:jesper.louis.andersen@gmail.com" target="_blank">jesper.louis.andersen@gmail.com</a>> wrote:</div>


<br></div></div><blockquote type="cite"><div><div><div dir="ltr">Release 17.0 brings two changes which prove to take some work getting around.<div><br></div><div>1. utf-8 is now the default encoding.</div><div>
<br></div><div>This is a rather insignificant change. The source code which uses latin1 can be fixed by one of three ways:</div>

<div><br></div><div>* Tell the compiler the file is latin1. This won't work going forward but works now.</div><div>* Change the file to utf-8. This won't work going backward a long way. But it will work going backwards for a bit.</div>




<div>* Change the file to ASCII. This works both backward and forward as long as we want.</div><div><br></div><div>This is a benign problem. I have tried compiling some projects and it turns out there are numerous repositories which needs fixing now. But the fix is rather simple.</div>




<div><br></div><div>2. Dialyzer dislikes queue(), dict(), ...</div><div><br></div><div>Dialyzer now prefers using queue:queue() and the like. This is *definitely* the right thing to support as it is much more consistent with the rest of the system and doesn't treat certain types as magically introduced types.</div>




<div><br></div><div><div>-module(z).</div><div><br></div><div>-export([f/1]).</div><div><br></div><div>-spec f(queue:queue()) -> queue:queue().</div><div>f(Q) -> queue:in(3, Q).</div><div><br></div><div>Which is nice, but this doesn't work on R16B03:</div>




<div><br></div><div><div>z.erl:5: referring to built-in type queue as a remote type; please take out the module name</div><div>z.erl:5: referring to built-in type queue as a remote type; please take out the module name</div>




</div><div><br></div><div>So here, I have no way of getting my source code to work with both R16 and 17.0 easily. There is no transition period so-to-speak. Many projects run with warnings-as-errors and they are in trouble:</div>




<div><br></div><div>* They can't compile</div><div>* They can remove the warnings-as-errors but this defeats the purpose</div><div>* They will have warnings spewed out over the console all the time</div><div><br></div>




<div>In the case of crypto:hash/2, we had somewhat the same situation. Prominent projects like Yaws, and lesser projects like Emysql has EPP macros in place as well as detection in order to figure out what to do. Or you can disable the warnings in this case specifically for this. But can I do the same with wrong type specs? Also, this workaround is done in almost every project out there, which is darn irritating.</div>




<div><br></div><div>I don't know what we need to solve this. At one point, I would really like to have a set of feature flags </div><div><br></div><div><a href="http://www.lispworks.com/documentation/HyperSpec/Body/v_featur.htm" target="_blank">http://www.lispworks.com/documentation/HyperSpec/Body/v_featur.htm</a> , ZFS, ...<br>




</div><div><br></div><div>where you have a way to compile-time scrutinize what your environment supports. Another way to solve it is the variant Go uses, namely "build constraints"</div><div><br></div><div><a href="http://golang.org/pkg/go/build/#pkg-overview" target="_blank">http://golang.org/pkg/go/build/#pkg-overview</a><br>




</div><div><br></div><div>which will mention under which circumstances to include a file as a part of an application. This would allow for easy handling of crypto:hash/2, but I do note it will fail on the dialyzer problem. It looks like the only sane way to solve that is to allow both queue() and queue:queue() as aliases for a major release and then proceed to remove queue().</div>




<div><br></div><div>Am I completely wrong here? I can accept languages evolve and that Release 17 has maps which will be used and break a lot of software for R16 quickly. But I also feel we should have some way of having a process so there is a way to handle this gracefully going forward. It is natural for libraries and languages to evolve and break compatibility. Yet, it should be easy to handle for programmers. There is much time wasted, which could be used better were there a nice solution.</div>




<div><br></div><div>Thoughts?</div><div><br></div>-- <br>J.
</div></div></div></div><div>
_______________________________________________<br>erlang-questions mailing list<br><a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br><a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>


</div></blockquote></div><br></div></div><br>_______________________________________________<br>
erlang-questions mailing list<br>
<a href="mailto:erlang-questions@erlang.org" target="_blank">erlang-questions@erlang.org</a><br>
<a href="http://erlang.org/mailman/listinfo/erlang-questions" target="_blank">http://erlang.org/mailman/listinfo/erlang-questions</a><br>
<br></blockquote></div><br></div>
</div></div></blockquote></div><br></div>