www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.announce - Article: the feature that makes D my favorite programming language

reply aberba <karabutaworld gmail.com> writes:
Wrote something on the feature that makes D my favorite 
programming language

https://opensource.com/article/20/7/d-programming
Jul 24
next sibling parent Ernesto Castellotti <erny.castell gmail.com> writes:
On Friday, 24 July 2020 at 20:34:17 UTC, aberba wrote:
 Wrote something on the feature that makes D my favorite 
 programming language

 https://opensource.com/article/20/7/d-programming
An interesting article, excellent job
Jul 24
prev sibling next sibling parent reply Steven Schveighoffer <schveiguy gmail.com> writes:
On 7/24/20 4:34 PM, aberba wrote:
 Wrote something on the feature that makes D my favorite programming 
 language
 
 https://opensource.com/article/20/7/d-programming
Nice! You could make this more dramatic. I'm sure you just "did it automatically", but you used UFCS in your function implementation as well! return numbers.filter!(n => n % 2 == 0).array; Without UFCS, this really should be written: array(filter!(n => n % 2 == 0)(numbers)); If you use that in the first boring non-UFCS version, then I think the wow factor goes up ;) -Steve
Jul 24
parent aberba <karabutaworld gmail.com> writes:
On Friday, 24 July 2020 at 21:18:37 UTC, Steven Schveighoffer 
wrote:
 On 7/24/20 4:34 PM, aberba wrote:
 Wrote something on the feature that makes D my favorite 
 programming language
 
 https://opensource.com/article/20/7/d-programming
Nice! You could make this more dramatic. I'm sure you just "did it automatically", but you used UFCS in your function implementation as well! return numbers.filter!(n => n % 2 == 0).array; Without UFCS, this really should be written: array(filter!(n => n % 2 == 0)(numbers)); If you use that in the first boring non-UFCS version, then I think the wow factor goes up ;)
Someone said something similar in the comments πŸ˜….
 -Steve
Jul 24
prev sibling next sibling parent reply "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
On Fri, Jul 24, 2020 at 08:34:17PM +0000, aberba via Digitalmars-d-announce
wrote:
 Wrote something on the feature that makes D my favorite programming
 language
 
 https://opensource.com/article/20/7/d-programming
Nitpick: evenNumbers doesn't need to return int[]. In fact, dropping the .array makes it even better because it avoids an unnecessary allocation when you're not going to store the array -- writeln is well able to handle printing arbitrary ranges. Let the caller call .array when he wishes the store the array; if it's transient, omitting .array saves an allocation. T -- Nearly all men can stand adversity, but if you want to test a man's character, give him power. -- Abraham Lincoln
Jul 24
parent aberba <karabutaworld gmail.com> writes:
On Friday, 24 July 2020 at 21:19:28 UTC, H. S. Teoh wrote:
 On Fri, Jul 24, 2020 at 08:34:17PM +0000, aberba via 
 Digitalmars-d-announce wrote:
 Wrote something on the feature that makes D my favorite 
 programming language
 
 https://opensource.com/article/20/7/d-programming
Nitpick: evenNumbers doesn't need to return int[]. In fact, dropping the .array makes it even better because it avoids an unnecessary allocation when you're not going to store the array -- writeln is well able to handle printing arbitrary ranges. Let the caller call .array when he wishes the store the array; if it's transient, omitting .array saves an allocation. T
Yeah, you're right.
Jul 24
prev sibling parent reply Andre Pany <andre s-e-a-p.de> writes:
On Friday, 24 July 2020 at 20:34:17 UTC, aberba wrote:
 Wrote something on the feature that makes D my favorite 
 programming language

 https://opensource.com/article/20/7/d-programming
Great article. I assume you didn't chained writeln by purpose, same for import std? ``` import std; int[] evenNumbers(int[] numbers) { return numbers.filter!(n => n % 2 == 0).array; } void main() { [1, 2, 3, 4].evenNumbers.writeln; } ``` Kind regards Andre
Jul 25
parent reply aberba <karabutaworld gmail.com> writes:
On Saturday, 25 July 2020 at 10:22:53 UTC, Andre Pany wrote:
 On Friday, 24 July 2020 at 20:34:17 UTC, aberba wrote:
 Wrote something on the feature that makes D my favorite 
 programming language

 https://opensource.com/article/20/7/d-programming
Great article. I assume you didn't chained writeln by purpose, same for import std? ``` import std; int[] evenNumbers(int[] numbers) { return numbers.filter!(n => n % 2 == 0).array; } void main() { [1, 2, 3, 4].evenNumbers.writeln; } ``` Kind regards Andre
Oop! Chaining the writeln too could have increased the wow factor. I didn't see that.
Jul 25
parent reply Adam D. Ruppe <destructionator gmail.com> writes:
On Saturday, 25 July 2020 at 11:12:16 UTC, aberba wrote:
 Oop! Chaining the writeln too could have increased the wow 
 factor. I didn't see that.
oh I hate it when people do that though, it just looks off to me at that point.
Jul 25
next sibling parent reply aberba <karabutaworld gmail.com> writes:
On Saturday, 25 July 2020 at 13:28:34 UTC, Adam D. Ruppe wrote:
 On Saturday, 25 July 2020 at 11:12:16 UTC, aberba wrote:
 Oop! Chaining the writeln too could have increased the wow 
 factor. I didn't see that.
