<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=""><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">One last try at promoting code generators as an alternative means of importing….</div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">It keeps the complexity out of the compiler and you are able to write the “importer” in</div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">the language being imported allowing it to leverage it’s meta data introspection directly.</div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""></div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I’ve prepared a playground which shows how a generated class + limited supporting code</div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">provides an effective way of bridging to Python. As the generated code is just Swift you</div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">have the advantages of the Xcode editor such as code completion available.</div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""></div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><font color="#0069d9" class=""><u class=""><a href="https://github.com/johnno1962/SwiftPython/tree/master/SwiftPython.playground" class="">https://github.com/johnno1962/SwiftPython/tree/master/SwiftPython.playground</a></u></font></div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><font color="#0069d9" class=""><u class=""><a href="https://github.com/johnno1962/SwiftPython/blob/master/SwiftPython.playground/Sources/Complex.swift" class="">https://github.com/johnno1962/SwiftPython/blob/master/SwiftPython.playground/Sources/Complex.swift</a></u></font></div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><font color="#0069d9" class=""><u class=""><br class=""></u></font></div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">The playground is standalone and the generated class is included as an auxiliary file.</div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">The bridging code would only require updating when the surface of the api changes.</div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">I’ve not written the actual generator script but it should be straightforward for Python.</div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""></div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class="">John.</div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""></div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(0, 132, 0); background-color: rgb(255, 255, 255);" class="">//: Playground - noun: a place where people can play</div><div style="margin: 0px; line-height: normal; background-color: rgb(255, 255, 255); min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(209, 47, 27); background-color: rgb(255, 255, 255);" class=""><span style="color: #ba2da2" class="">var</span><span style="color: #000000" class=""> str = </span>"Hello, python integration"</div><div style="margin: 0px; line-height: normal; background-color: rgb(255, 255, 255); min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(0, 132, 0); background-color: rgb(255, 255, 255);" class="">// class Complex is implemented in python</div><div style="margin: 0px; line-height: normal; background-color: rgb(255, 255, 255); min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""><span style="color: #ba2da2" class="">let</span> c = <span style="color: #4f8187" class="">Complex</span>(<span style="color: #272ad8" class="">11.0</span>, <span style="color: #272ad8" class="">12.0</span>)</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""><span style="color: #3e1e81" class="">print</span>(<span style="color: #4f8187" class="">c</span>.<span style="color: #31595d" class="">toString</span>(extra: <span style="color: #d12f1b" class="">"123"</span>))</div><div style="margin: 0px; line-height: normal; background-color: rgb(255, 255, 255); min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(79, 129, 135); background-color: rgb(255, 255, 255);" class="">c<span style="color: #000000" class="">.</span>r</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""><span style="color: #4f8187" class="">c</span>.<span style="color: #31595d" class="">add</span>(c: <span style="color: #4f8187" class="">Complex</span>(<span style="color: #272ad8" class="">1.0</span>, <span style="color: #272ad8" class="">2.0</span>))</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(79, 129, 135); background-color: rgb(255, 255, 255);" class="">c<span style="color: #000000" class="">.</span>r</div><div style="margin: 0px; line-height: normal; background-color: rgb(255, 255, 255); min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""><span style="color: #3e1e81" class="">print</span>(<span style="color: #4f8187" class="">c</span>.<span style="color: #31595d" class="">toString</span>(extra: [<span style="color: #272ad8" class="">1</span>,<span style="color: #272ad8" class="">2</span>,<span style="color: #272ad8" class="">3</span>]))</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""><span style="color: #3e1e81" class="">print</span>(<span style="color: #4f8187" class="">c</span>.<span style="color: #31595d" class="">toString</span>(extra: [<span style="color: #272ad8" class="">1.0</span>,<span style="color: #272ad8" class="">2.0</span>,<span style="color: #272ad8" class="">3.0</span>]))</div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; background-color: rgb(255, 255, 255);" class=""><span style="color: #3e1e81" class="">print</span>(<span style="color: #4f8187" class="">c</span>.<span style="color: #31595d" class="">toString</span>(extra: [<span style="color: #d12f1b" class="">"a"</span>: <span style="color: #272ad8" class="">1.0</span>, <span style="color: #d12f1b" class="">"b"</span>: <span style="color: #272ad8" class="">2.0</span>, <span style="color: #d12f1b" class="">"c"</span>: [<span style="color: #272ad8" class="">1</span>,<span style="color: #272ad8" class="">2</span>,<span style="color: #272ad8" class="">3</span>]]))</div><div style="margin: 0px; line-height: normal; background-color: rgb(255, 255, 255); min-height: 14px;" class=""><br class=""></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(49, 89, 93); background-color: rgb(255, 255, 255);" class=""><span style="color: #4f8187" class="">c</span><span style="color: #000000" class="">.</span>toArray<span style="color: #000000" class="">()</span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo; color: rgb(49, 89, 93); background-color: rgb(255, 255, 255);" class=""><span style="color: #4f8187" class="">c</span><span style="color: #000000" class="">.</span>toDictionary<span style="color: #000000" class="">()</span></div><div class=""><span style="color: #000000" class=""><br class=""></span></div><div class=""><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><b class="">(11.000000 12.000000 123)</b></span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><b class="">(12.000000 14.000000 [1L, 2L, 3L])</b></span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><b class="">(12.000000 14.000000 [1.0, 2.0, 3.0])</b></span></div><div style="margin: 0px; font-size: 11px; line-height: normal; font-family: Menlo;" class=""><span style="font-variant-ligatures: no-common-ligatures" class=""><b class="">(12.000000 14.000000 {'a': 1.0, 'c': [1L, 2L, 3L], 'b': 2.0})</b></span></div></div></div><div dir="auto" style="word-wrap: break-word; -webkit-nbsp-mode: space; -webkit-line-break: after-white-space;" class=""><br class=""><div><blockquote type="cite" class=""><div class="">On 12 Nov 2017, at 11:45, Brent Royal-Gordon via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; 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; line-break: after-white-space;" class=""><div class=""><blockquote type="cite" class=""><div class="">On Nov 11, 2017, at 7:02 AM, Joe Groff via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:</div><br class="Apple-interchange-newline"><div class=""><span style="font-family: Helvetica; font-size: 12px; font-style: normal; font-variant-caps: normal; font-weight: normal; letter-spacing: normal; text-align: start; text-indent: 0px; text-transform: none; white-space: normal; word-spacing: 0px; -webkit-text-stroke-width: 0px; float: none; display: inline !important;" class="">Opening up the compiler architecture to make custom importers easier to write is a great solution to a ton of problems, including yours I think, without adding complexity to the core language. Experience in .NET land seems to show it's a great technique for integrating dynamic systems with static type systems, without poking unnecessary holes in the static language's type system</span></div></blockquote></div><div class=""><br class=""></div><div class="">I'm keenly interested in custom importers, if only because I would love to treat storyboards and asset catalogs as "languages" and automatically generate typesafe enums for their various stringly-typed identifiers. (Note to anyone in the peanut gallery getting excited: I don't work at Apple and can't make this a part of the toolchain; I just hope they'd do it if they could.)</div><div class=""><br class=""></div><div class="">But at the same time, I have a hard time seeing that as a great solution for dynamic languages. I've barely used Python, but I work in Ruby on Rails a lot, and Rubyists rely pretty heavily on dynamic features. For instance, the ActiveRecord ORM creates all its accessors on demand through Ruby's `method_missing` feature. Static analysis would be useless for this, and I can't imagine that profile-based analysis would be very reliable. Even the F# Type Providers documentation warns that "You should avoid writing a type provider where a schema isn't available."</div><div class=""><br class=""></div><div class="">A dynamic dispatch feature, on the other hand, could reliably reproduce Ruby's behavior because every method call would simply be dispatched through Ruby's method-calling machinery, just as a method call in Ruby would be. It's a round hole for the round peg of a dynamic language's dispatch behavior to fit into. Other languages, like Objective-C and C++, could use the square hole of a custom importer.</div><div class=""><br class=""></div><div class="">Or maybe the right custom importer design could have it both ways, allowing dynamic languages to accept and write a dispatch for unknown methods, while permitting static languages to match against the more specific data they have available. I don't know. All I'm saying is, static languages and dynamic languages are different, and we need the features necessary to support both without making either of them worse. It's quite possible that the best design for static language bridges will look very, very different from the best design for dynamic languages.</div><br class=""><div class="">
<span class="Apple-style-span" style="border-collapse: separate; font-family: Helvetica; font-variant-ligatures: normal; font-variant-east-asian: normal; font-variant-position: normal; line-height: normal; border-spacing: 0px;"><div class=""><div style="font-size: 12px; " class="">--&nbsp;</div><div style="font-size: 12px; " class="">Brent Royal-Gordon</div><div style="font-size: 12px; " class="">Architechies</div></div></span>

</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>