<div dir="ltr"><div>Hi Uli,</div><div><br></div>Clang currently accepts `\(` as a valid escape for `(` (apparently it's a GCC extension). It doesn't warn about this unless -Wpedantic is specified. To avoid breaking existing code that relies on this Clang might have to use another character pair (note that '[' and '{' have the same issue), or something like '\@(expression)'.<div class="gmail_extra"><br><div class="gmail_quote">On 26 July 2017 at 18:43, Uli Kusterer via cfe-dev <span dir="ltr"><<a href="mailto:cfe-dev@lists.llvm.org" target="_blank">cfe-dev@lists.llvm.org</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">Hi,<br>
<br>
 I have an idea on how one could add string interpolation to Swift. I wrote a tiny preprocessor as a proof-of-concept: <a href="https://github.com/uliwitness/ocpre" rel="noreferrer" target="_blank">https://github.com/uliwitness/<wbr>ocpre</a><br>
<br>
 Since that doesn't actually parse the code, it can only handle object types so far, so I'm thinking I should try to add it to the Clang ObjC compiler proper, instead. But I've never done this, never even built clang. Is there a tutorial somewhere on how to do this, and pointers on where I would start hooking into string escape sequence parsing, and which other parts I'd have to touch?<br></blockquote><div><br></div><div>I would recommend looking at the getting started guide first: <a href="http://llvm.org/docs/GettingStarted.html">http://llvm.org/docs/GettingStarted.html</a>. It contains instructions that describe how to build LLVM and Clang. As well as the getting started guide, I would recommend looking at Clang's internals manual before working on Clang: <a href="https://clang.llvm.org/docs/InternalsManual.html">https://clang.llvm.org/docs/InternalsManual.html</a>. This document contains a section that describes how one can add an new expression to Clang.</div><div><br></div><div>I hope this helps,</div><div>Alex</div><div> </div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left-width:1px;border-left-style:solid;border-left-color:rgb(204,204,204);padding-left:1ex">
<br>
 My approach is basically a simple code transformation. I'd turn strings containing escape sequences and subexpressions:<br>
<br>
        NSLog( "This is \(NSFullUserName()), who is \([myDatabase ageForUser: NSUserName()]) years old." );<br>
<br>
into<br>
<br>
        NSLog( "This is %1$@, who is %1$d years old.", (NSFullUserName()), ([myDatabase ageForUser: NSUserName()]) );<br>
<br>
and that's it. So this *should* be a comparatively simple change, and, moreover should need no changes to any existing libraries, client source code etc. It would just work with existing variadic functions.<br>
<br>
Not quite sure how one would localize the format strings (which my preprocessor does), as it's kinda unusual for clang to generate strings files, but maybe one can just generate the code for the main file and output a status message with the generated string key and value, and then one could use that message's text to generate the initial strings file so it will actually work at runtime. But even support for interpolation at the level Swift has right now is an improvement, I suppose.<br>
<br>
Cheers,<br>
-- Uli Kusterer<br>
"The Witnesses of TeachText are everywhere..."<br>
<a href="http://orangejuiceliberationfront.com" rel="noreferrer" target="_blank">http://<wbr>orangejuiceliberationfront.com</a><br>
<br>
<br>
<br>
<br>
<br>
______________________________<wbr>_________________<br>
cfe-dev mailing list<br>
<a href="mailto:cfe-dev@lists.llvm.org">cfe-dev@lists.llvm.org</a><br>
<a href="http://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-dev" rel="noreferrer" target="_blank">http://lists.llvm.org/cgi-bin/<wbr>mailman/listinfo/cfe-dev</a><br>
</blockquote></div><br></div></div>