oh I hate it when people do that though, it just looks off to me at that point.
Ha ha. If you're writing idiomatic D code, why not not all in on it?
Jul 25
next sibling parent reply Jesse Phillips <Jesse.K.Phillips+D gmail.com> writes:
On Saturday, 25 July 2020 at 14:47:01 UTC, aberba wrote:
 On Saturday, 25 July 2020 at 13:28:34 UTC, Adam D. Ruppe wrote:
 On Saturday, 25 July 2020 at 11:12:16 UTC, aberba wrote:
 Oop! Chaining the writeln too could have increased the wow 
 factor. I didn't see that.
oh I hate it when people do that though, it just looks off to me at that point.
Ha ha. If you're writing idiomatic D code, why not not all in on it?
It bugs me too, though I have done it. I think the right answer of why it is odd is because writeln is void. As soon as it is placed on the end the chain is broken and you can't expand on it.
Jul 25
parent reply Paul Backus <snarwin gmail.com> writes:
On Saturday, 25 July 2020 at 18:24:22 UTC, Jesse Phillips wrote:
 On Saturday, 25 July 2020 at 14:47:01 UTC, aberba wrote:
 On Saturday, 25 July 2020 at 13:28:34 UTC, Adam D. Ruppe wrote:
 On Saturday, 25 July 2020 at 11:12:16 UTC, aberba wrote:
 Oop! Chaining the writeln too could have increased the wow 
 factor. I didn't see that.
oh I hate it when people do that though, it just looks off to me at that point.
Ha ha. If you're writing idiomatic D code, why not not all in on it?
It bugs me too, though I have done it. I think the right answer of why it is odd is because writeln is void. As soon as it is placed on the end the chain is broken and you can't expand on it.
This is no different from any other "sink" that consumes a range: someSource .map!foo .filter!bar .splitter(baz) .each!quux; `each` returns void [1], so using it ends the chain. But that's not a problem, because the whole *point* of using `each` is to consume the range. [1] Not exactly, but close enough.
Jul 25
parent aberba <karabutaworld gmail.com> writes:
On Sunday, 26 July 2020 at 01:14:53 UTC, Paul Backus wrote:
 On Saturday, 25 July 2020 at 18:24:22 UTC, Jesse Phillips wrote:
 On Saturday, 25 July 2020 at 14:47:01 UTC, aberba wrote:
 [...]
It bugs me too, though I have done it. I think the right answer of why it is odd is because writeln is void. As soon as it is placed on the end the chain is broken and you can't expand on it.
This is no different from any other "sink" that consumes a range: someSource .map!foo .filter!bar .splitter(baz) .each!quux; `each` returns void [1], so using it ends the chain. But that's not a problem, because the whole *point* of using `each` is to consume the range. [1] Not exactly, but close enough.
I believe one can use tee!(writeln) to avoid consuming the range.
Jul 26
prev sibling parent =?UTF-8?Q?Ali_=c3=87ehreli?= <acehreli yahoo.com> writes:
On 7/25/20 7:47 AM, aberba wrote:
 On Saturday, 25 July 2020 at 13:28:34 UTC, Adam D. Ruppe wrote:
 oh I hate it when people do that though, it just looks off to me at
 that point.
Ha ha. If you're writing idiomatic D code, why not not all in on it?
I agree with Adam and others on this. My reasoning is, writeln's first parameter is not special compared to its other parameters. In other words, I can't see writeln as a special operation on its first argument. Except, when there is just one thing... Meh... I don't like it. :) Ali
Jul 25
prev sibling next sibling parent reply "H. S. Teoh" <hsteoh quickfur.ath.cx> writes:
On Sat, Jul 25, 2020 at 01:28:34PM +0000, Adam D. Ruppe via
Digitalmars-d-announce wrote:
 On Saturday, 25 July 2020 at 11:12:16 UTC, aberba wrote:
 Oop! Chaining the writeln too could have increased the wow factor. I
 didn't see that.
oh I hate it when people do that though, it just looks off to me at that point.
Me too. It gives me the same creepie-feelies as when people write writeln(x) as: writeln = x; Actually, D's lax syntax surrounding the = operator gives rise to the following reverse-UFCS nastiness: // Cover your eyes (unless you're reverse-Polish :-P)! and don't // do this at home, it will corrupt your sense of good coding // style! import std; void main() { writeln = filter!(x => x % 3 == 1) = map!(x => x*2) = [ 1, 2, 3, 4, 5, 6 ]; } // Output: [4, 10] T -- Winners never quit, quitters never win. But those who never quit AND never win are idiots.
Jul 25
parent Aliak <something something.com> writes:
On Saturday, 25 July 2020 at 16:22:52 UTC, H. S. Teoh wrote:
 On Sat, Jul 25, 2020 at 01:28:34PM +0000, Adam D. Ruppe via 
 Digitalmars-d-announce wrote:
 On Saturday, 25 July 2020 at 11:12:16 UTC, aberba wrote:
 Oop! Chaining the writeln too could have increased the wow 
 factor. I didn't see that.
oh I hate it when people do that though, it just looks off to me at that point.
Me too. It gives me the same creepie-feelies as when people write writeln(x) as: writeln = x; Actually, D's lax syntax surrounding the = operator gives rise to the following reverse-UFCS nastiness: // Cover your eyes (unless you're reverse-Polish :-P)! and don't // do this at home, it will corrupt your sense of good coding // style! import std; void main() { writeln = filter!(x => x % 3 == 1) = map!(x => x*2) = [ 1, 2, 3, 4, 5, 6 ]; } // Output: [4, 10] T
Oh my god ... it’s like haskells $ πŸ€” Why is this allowed? I mean, ok, it was probably done to allow property syntax. But how did this end up being applied to every function? Can this be fixed?
Jul 26
prev sibling parent guai <guai fake.mail> writes:
I find something like writable.writeTo(stdout) nicer
Jul 26