On Dec 5, 2017, at 11:51 PM, Jonathan Hull <jh...@gbis.com> wrote:
> Ok, I have changed my mind about the need for a marker, and will accept the 
> proposal as-is.  I realized that these dynamic member lookup types can just 
> be made inner types, and so I can easily create the .dynamic behavior in my 
> own code if I want under the current proposal.  I also realized that 
> requiring a marker would screw up the proxy use-case of this.
> 
> I do still have a couple of questions I am confused on:

Hi Jonathan,

I’d suggest taking a look at the playground that I periodically send out to 
swift-evolution showing the current state of the python interop.  I just sent 
an update to the "Python Interop with Swift 4+” thread just now.  It works with 
unmodified Xcode 9, but includes comments showing what code could look like 
with the proposal in question.

> 1) How do operators work with this?  I saw you give an example of a+b for 
> python types, but I don’t see where either proposal bridges operators. (I 
> could easily have missed it though)

As Magnus points out, Swift 4 already supports overloading operators with 
dynamic behavior.  In the case of the playground, it looks like this:

public func +(lhs: PyVal, rhs: PyVal) -> PyVal {
  return lhs.call(member: "__add__", args: rhs)
}

This has all the “bad behavior” that people are concerned about: it could fail 
at runtime.  Despite the claims, Swift does not actually make an effort to 
prevent this, and that is an intentional part of its design.

> 2) What if I need two separate python libraries?  The code says ‘let np = 
> Python.import(“numpy”)’.  Are we supposed to make a separate variable for 
> each import?

Yes, that is traditional for python, which would typically look like:

        import numpy as np
        import pandas as pd 
        import matplotlib.pyplot as plt

and the playground already supports (with no language extensions):

        let np = Python.import(“numpy”)
        let pd = Python.import(“pandas”)
        let plt = Python.import(“matplotlib.pyplot”)

It turns out that languages everywhere have standardized on starting with a 
block of imports :-)


> 3) How will inter-op between Swift types and Python types work?  It looks 
> like you are just passing strings and integer constants to python functions. 
> Do they get converted automatically, or do we have to explicitly convert 
> them?  I am guessing this is using expressibleBy___ to work?

PyVal conforms to all of the ExpressibleBy protocols, so you can use literals 
with it freely.  You need an explicit (failable) conversion from a PyVal to Int 
(and other types that are PythonConvertible), and can use an explicit 
non-failable conversion from Int to PyVal if it is a variable.

The playground has a tutorial page which shows all this in action.

-Chris


> 
> Also, I would still really like to see a different coloring/styling for 
> methods which fall down to this protocol.
> 
> Thanks,
> Jon
> 
> 
> 
>> On Dec 4, 2017, at 7:30 PM, Chris Lattner via swift-evolution 
>> <swift-evolution@swift.org> wrote:
>> 
>>> On Dec 4, 2017, at 5:22 PM, Joe DeCapo via swift-evolution 
>>> <swift-evolution@swift.org> wrote:
>>>> The first one, has no static type info, no compile time checking, it's not 
>>>> self documenting, no type inference so people will be forced to use a 
>>>> dynamic reference at the call site to store the result, leading to more 
>>>> type loss, and all this spirals down.
>>>> I'm already starting to fear dynamic.
>>>> Edit: The danger has passed (Phew!) ... and dynamic wasn't been abused 
>>>> after all, no need to down vote me after 3 years :)
>>> 
>>> From what I can gather, `dynamic` is used when declaring types, but there's 
>>> no indication at call sites that what is being invoked is dynamic. And it 
>>> even allows for casting basically anything to the `dynamic` type.
>>> 
>>> https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/keywords/dynamic
>>> 
>>> So here we have a language community that was (is?) very vocal about 
>>> caution when it comes to type inference with `var`, but seems to have 
>>> accepted the validity of `dynamic`. This seems to show that at least one 
>>> community has absorbed this sort of change (arguably a more "dangerous" 
>>> version than what is being proposed here) with no real issues.
>> 
>> Right.  dynamic in C# is far broader (and more “dangerous”) than what I’m 
>> proposing.  That said, because there have been absolutely zero specific 
>> examples of the sorts of harm DynamicMemberLookup could cause, it is 
>> difficult to speculate about exactly which boogieman people are afraid of.
>> 
>>> So I have a few questions:
>>> 
>>> - Would it be enough to require annotation of the dynamic nature of a type 
>>> at the declaration sites, if that still means the call sites aren't 
>>> explicitly annotated? 
>> 
>> It is impossible to solve a problem if it cannot be explained in enough 
>> detail to provide examples.  Personally, I don’t see the problem at all.
>> 
>>> - Why do some think the Swift community would be more at risk of abuse of 
>>> this feature than the C# community seems to have been? 
>> 
>> 
>> People are making bizarre claims about what the spirit of Swift is, 
>> informing me of things which are obviously not true, and ignoring the 
>> evidence I present to them.  This is doubly humorous given that I have a 
>> fairly good sense for the design balance and tradeoffs of existing features 
>> in Swift today, along with detailed rationale for why they were added, when, 
>> and all of the discussion that backed them.  I chalk this up to the fear of 
>> the unknown or perhaps a mistrust for the peers these people work with.
>> 
>> My goal is to make the design and proposal writeup as good as possible, and 
>> the fear mongering about abuse has led me to add several options for further 
>> narrowing the potential for abuse, including to the point of requiring every 
>> new adoptee to go through the Swift evolution process for review.  During 
>> the review period for DynamicMemberLookup, people who carry these concerns 
>> are welcome to +1 one or more of those.
>> 
>> I personally am far more interested in getting to the bottom of Doug’s 
>> concerns - it isn’t clear to me what exactly his preferred direction 
>> actually is, but that discussion is based on engineering tradeoffs and may 
>> well lead to a change to the proposal or a complete change in direction.
>> 
>> -Chris
>> 
>> _______________________________________________
>> swift-evolution mailing list
>> swift-evolution@swift.org
>> https://lists.swift.org/mailman/listinfo/swift-evolution
> 

_______________________________________________
swift-evolution mailing list
swift-evolution@swift.org
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to