Thread overview
Pushing D's mixin to the limits: Project Euler Problem 61 from Ruby to D by David Oftedal
Jun 12, 2014
Philippe Sigaud
Jun 12, 2014
Rounin
Jun 12, 2014
Dicebot
Jun 13, 2014
Philippe Sigaud
Jun 13, 2014
Jesse Phillips
Jun 13, 2014
Marc Schütz
June 12, 2014
http://rounin.livejournal.com/24639.html

http://www.reddit.com/r/programming/comments/27zjd5/pushing_ds_mixin_to_the_limits_project_euler/

https://www.facebook.com/dlang.org/posts/864930913520591

https://twitter.com/D_Programming/status/477162603140374528


Andrei
June 12, 2014
Drat, I need a livejournal account to post comments? Well, I can at least create a reddit account, I guess...

"In the Ruby version, I was able to add the methods directly to the Integer class, using what's known as monkey patching, allowing me to make calls like3.pentagonal. In D, the methods are global instead, so the call would be pentagonal(3)."

Hmm, 3.pentagonal is valid D code. If that makes it more palatable to Rubyists, that's good news.

There is something I don't get:

"The doublemixins with the method calls also took a while to figure out, after the convenience of eval"

That is:

mixin("mixin(defineMain());");

I don't understand why he's doing that. AFAICT, simply using

mixin(defineMain());

would work perfectly, no? (defineMain and his other functions return strings).
June 12, 2014
Hey there!

Yeah, to expect people to register on LiveJournal in this age of Facebook... Sorry about that; It must have been to deter the spammers.

Thanks for taking the time to comment! Your solution with the single call to mixin() is much more elegant. I made a version 2 which uses it.

The reason I used a double mixin() was that the first thing I tried was mixin("foreach() etc. etc."), which I think may have failed due to the foreach, then mixin("defineMain();"); , which was interpreted as a function declaration, and then I went straight for the mixin("mixin()"); . If it ain't broke, et cetera.

I still think the double mixin() can compete in terms of comedy value, though, don't you think?

Also, thanks for pointing out UFCS. It seems like a very convenient, not to mention SANE alternative to monkey patching, and it'll make it even more seamless to port code that makes use of that mechanism.
June 12, 2014
On Thursday, 12 June 2014 at 20:35:39 UTC, Rounin wrote:
> I still think the double mixin() can compete in terms of comedy value, though, don't you think?

That was actually my initial guess when having a quick look trough the code samples :) "true D programmers mixin their mixins"
June 13, 2014
On Thu, Jun 12, 2014 at 10:35 PM, Rounin via Digitalmars-d-announce <digitalmars-d-announce@puremagic.com> wrote:
> Hey there!

Oh cool, thanks for answering!

> Yeah, to expect people to register on LiveJournal in this age of Facebook... Sorry about that; It must have been to deter the spammers.

Sorry for whining about it. I'm not on Facebook either, I just find it a bit bothersome to have to register every time I want to let a comment. I suppose I'm too used to always commenting in the same places and am leery to getting outside my comfort zones :-)


> Thanks for taking the time to comment! Your solution with the single call to mixin() is much more elegant. I made a version 2 which uses it.
>
> The reason I used a double mixin() was that the first thing I tried was
> mixin("foreach() etc. etc."), which I think may have failed due to the
> foreach, then mixin("defineMain();"); , which was interpreted as a function
> declaration, and then I went straight for the mixin("mixin()"); . If it
> ain't broke, et cetera.
>
> I still think the double mixin() can compete in terms of comedy value,
> though, don't you think?

mixin("..."); pastes the inside code where the mixin is. So there is
no real reason to mix a pure string like mixin("defineMain()"), since
you could directly write it into your code. As for foreach, I guess
it's because foreach is not a declaration and you cannot put it at the
module level:

module foo;

foreach(i; 0..10) {}

is illegal code, I suppose. Mixin or not.

In fact, you'll probably never see

mixin("some predefined code");

what is used is

mixin("some code" ~ some external value ~ "more code");
or
mixin(foo(args));

where foo returns a string.


> Also, thanks for pointing out UFCS. It seems like a very convenient, not to mention SANE alternative to monkey patching, and it'll make it even more seamless to port code that makes use of that mechanism.

Cool! Again, thanks for an interesting article.
June 13, 2014
On Thursday, 12 June 2014 at 20:35:39 UTC, Rounin wrote:
> Hey there!
>
> Yeah, to expect people to register on LiveJournal in this age of Facebook... Sorry about that; It must have been to deter the spammers.

I don't leave comments if it is run through facebook, maybe one day.

There should be settings in LJ to allow anonymous comments. Its what I've done (I also turned off approval since I've had good comments come in and no spam).
June 13, 2014
Another hint:

You should return an `int[2]` from `abc()` instead of `int[]`. It's faster and doesn't require a heap allocation.