[swift-evolution] Revisiting 0004 etc. - Swift deprecations

Taras Zakharko taras.zakharko at uzh.ch
Sun Apr 3 01:01:00 CDT 2016

Hi John, 

 there seems to be a fundamental misunderstanding on your part how collection based (for .. in..) loops operate. The enumerable sets you talk about do not need to be created upfront - they can be virtual/lazy (however you want to describe them). So yes, the Swift for … in .. loop has essentially the same semantics as the C-style for(;;) loop — only in Swift this semantics is abstracted behind the Generator/Iterator protocol. Abstracting the semantics of a iterating loop has important advantages in terms of maintainability, compositionally and reusability. Imagine for instance, that you are writing a loop that needs to iterate a sparse matrix. With a for(;;) loop, you need to include complex loop logic into your code. With a for .. in .. loop, you only need a sequence/generator abstraction for the sparse matrix to be implemented once. The loop code itself becomes very simple. Besides, some popular language that are widely used for numerical calculations (Python, R) do not have the for(;;) loop — for a good reason. 

 Besides, I am quite sure that the purpose of Swift is not to appeal to everyone. Its purpose its to make certain things better. Things like for(;;) an unary decrement/increment operators are quite neat, but they ultimately result in less maintainable and comprehensive code. 



> On 03 Apr 2016, at 01:45, John Heerema via swift-evolution <swift-evolution at swift.org> wrote:
> Warning - long post.
> I know that some folks really hate long posts, so let me apologize right
> now for this being a long post. Please feel free to skip right on past it.
> I posted it on a weekend, when there¹s less mailing list traffic, but that
> doesn¹t make it any shorter.
> Warning - revisits two approved deprecations.
> If you really, really hate it when people want to revisit decisions that
> have already been made, please just skip right past this post. My
> apologies for not contributing to the discussion when these decisions were
> originally being made!
> The day that Swift was announced at the WWDC was very
> exciting for me, and I immediately read the Swift book from beginning to
> end.
> Swift quickly became my favourite language: I felt that the Swift language
> developers had created a beautiful language that combined expressiveness
> with
> practicality in a way that made Swift code both powerful and easy to
> understand. Swift was crafted by some very smart and practical people.
> To put my thoughts into perspective, I should mention that
> I¹ve taught Computer Science at a senior University level for years, and
> have
> worked in industry for decades. As a computer scientist, I¹ve had a strong
> interest in computer languages for many years. I became an Apple developer
> upon
> purchasing an Apple Lisa a very long time ago.
> Over the past couple of years though, I¹ve seen what I think
> of as a growing emphasis on strict feature orthagonality at the expense of
> practicality in Swift. Perhaps this because much of the feedback on the
> language has been provided by those of us who are interested in computer
> languages. But for whatever reasons, the Swift language seems to have
> become
> more cluttered and less friendly.
> As I¹ve gone through the various beta releases, I¹ve seen
> changes that detract from the experience of using Swift, for reasons that
> seem
> related to ³language purity².
> I was finally moved to try to express my thoughts after
> seeing a couple of what I think of as particularly inadvisable proposals
> for
> Swift version 3 and beyond.
> Unary increment and decrement operators: ++ and ‹
> The first of these was the now approved removal of Swift¹s
> convenient unary increment and decrement operators. I would agree with
> some of
> the comments that have been made about these operators not being quite
> orthogonal with other expressive elements in the language. Nonetheless,
> they
> are a handy and popular way to iterate over enumerable collections, and to
> increment and decrement a variable that is used for purposes other than
> iteration. They also lend themselves to being extended to other data
> types, such
> as position pointers in linked lists, where they can implement the
> convenient
> concept of ³the next thing² (which += does not provide).
> The desire to get rid of these rather harmless operators
> reminds me of some of Apple¹s own history, and the history of computer
> languages in general. Niklaus Wirth didn¹t care for shortcut operators
> either,
> and so Pascal never got them.
> However, Apple eventually moved away from Pascal to C, even
> though C is in many ways a deeply flawed language that is responsible for a
> wide litany of software errors. Why? I personally really liked Pascal, but
> many
> (most) developers didn¹t care for the language. I¹d argue that developers
> preferred the flexibility of C to what they saw as the overly restricting
> constraints of Pascal.
> One of the surprising reasons that I heard a lot at the
> time, was that developers didn¹t want to lose C¹s shortcut operators. If
> Wirth
> had been willing to give Pascal some of C¹s convenience operators, things
> might
> well have turned out differently. Developers hate typing.
> The notion that there should be exactly one way to do a
> particular thing sounds like dogma to me: not practicality. If people are
> concerned that unary operators confuse beginners, I would encourage them to
> convince educators not to teach them to beginners. Anyway, there are a lot
> of
> things in Swift that can confuse beginners!
> Although it¹s hard for me to believe that having these
> operators return void has been seriously considered, I would argue that
> this
> would be even sillier than removing them. A lot of developers use both C
> (or
> Objective C, C++, C#, Java, etc. etc.) and Swift ­ having those unary
> operators
> act completely differently in Swift would be a great way to alienate those
> developers. 
> Let¹s not forget that  Swift
> is not the lingua franca of the computing world. It¹s an upstart that
> needs to
> attract the development community. Why repel people coming from the various
> C-like languages without a really, really, convincingly good reason? it¹s
> better for an upstart to attract than to repel.
> Right now, there are an awful lot of developers who are used
> to, and like the convenience of unary increment and decrement operators.
> Removing them seems bound to annoy developers and diminish the popularity
> of
> Swift, in exchange for Š well, not very much except for a tiny bit of
> language
> purity. That just seems silly to me.
> C-style For loops
> Removal of C-style For loops has already been approved for a
> future version of Swift. Even though I find the C-style For loop to be a
> bit
> ugly and unintuitive, I believe that removing it was the wrong thing to do.
> It comes down to flexibility and expressiveness. The reality
> is that C-style For loops easily implement certain operations that are more
> difficult to implement without them.
> I¹ve seen comments that C-style For loops are ³hardly ever
> used², and that ³hardly any² algorithms really need them. I believe that
> ³hardly any² is a lazy mental shortcut for ³Well, I don¹t like them, and I
> I
> don¹t use them, so I don¹t think that any anyone who¹s important uses
> them.².
> Yes, there are many cases in which I believe that Swift
> provides looping structures that are safer and easier to understand than
> the
> C-style For loop. I¹d even say most cases. But I work in the scientific and
> engineering domains, and can point to many instances of looping structures
> that
> are easily expressed with a C-style For loop, but are clumsy to implement
> without it.
> In the world of the natural sciences, there are any number
> of instances of loop increments that requires some kind of a calculation.
> There
> are any number of instances of dynamically calculated loop termination.
> Swift¹s stride has some nice features for simple increments,
> but also has some important limitations. Among them, it involves the two
> step
> process of first creating an enumerable set, and then iterating over it.
> In the
> natural sciences, it is not uncommon for complex loop increments to be
> used in
> loops that are executed millions of times.
> Conceptually, creating an enumerable set, and then iterating over it,
> reeks of the arrogance of assuming that computing resources are unlimited.
> Even
> though the compiler may optimize the stride into the loop structure, it
> feels
> like unnecessarily creating a gigantic enumerable set.
> Whether we like it or not, the enduring popularity of the
> C-style For loop comes from it¹s flexibility. Swift doesn¹t have a better
> alternative that also provides the same flexibility. So don¹t take it
> away. If
> you don¹t like it (I don¹t always either), think of something that is
> clearly
> superior in 100% of use cases. Even then, I would argue against removing
> it. 
> I would argue that the C-style For loop implements some
> rather Swift-like concepts. The syntax provide for three closures: one
> each for
> (a) things to do first, (b) things to do when deciding whether to stop
> iterating,  and (c) things to do after each iteration. How is that contrary
> to the principals of Swift?
> Just like pretty much everywhere that Swift allows closures,
> they can be used to write code that is difficult to understand. But the
> syntax
> is general and flexible enough to have survived intact for half a century.
> It¹s the carrot vs. the stick. Developers prefer the carrot.
> The belief that we can force developers to write better code by taking away
> language features, has not historically met with success. Let me say that
> again, because I think it¹s important. Developers who are given a choice
> between C and a ³better² language (say Modula-2, or Swift) are unlikely to
> react favourably to being told ³we¹re taking away this feature of C that
> you
> like, for your own good, because you¹re too stupid to use it sensibly².
> Taking away well-understood expressive language elements, and replacing
> them with something less expressive, is not going to win developers over.
> C-style For loops haven¹t changed in half acentury, because they work.
> A lot of other languages have also adopted them, because they work.
> If I may, I¹d like to take the English language by way of
> analogy. English contains a lot of weird, irregular language elements.
> There¹s
> no single way to express a concept. Instead, there are many, subtly
> different
> ways to express yourself.
> But, for all of its weirdness, English has remained popular
> for centuries, whereas more ³sensible², ³regular² languages like Esperanto
> never caught on. The reasons are flexibility and expressiveness. The same
> thing
> applies to computer languages.
> If we only look inside the world of compilers and computer
> science instruction, to see if we need the flexibility of C-style For
> loops, we
> might mistakenly think that we don¹t. But those domains are relatively
> simple
> in comparison to the physical sciences. Our experience there doesn¹t always
> translate to the more complex world of physical reality. So let¹s not throw
> away convenient and useful language features just because we don¹t
> personally
> care for them.
> Don¹t make Swift Yet Another Interesting Experiment in
> language design that wasn¹t widely adopted, and
> ended up being relegated to the dustbin of history.
> It would make me sad to see the best new computer language
> in ages become just another niche language. We already
> have enough of those.
> So, all of you folks who voted to remove these things, please don¹t hate
> me!
> Regards,
> J. Heerema, Ph.D.
> <default.xml><default[1].xml>_______________________________________________
> swift-evolution mailing list
> swift-evolution at swift.org
> https://lists.swift.org/mailman/listinfo/swift-evolution

More information about the swift-evolution mailing list