On Tue, May 16, 2017 at 1:47 PM Ben Rimmington <[email protected]> wrote:
> > > On 16 May 2017, at 21:27, Tony Allevato <[email protected]> wrote: > > > >> On Tue, May 16, 2017 at 1:25 PM David Hart <[email protected]> wrote: > >> The problem I see is that + is an operator of the Standard Library and > not part of the core language. I wouldn’t want + to sometimes to be a > runtime operation and other times a compile-time operation. No, I really > think we need strong language support here. > > > > Why not? Compile-time concatenation of string literals delimited by `+` > sounds like a perfectly reasonable compiler optimization. > > > > Your argument would also state that the compiler should not do constant > folding like turning `5 + 7` into `12`, would it not? What makes that > situation different? > > When does the compiler do constant folding? > > Welcome to Apple Swift version 3.1 (swiftlang-802.0.53 > clang-802.0.42). Type :help for assistance. > 1> import Foundation > 2> let x: NSNumber = 12 > x: __NSCFNumber = Int64(12) > 3> let y: NSNumber = 5 + 7 > error: repl.swift:3:21: error: cannot convert value of type 'Int' > to specified type 'NSNumber' > let y: NSNumber = 5 + 7 > ~~^~~ > NSNumber( ) > > -- Ben > $ swiftc -emit-sil - <<EOF let x = 5 + 7 EOF // main sil @main : $@convention(c) (Int32, UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>) -> Int32 { bb0(%0 : $Int32, %1 : $UnsafeMutablePointer<Optional<UnsafeMutablePointer<Int8>>>): alloc_global @_Tv4main1xSi, loc "<stdin>":1:5, scope 1 // id: %2 %3 = global_addr @_Tv4main1xSi : $*Int, loc "<stdin>":1:5, scope 1 // user: %6 * %4 = integer_literal $Builtin.Int64, 12, loc "<stdin>":1:11, scope 1 // user: %5* %5 = struct $Int (%4 : $Builtin.Int64), loc "<stdin>":1:11, scope 1 // user: %6 store %5 to %3 : $*Int, loc "<stdin>":1:11, scope 1 // id: %6 %7 = integer_literal $Builtin.Int32, 0, scope 1 // user: %8 %8 = struct $Int32 (%7 : $Builtin.Int32), scope 1 // user: %9 return %8 : $Int32, scope 1 // id: %9 } // end sil function 'main' The resulting SIL is the run-time vs. compile-time distinction that I was addressing; if someone is concerned about `+` being different for strings, then that SIL shouldn't be allowed either. The results you show for NSNumber are honestly surprising to me, but the intricacies of Obj-C bridging are definitely one of the areas of Swift that I don't understand deeply.
_______________________________________________ swift-evolution mailing list [email protected] https://lists.swift.org/mailman/listinfo/swift-evolution
