> The review of "SE-0075: Adding a Build Configuration Import Test" begins now 
> and runs through May 16. The proposal is available here:
> 
>       
> https://github.com/apple/swift-evolution/blob/master/proposals/0075-import-test.md
> 
>       * What is your evaluation of the proposal?

+1, I think it's a welcome change that improves modularity between libraries.

>       * Is the problem being addressed significant enough to warrant a change 
> to Swift?

Yes.

There's another real problem that this feature solves which I couldn't see 
mentioned in the proposal: adding protocol conformances to optional 
dependencies. Suppose a library named Frobnication defined a protocol 
`Frobnicatable`, with some known conformances:

    // module Frobnication
    public protocol Frobnicatable {
        mutating func frobnicate()
    }
    extension String : Frobnicatable { ... }
    extension Frob : Frobnicatable { ... }

Now, suppose something in a 3rd party library called Knobs was also clearly 
`Frobnicatable` but `canImport` didn't exist. The community would have to pick 
from the following poorly scaling alternatives:

#1) Either Frobnication would require and import Knobs as its dependency and 
add the conformances,
#2) or vice versa, Knobs would pull Frobnication as its dependency,
#3) or everybody using both libraries would need to define the conformances 
theirselves,
#4) or someone would need to maintain a "KnobsFrobnication" library for the 
sole purpose of defining the said protocol conformances.

* * *

With `canImport`, on the other hand, we get two good options:

#5) Either Frobnication checks `#if canImport(Knobs)` and conditionally adds 
the conformances,
#6) or Knobs checks if it `canImport(Frobnication)` and conditionally adds the 
conformances to any suitable types it defines (which is what any new libraries 
that the author of Frobnication wasn't aware of could do in the future).

* * *

But there remains one issue that there's no clear path for moving conformance 
definitions from one library into the other one day. This proposal could be 
improved by allowing to check for library versions too! If similarly to `#if 
swift(>=2.2)`, we could check `#if canImport(Knobs >= @2.10.0)`, then the 
authors of Knobs and Frobnication could organise an orchestrated move of 
conformance definitions from one library into another. Before the move, Knobs 
2.9.x would have defined:

    // module Knobs 2.9.x
    #if canImport(Frobnication)
    import Frobnication
    extension Knob : Frobnicatable { ... }
    #endif

Preparing for the move, a new version of Frobnication could introduce the 
conformance thusly:

    // module Frobnication 1.7.3
    #if canImport(Knobs >= @2.10.0) // *) see note below
    import Knobs
    extension Knob : Frobnicatable { ... }
    #endif

Then, Knobs could gracefully sunset its conformance definitions beginning from 
the 2.10.0 release:

    // module Knobs 2.10.0
    #if canImport(Frobnication < @1.7.3) // <- Only added version constraint 
here.
    import Frobnication
    extension Knob : Frobnicatable { ... }
    #endif

*) I'm not sold to any specific syntax, but we could e.g. use the `@` prefix to 
distinguish version number literals like `@1`, `@0.10` and `@0.10.0` from 
similar but differently behaving numeric literals.

In any case, even with just `canImport(module)`, we can do a lot better than 
currently.

>       * Does this proposal fit well with the feel and direction of Swift?

Yes.

>       * If you have used other languages or libraries with a similar feature, 
> how do you feel that this proposal compares to those?

Yes, like mentioned in the proposal, it's very similar to the 
`__has_import(<path/to/import.h>)` macro in Clang. I'm not fully familiar with 
the design space in Haskell, but it seems to me instead of using something 
similar to `canImport` Haskellers tend to favour the approach I listed above as 
alternative #4 (e.g. https://github.com/lens/lens-aeson/ 
<https://github.com/lens/lens-aeson/> brings the lens and aeson libraries 
together).

>       * How much effort did you put into your review? A glance, a quick 
> reading, or an in-depth study?

Quick reading.

— Pyry

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

Reply via email to