> 6 Dec. 2017 04:13 Thorsten Seitz <tseit...@icloud.com> wrote: > > I just wanted to add that the single purpose of a static type system is to > ensure that the methods being called on a receiver are present at runtime and > take arguments of the types known at compile time. Of course the type system > does not guarantee that those calls to not fail. Even in Haskell there is no > guarantee that a function call does not fail as it allows partial patterns > (therefore `head []` crashes). Or a function call might enter an infinite > loop. But, to repeat, the type system guarantees that the method or member > itself will be present. > > Therefore I cannot follow the argument that it follows from the possible > failure of a Swift method or member access that it is ok or even a comparable > type of failure if the method or member itself is not present. This would > imply that Swift’s static type system is unnecessary. Why check for the > presence of a method or member if calling it or accessing it might fail > anyway? No, I do not buy that argument. And I do not think that I have to > provide examples where a static type system is of help.
SOURCE MUSIC: "Soothe me" Program crashes. PROGRAMMER What? What did I do? RUNTIME You failed to call a method correctly. PROGRAMMER The method was present, sir. By your reasoning, this code would be ok: class Example { var a: Int { return values["a"]! } var b: Int { return values["b"]! } var c: Int { return values["c"]! } var d: Int { return values["d"]! } … } (which I believe is more or less equivalent to what has been suggested by some, but by enumerating all the dynamic members that seem to exist) but not class Example: DynamicMemberLookupProtocol { subscript(dynamicMember: String) -> Int { return values[dynamicMember]! } } > The remaining question therefore is whether it is ok to remove the static > type system for certain isolated use cases and that might be the case. But I > like others would prefer if those use cases would be isolated somehow > visually. Someone proposed to require `dynamic` before expressions containing > dynamic member lookups similar to `try`, with the additional option to > enclose a whole block into `dynamic { … }` to express the same as prefixing > each expression with `dynamic`. I still think this has merit: > > ```` > let result = dynamic x.foo.bar // will crash if foo or bar are not present > > let result = dynamic? x.foo.bar // will return nil if foo or bar are not > present > > // will crash if foo or bar are not present > let result = dynamic { > let y = x.foo.bar > let z = y.baz(42) > return z.zork() > } > > // will return nil if foo or bar are not present > let result = dynamic? { > let y = x.foo.bar > let z = y.baz(42) > return z.zork() > } > ```` Which is already possible with the proposal, using the existing "throw" mechanism in Swift. /Magnus _______________________________________________ swift-evolution mailing list swift-evolution@swift.org https://lists.swift.org/mailman/listinfo/swift-evolution