<html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8"></head><body style="word-wrap: break-word; -webkit-nbsp-mode: space; line-break: after-white-space;" class="">The semantics of the DLR seems fairly similar to Chris’ proposal, does it not? Btw, this makes me think that I would prefer to have one proposal contain both dynamic member lookup and dynamic method calls: it would be kind of silly to have one accepted and not the other.<div class=""><br class=""></div><div class="">David.<br class=""><div><br class=""><blockquote type="cite" class=""><div class="">On 1 Dec 2017, at 17:38, C. Keith Ray 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=utf-8" class=""><div dir="auto" class="">Should we compare dynamic member lookup to Microsoft's DLR ?<div class=""><br class=""><div class=""><a href="https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/dynamic-language-runtime-overview" class="">https://docs.microsoft.com/en-us/dotnet/framework/reflection-and-codedom/dynamic-language-runtime-overview</a></div><div class=""><br class=""></div><div class="">Quote:&nbsp;</div><div class=""><div class=""><p class="lf-text-block lf-block" data-lf-anchor-id="85a62c6154b8203b35dd89dfcd33c753:0" style="margin-top: 1rem; margin-bottom: 0px; position: relative !important; padding-right: 25px !important;"><span style="background-color: rgba(255, 255, 255, 0);" class="">The&nbsp;<em class="">dynamic language runtime</em>&nbsp;(DLR) is a runtime environment that adds a set of services for dynamic languages to the common language runtime (CLR). The DLR makes it easier to develop dynamic languages to run on the .NET Framework and to add dynamic features to statically typed languages.&nbsp;</span><span class="lf-mobile-thread-btn" style="position: absolute !important; right: 0px !important; top: 0px !important;"></span></p><p class="lf-text-block lf-block" data-lf-anchor-id="fbebbb43bdbf73a9386d0bcfc9f672ab:0" style="margin-top: 1rem; margin-bottom: 0px; position: relative !important; padding-right: 25px !important;"><span style="background-color: rgba(255, 255, 255, 0);" class="">Dynamic languages can identify the type of an object at run time, whereas in statically typed languages such as C# and Visual Basic (when you use&nbsp;<code style="border-top-left-radius: 2px; border-top-right-radius: 2px; border-bottom-right-radius: 2px; border-bottom-left-radius: 2px; display: inline-block; padding: 3px 7px; border: 1px solid rgb(211, 214, 219); line-height: 19px; -webkit-font-smoothing: auto; direction: ltr;" class="">Option Explicit On</code>) you must specify object types at design time. Examples of dynamic languages are Lisp, Smalltalk, JavaScript, PHP, Ruby, Python, ColdFusion, Lua, Cobra, and Groovy.&nbsp;</span><span class="lf-mobile-thread-btn" style="position: absolute !important; right: 0px !important; top: 0px !important;"></span></p><p class="lf-text-block lf-block" data-lf-anchor-id="f7e73cd4a9bbe4332ee18b4fe5f4c783:0" style="margin-top: 1rem; margin-bottom: 0px; position: relative !important; padding-right: 25px !important;"><span style="background-color: rgba(255, 255, 255, 0);" class="">Most dynamic languages provide the following advantages for developers:&nbsp;</span><span class="lf-mobile-thread-btn" style="position: absolute !important; right: 0px !important; top: 0px !important;"></span></p><ul class="lf-text-block lf-block" data-lf-anchor-id="e4936e1346be31b91cc3bbc44b63f67b:0" style="margin: 16px 0px 16px 38px; padding-top: 0px; padding-bottom: 0px; padding-left: 0px; padding-right: 25px !important; position: relative !important;"><li style="list-style: disc outside none;" class=""><p style="margin-top: 1rem; margin-bottom: 0px; position: relative !important; padding-right: 25px !important;" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">The ability to use a rapid feedback loop (REPL, or read-evaluate-print loop). This lets you enter several statements and immediately execute them to see the results.&nbsp;</span></p></li><li style="list-style: disc outside none;" class=""><p style="margin-top: 1rem; margin-bottom: 0px; position: relative !important; padding-right: 25px !important;" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">Support for both top-down development and more traditional bottom-up development. For example, when you use a top-down approach, you can call functions that are not yet implemented and then add underlying implementations when you need them.&nbsp;</span></p></li><li style="list-style: disc outside none;" class=""><p style="margin-top: 1rem; margin-bottom: 0px; position: relative !important; padding-right: 25px !important;" class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">Easier refactoring and code modifications, because you do not have to change static type declarations throughout the code.&nbsp;</span></p></li><span class="lf-mobile-thread-btn" style="position: absolute !important; right: 0px !important; top: 0px !important;"></span></ul><p class="lf-text-block lf-block" data-lf-anchor-id="e76f7fdd244be55a245d09cf0ff7668f:0" style="margin-top: 1rem; margin-bottom: 0px; position: relative !important; padding-right: 25px !important;"><span style="background-color: rgba(255, 255, 255, 0);" class="">Dynamic languages make excellent scripting languages. Customers can easily extend applications created by using dynamic languages with new commands and functionality. Dynamic languages are also frequently used for creating Web sites and test harnesses, maintaining server farms, developing various utilities, and performing data transformations.&nbsp;</span><span class="lf-mobile-thread-btn" style="position: absolute !important; right: 0px !important; top: 0px !important;"><a class="fycon-action-view" tabindex="0" aria-label="Write a Sidenote" data-lf-anchor-id="e76f7fdd244be55a245d09cf0ff7668f:0" style="-webkit-text-decoration-skip: objects; cursor: pointer; word-wrap: break-word; border: none; display: inline-block; font-stretch: normal; line-height: 18px; height: 13px; margin: 0px 0px 0px 6px; opacity: 1; position: relative; -webkit-user-select: none; background-color: rgba(255, 255, 255, 0); background-position: 0px 0px;"><font class="">+</font></a></span></p><p class="lf-text-block lf-block" data-lf-anchor-id="81ed3fe94ca260b9314589dfcd114685:0" style="margin-top: 1rem; margin-bottom: 0px; position: relative !important; padding-right: 25px !important;"><span style="background-color: rgba(255, 255, 255, 0);" class="">The purpose of the DLR is to enable a system of dynamic languages to run on the .NET Framework and give them .NET interoperability. The DLR introduces dynamic objects to C# and Visual Basic in Visual Studio 2010 to support dynamic behavior in these languages and enable their interoperation with dynamic languages.</span></p><p class="lf-text-block lf-block" data-lf-anchor-id="81ed3fe94ca260b9314589dfcd114685:0" style="margin-top: 1rem; margin-bottom: 0px; position: relative !important; padding-right: 25px !important;"><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></p><div class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">--<br class="">C. Keith Ray</span><div class=""><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class=""></span></div><div class=""><span style="background-color: rgba(255, 255, 255, 0);" class="">*&nbsp;<a href="https://leanpub.com/wepntk" class="">https://leanpub.com/wepntk</a>&nbsp;&lt;- buy my book?<br class="">*&nbsp;</span><a href="http://www.thirdfoundationsw.com/keith_ray_resume_2014_long.pdf" class="">http://www.thirdfoundationsw.com/keith_ray_resume_2014_long.pdf</a><span style="background-color: rgba(255, 255, 255, 0);" class=""><br class="">*&nbsp;<a href="http://agilesolutionspace.blogspot.com/" class="">http://agilesolutionspace.blogspot.com/</a></span></div></div><div class=""><br class="">On Dec 1, 2017, at 8:07 AM, Benjamin G via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class=""><br class=""></div><blockquote type="cite" class=""><div class=""><div dir="ltr" class=""><br class=""><div class="gmail_extra"><br class=""><div class="gmail_quote">On Fri, Dec 1, 2017 at 4:35 PM, Jon Gilbert via swift-evolution <span dir="ltr" class="">&lt;<a href="mailto:swift-evolution@swift.org" target="_blank" class="">swift-evolution@swift.org</a>&gt;</span> wrote:<br class=""><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">&gt; On Nov 30, 2017, at 08:10, Karl Wagner via swift-evolution &lt;<a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a>&gt; wrote:<br class="">
&gt;<br class="">
&gt; Personally, I feel this system is designed to let you write Python, using Swift as a wrapper language - except unlike with Objective-C,<br class="">
<br class="">
</span>Let me paraphrase the proposal—it basically says this system is designed to make it easier to “fake import” existing Python/Ruby/JS libs to make it easier for people who depend on them to adopt Swift. Especially in the world of server-side Swift, I can see how this could help speed Swift’s adoption.<br class=""></blockquote><div class=""><br class=""></div><div class="">As a sidenote, the weakest points of python on the server side is compile-time type safety (none) and concurrency (almost none either). If we want to convince anyone at the moment to switch to swift on the backend, i'd say the urgent part isn't to make one or two function calls to a python library more "swifty" (but without any guarantee that we didn't mistype a function name). I'd say we should better focus on having a great agent concurrency model, as well as even better generics and faster compile time.</div><div class="">From what i've observed around me, people seem to migrate python code to golang. Not ruby or lisp.<br class=""></div><div class=""><br class=""></div><div class=""><br class=""></div><div class="">&nbsp;</div><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">
<br class="">
However, I believe that you bring up an extremely valid concern. To extrapolate from your points, this proposal seems to have a high potential to erode what makes Swift special, and it provides a way to get around Swift’s safe-guards, avoid writing Swift versions of libraries, and ultimately, avoid hiring real Swift developers.<br class="">
<span class=""><br class="">
&gt; it doesn’t have any static information about what you can do or not. It can’t provide the “safe by default” guarantees are other core principles and set Swift apart from other languages.<br class="">
<br class="">
</span>Exactly.<br class="">
<br class="">
Look how JSON parsing is done in Swift 3.2 and 4.0—we make static types. The 1’s and 0’s from a web response go through layers of proper error handling before they become proper types Swift.<br class="">
<br class="">
So why does this proposal keeps mentioning JSON parsing as an excuse for making a dynamic ghetto within the language? Because some people are parsing untyped JSON? Well, the solution for that is, type your frickin’ JSON.<br class="">
<br class="">
Why compromise Swift’s static-ness and roll out the red carpet for the dynamic, unwashed masses?<br class="">
<br class="">
Wouldn’t it be better to create an AI that quickly translates Pyton, Ruby, or JS into Swift? Augustus built huge public bathhouses for the unwashed Romans.<br class="">
<span class=""><br class="">
&gt; When we consider interoperability with other languages, it should be from the perspective of mapping their features to Swift’s philosophies.<br class="">
<br class="">
</span>Amen.<br class="">
<span class=""><br class="">
&gt; This proposal takes the reverse approach, and makes Swift like Python, so I’m against it.<br class="">
<br class="">
</span>This is my concern as well.<br class="">
<br class="">
Perhaps there is a way to make the proposal require that you declare Swift types and protocols that map to these other languages, with verbose error handling for when this glue breaks down (just like we have for typed JSON).<br class="">
<br class="">
Then, we could also make scripts that auto-generate the necessary Swift typing boilerplate interface code from the Python/Ruby/JS source, kinda like we get for Obj.-C bridging headers. This could be a good step towards the full AI translation that I mentioned.<br class="">
<br class="">
Of course, maybe I am missing something here, and my opinion is wrong; Chris will let us know if these concerns are valid.<br class="">
<br class="">
However, I hope we don’t hear how we are just being paranoid, because I assure you, this is not paranoia. It’s just about maintaining the static-ness and purity of Swift to help save the world from bad code.<br class="">
<br class="">
Everything in life and engineering is a trade-off. Swift’s trademark is that it consistently sacrifices the convenience of dynamic-ness for the safety and performance of static-ness. This proposal does seem to do the opposite, and we’d be naive not to fear the effect this will have.<br class="">
<br class="">
Ask yourself... what if Product knows about it? The last conversation a tech lead or engineering manager wants to have, I would imagine, is to explain on deaf ears why it would be bad to cut costs by farming out the iOS work to a cheap Python shop overseas, then just wrap it in sugary compiler hooks. Or why it would be bad for a Swift project to depend upon a stack of third-language dependencies that CocoaPods/Carthage can’t manage, XCode can’t analyze, stack traces can’t delve into (or can it?), lldb can’t step through, etc.<br class="">
<br class="">
I do not believe this is unreasonable paranoia, I just believe it looks that way to people who work with an elite squad of engineers at a top company, who have perhaps not seen what goes on at most places, where budgets are tight and lots of people are not the biggest fans of Apple. It’s already with much grinding of teeth that non-Windows, non-Linux devs are necessary.<br class="">
<br class="">
Given Swift’s emphasis on safety, this push to make danger easier really does surprise me, unless I just don’t understand this correctly. Have we re-evaluated the importance of having the language itself prohibit bad practices? Or is there some reason why this proposal does not actually make it easier to write code that looks like good, type-safe Swift code, but actually isn’t?<br class="">
<br class="">
Finally, to really be honest, may I ask why web devs, many of whom never touched a line of Swift, deserve all this dynamic sugar, while on the other hand, we SWIFT devs don’t get any? How will people feel who were told that dynamic is so unsafe that Swift was designed to prevent it altogether? People who have been through all the migrations and member-wise trenches might chafe a bit. Is that unreasonable?<br class="">
<br class="">
Lastly, if you can “fake import” Javascript or Python to Swift via this proposal, is there anything that would prevent the “fake import” of masquerading Swift modules? In other words, could lazy devs who want hacky dynamic-ness abuse this? If so then maybe I’m in favor after all ;P (Just kidding.)<br class="">
<br class="">
- Jon<br class="">
<br class="">
PS—I am just trying to think critically here. Ultimately this proposal would not hurt me, but I am just worried about the big picture. I can see why it’s a tough call and I am sure that some pressures exist that might make even this compromise to be worth it. I just feel like we should not underestimate how much bad will come along with the good, nor should we assume, “Well that kind of bad would never happen where I work, and only idiots would abuse this.”<br class="">
<div class="HOEnZb"><div class="h5">______________________________<wbr class="">_________________<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" rel="noreferrer" target="_blank" class="">https://lists.swift.org/<wbr class="">mailman/listinfo/swift-<wbr class="">evolution</a><br class="">
</div></div></blockquote></div><br class=""></div></div>
</div></blockquote><blockquote type="cite" class=""><div class=""><span class="">_______________________________________________</span><br class=""><span class="">swift-evolution mailing list</span><br class=""><span class=""><a href="mailto:swift-evolution@swift.org" class="">swift-evolution@swift.org</a></span><br class=""><span class=""><a href="https://lists.swift.org/mailman/listinfo/swift-evolution" class="">https://lists.swift.org/mailman/listinfo/swift-evolution</a></span><br class=""></div></blockquote></div></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="">https://lists.swift.org/mailman/listinfo/swift-evolution<br class=""></div></blockquote></div><br class=""></div></body></html>