[swift-evolution] Proposal: allow arbitrary compile-time code execution

Adrian Kashivskyy adrian.kashivskyy at me.com
Mon Feb 8 02:26:09 CST 2016


What if the function you're evaluating depends on code that hasn't been compiled yet?

> func f() -> String {
>     return g()
> }
> 
> let value = #run f()
> 
> func g() -> String {
>     return "foo"
> }

Regards,
Adrian Kashivskyy
Senior iOS Developer at Netguru

> Wiadomość napisana przez David Sweeris via swift-evolution <swift-evolution at swift.org> w dniu 08.02.2016, o godz. 06:31:
> 
> I believe macro-ish stuff has been ruled "out of scope" until Swift 3 is out.
> 
> If not, it gets a +1 from me, and it'd serve as a nice stop-gap until Swift advances to the point that its own front-end can itself be written in Swift (at which point I *think* a bunch of very meta things involving the REPL and extensions become plausible — I think).
> 
> - Dave Sweeris
> 
> On Feb 7, 2016, at 20:29, Steve Richey via swift-evolution <swift-evolution at swift.org <mailto:swift-evolution at swift.org>> wrote:
> 
>> 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.
>> 
>> 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!
>> 
>> 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 (https://sites.google.com/site/jailanguageprimer/#TOC-Arbitrary-Compile-Time-Code-Execution <https://sites.google.com/site/jailanguageprimer/#TOC-Arbitrary-Compile-Time-Code-Execution>) but the syntax fits nicely with other special expression syntax in Swift such as `#available`, `#selector`, `#file`, and so on.
>> 
>> Example:
>> ```
>> func myFunction() -> String {
>> return "hello"
>> }
>> 
>> let myValue = #run myFunction()
>> ```
>> 
>> At compile time, `myFunction` is evaluated and the result inlined to the `myValue` definition. At run time, `myValue` is a `String` containing `"hello"`.
>> 
>> 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.
>> 
>> 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.
>> 
>> Thank you for your time!
>> 
>> Best regards,
>> Steve Richey
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution at swift.org <mailto:swift-evolution at swift.org>
>> https://lists.swift.org/mailman/listinfo/swift-evolution <https://lists.swift.org/mailman/listinfo/swift-evolution>
> _______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <https://lists.swift.org/pipermail/swift-evolution/attachments/20160208/f9e09915/attachment.html>


More information about the swift-evolution mailing list