> On Mar 25, 2016, at 3:25 AM, Carlos Rodríguez Domínguez via swift-evolution 
> <[email protected]> wrote:
> 
> (Please, take a look at the proposal named "[swift-evolution] Promote 
> "primitive" types to enums in extensions” in order to understand the 
> intention of my proposal as a whole)
> 
> This proposal intends to allow developers to rewrite func signatures to 
> better adapt certain imported C functions to swift. For instance, the 
> function to create a POSIX socket has a C signature like this:
> 
> int socket(int domain, int type, int protocol);
> 
> In swift, it is currently imported like this:
> 
> func socket(_: Int32, _: Int32, _: Int32) -> Int32
> 
> However, by documentation, the first parameter should be one of a set of 
> constants beginning with PF_. The second one should be either SOCK_STREAM, 
> SOCK_DGRAM or SOCK_RAW. The third one should be a constant specifying the 
> protocol to use. Finally, the result could be either -1 (to indicate an 
> error) or another integer to indicate that a socket descriptor has been 
> returned.
> 
> As you can observe, that old-style signature is highly error prone, does not 
> comply with swift guidelines, it is difficult to understand, etc. My opinion 
> is that there should be some syntax to rewrite the signature to avoid those 
> issues. For instance, a possible syntax could be:
> 
> #mapsignature(socket(_:,_:,_:)->Int32)
> func socket(domain:SocketDomain, type:SocketType, protocol:SocketProtocol) -> 
> socket_t? {
>       let result = socket(domain.rawValue, type.rawValue, protocol.rawValue)
>       if result == -1 {
>               return nil
>       }
>       else{
>               return result
>       }
> }
> 
> Note that the compiler should enforce a function call to the original 
> function that we are rewriting.
> 
> After a rewriting has happened, three options may be considered: either to 
> allow the original function to be called, to avoid the original function to 
> be called (through a compiler error with a fix-it) or to emit a warning, 
> advising the developer to adopt the rewritten signature.
> 
> Anyhow, this proposal should allow a greatly increased interoperability 
> between old style code and swift, which, in my opinion, is quite “forced” 
> right now.

FWIW, there have been a number of proposals in roughly this space, using 
annotations in the C headers to improve the mapping into Swift, including

        Import as member: 
https://github.com/apple/swift-evolution/blob/master/proposals/0044-import-as-member.md
        Import Objective-C constants as Swift types: 
https://github.com/apple/swift-evolution/blob/master/proposals/0033-import-objc-constants.md
        Better translation of Objective-C APIs into Swift (the swift_name 
attribute part, at least): 
https://github.com/apple/swift-evolution/blob/master/proposals/0005-objective-c-name-translation.md

        - Doug


_______________________________________________
swift-evolution mailing list
[email protected]
https://lists.swift.org/mailman/listinfo/swift-evolution

Reply via email to