<html><head><meta http-equiv="Content-Type" content="text/html charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">Or maybe <div class=""><br class=""></div><div class="">@constexpr func myFunction(foo:String) -> Expr {…}</div><div class=""><br class=""></div><div class="">Regardless of the syntax, it’s great to see that I’m not the only one interested in this.</div><div class=""><br class=""></div><div class="">-Matt</div><div class=""><br class=""></div><div class="">PS - Metalua looks fascinating.</div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class=""><br class=""><div><blockquote type="cite" class=""><div class="">On Feb 9, 2016, at 01:18, Haravikk via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><meta http-equiv="Content-Type" content="text/html charset=utf-8" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div class="">It seems a bit like an all new syntax though; what about an attribute that places some extra requirements on the function that throws an error if it can’t be produced at compile time? Not sure what it should be called, but I was thinking something like:</div><div class=""><br class=""></div><div class=""><font face="Monaco" class=""><span class="Apple-tab-span" style="white-space:pre">        </span>@compile_time func myFunction(foo:String) -> Expr { … }</font></div><div class=""><br class=""></div><div class="">If the function can’t be made available at compile time due to dependencies or runtime requirements or whatever, then it will generate an error, otherwise it will be compiled ahead of other functions, and will explicitly have a precomputed value.</div><div class=""><br class=""></div><div class="">The idea is that while the attribute explicitly tells the compiler to compile this function in advance, it doesn’t introduce a separate class of function or a kind of language within a language, and the function could even still be called at runtime as well with dynamic values for foo (rather than constant ones).</div><div class=""><br class=""></div><div class="">That said, I still think that ideally the compiler should do as much of this pre computation as it can, the difference here is that the attribute explicitly requires it, while another could explicitly prevent it (if you’re concerned about memory).</div><br class=""><div class=""><blockquote type="cite" class=""><div class="">On 8 Feb 2016, at 19:58, Joe Groff via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class=""><meta http-equiv="Content-Type" content="text/html charset=us-ascii" class=""><div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">This would be cool, but allowing arbitrary code from the enclosing context to be executed introduces difficult dependency ordering issues. I like the design of Metalua (<a href="http://metalua.luaforge.net/" class="">http://metalua.luaforge.net</a>), which allows for pretty explicit and flexible jumping up and down "meta" levels, which in addition to building values, can also build arbitrary ASTs. In Swift, that might look something like this:<div class=""><br class=""></div><div class=""><br class=""></div><div class="">// Compile-time available definitions, that produce Expr nodes</div><div class="">#{</div><div class="">func myCompileTimeFunction() -> Expr { ... }</div><div class=""><div class="">}#</div><div class=""><br class=""></div><div class="">// Evaluate a compile-time function and expand the result expression here</div><div class="">let myValue = #(myFunction())</div><div class=""><br class=""></div><div class="">-Joe</div><div class=""><br class=""><div class=""><blockquote type="cite" class=""><div class="">On Feb 7, 2016, at 8:29 PM, Steve Richey via swift-evolution <<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>> wrote:</div><br class="Apple-interchange-newline"><div class="">
<meta http-equiv="Content-Type" content="text/html; charset=us-ascii" class="">
<div style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space; font-size: 14px; font-family: Calibri, sans-serif;" class="">
<div class="">It is not uncommon to want to run code at build time. Xcode solves this need by allowing "Build Phases", which are often shell scripts which handle compile-time tasks.</div>
<div class=""><br class="">
</div>
<div class="">It may be beneficial to Swift developers, especially those who are not programming on platforms supported by Xcode, to handle compile-time tasks in a powerful and expressive language with which they are already familiar: Swift!</div>
<div class=""><br class="">
</div>
<div class="">In short, I propose the addition of a `#run` expression that allows the execution of code at compile time. This syntax and concept are borrowed from the programming language Jai (<a href="https://sites.google.com/site/jailanguageprimer/#TOC-Arbitrary-Compile-Time-Code-Execution" class="">https://sites.google.com/site/jailanguageprimer/#TOC-Arbitrary-Compile-Time-Code-Execution</a>)
but the syntax fits nicely with other special expression syntax in Swift such as `#available`, `#selector`, `#file`, and so on.</div>
<div class=""><br class="">
</div>
<div class="">Example:</div>
<div class="">```</div>
<div class="">func myFunction() -> String {</div>
<div class=""><span class="Apple-tab-span" style="white-space:pre"></span>return "hello"</div>
<div class="">}</div>
<div class=""><br class="">
</div>
<div class="">let myValue = #run myFunction()</div>
<div class="">```</div>
<div class=""><br class="">
</div>
<div class="">At compile time, `myFunction` is evaluated and the result inlined to the `myValue` definition. At run time, `myValue` is a `String` containing `"hello"`.</div>
<div class=""><br class="">
</div>
<div class="">This is useful for tasks that are relatively expensive to run but only need to be done once, such as lookup tables. Running the algorithm to generate those tables can be handled at compile-time, and the results retrieved at no cost at run time. Furthermore,
this structure allows code reuse between the run time and build time code, obviating the need to perform similar tasks in, say, a Swift method and a Python script.</div>
<div class=""><br class="">
</div>
<div class="">This is my first attempt at a Swift proposal, so any and all feedback is welcome! This seems like it should be easy enough to implement but I'm not especially familiar with Swift's internals. If there are any hurdles or unforeseen consequences associated
with this from an implementation standpoint, that would be very useful to know.</div>
<div class=""><br class="">
</div>
<div class="">Thank you for your time!</div>
<div class=""><br class="">
</div>
<div class="">Best regards,</div>
<div class="">Steve Richey</div>
</div>
_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div></div></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a><br class=""></div></blockquote></div><br class=""></div>_______________________________________________<br class="">swift-evolution mailing list<br class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a><br class="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></div></body></html>