<div dir="ltr"><div class="gmail_extra"><div class="gmail_quote">On Tue, Jan 7, 2014 at 5:16 PM, Christian Schafmeister <span dir="ltr"><<a href="mailto:chris.schaf@verizon.net" target="_blank">chris.schaf@verizon.net</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"><div>Hey folks,</div><div><br></div><div><br></div><div>I’ve written a new Common Lisp environment/compiler over the past two years.  </div>
<div>It uses LLVM as the back-end (by exposing the LLVM C++ library to Common Lisp) and interoperates with C++ in that it has a template library like boost::python for exposing arbitrary C++ classes/functions to Common Lisp.  </div>
<div><br></div><div>I want to do some automated refactoring to improve my C++ code so I’m exposing the Clang ASTMatcher and Refactoring libraries.</div><div><br></div><div>I also think it would be really cool to write refactoring tools in a dynamic language like Lisp - without all the exhausting boilerplate required by the C++ approach.</div>
</div></blockquote><div><br></div><div>C++ refactoring tools actually don't require that much boilerplate... </div><div> </div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<div style="word-wrap:break-word"><div>So I’m exposing the Clang AST library to this Common Lisp environment with the goal of writing a general tool for writing C++ refactoring tools in Common Lisp.</div><div><br></div><div>
My goal is to mimic C++ ASTMatchers like:</div><div><b style="color:rgb(34,34,34)"><br></b></div><div><b style="color:rgb(34,34,34)">recordDecl(hasDescendant(</b></div><div><b style="color:rgb(34,34,34)">    ifStmt(hasTrueExpression(</b></div>
<div><b style="color:rgb(34,34,34)">        expr(hasDescendant(</b></div><div><b style="color:rgb(34,34,34)">            ifStmt()))))))</b></div><div><div><br></div></div><div>Using S-expressions: <b>(record-decl (has-descendent (if-stmt (has-true-expression (expr (has-descendant( if-stmt))))))) </b>   </div>
<div><br></div><div>And the source-to-source translation code will be small lambda functions that use the resulting MatchResults.</div><div><br></div><div>That way I don’t have to write a lot of documentation :-).</div><div>
<br></div><div>Currently I’m looking at calling the ASTMatcher/Dynamic/VariantValue interface to build ASTMatchers from S-expressions - does that sound like a good idea - or is there a better approach I should be exploring?</div>
</div></blockquote><div><br></div><div>Well, if your boost shim can already match "arbitrary C++ classes / functions", then it should in principle be able to expose the AST matchers as is (without the need to go through the dynamic parsing).</div>
<div>After all, the matchers are mostly just template functions :)</div><div><br></div><div>Otherwise I think going the dynamic matcher route is a good approach.</div><div><br></div><div>Cheers,</div><div>/Manuel</div></div>
</div></div>