3 ms·
Yes, thank you, your code example is much better than mine. The simplifying potential of expression-oriented languages is huge. Alan Perlis said[0]: "symmetry
by zetalyrae 5y ago
Yes, thank you, your code example is much better than mine.
The simplifying potential of expression-oriented languages is huge. Alan Perlis said[0]: "symmetry is a complexity-reducing concept; seek it everywhere", and this is a great example of that.
For example, languages like C and Ada have both if statements and if expressions, this is a duplication that can be eliminated by making them expression-oriented so you only have an if expression like in Haskell or ML.
But, interestingly, there is one historical case of a language going from expression-oriented to statement/expression separation: ALGOL-W[1] was expression oriented, Pascal[2], its successor, separates statements from expressions. Wirth designed both.
I don't know what the motivation was, but I suspect it's because Pascal was designed to be an educational language, and Wirth must have thought that separating expressions and statements made didactic sense when teaching programming as a recipe or list of things to do, as opposed to the more mathematized formulation of expression-oriented languages (of having an evaluation function from expressions to values).
The successors of Pascal (Ada, Modula and its sequels) retain the statement/expression separation.
[0]: http://pu.inf.uni-tuebingen.de/users/klaeren/epigrams.html http://pu.inf.uni-tuebingen.de/users/klaeren/epigrams.html
[1]: https://en.wikipedia.org/wiki/ALGOL_W https://en.wikipedia.org/wiki/ALGOL_W
[2]: https://en.wikipedia.org/wiki/Pascal_(programming_language) https://en.wikipedia.org/wiki/Pascal_(programming_language)
- tangus 5y agoI can't say for sure, but I suspect it was a reaction to ALGOL-68. Creators of later Algolish languages usually made a point of rejecting features of Algol-68 they saw as prone to abuse. And the block expressions in Algol-68 were certainly used and abused. Basically, the type and value of a block (BEGIN ... END or ( ... )) are those of its last expression, so you can put them anywhere. For example, Algol-68 has the looping construct WHILE <condition> DO <body> OD, but not C's `do <body> while (<condition>)`. So what do you do if you want to have the test at the end of the loop body? Simply WHILE ( <body>; <condition> ) DO SKIP OD I guess you'd get used to those idioms eventually, or some coding conventions would have arisen if the language had been successful. But I can understand language creators looking at that and seeing how getting rid of it simplifies not only their compilers but also the programs written in their languages.
- Wildgoose 5y agoWhat is wrong with simply: test := True; WHILE test DO <body>; test = <condition> OD
- chalst 5y agoThat introduces a variable that has to be initialised outside the control block. It's not terrible as hacks go, but I guess the readability cost of the additional variable is higher than having the body in the condition.
- tangus 5y agoNothing is wrong with it, but your suggestion comes 40 years too late. The popular idiom was the one I mentioned.