Thread overview | |||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|
|
April 12, 2017 Dlang Features You Would Like To Share | ||||
---|---|---|---|---|
| ||||
What are some features that you have discovered that you would like to share with the community? For me, one thing I found interesting was the ability to define structures dynamically using mixins: import std.stdio; import std.format: format; template MakePoint(string name, string x, string y) { const char[] MakePoint = "struct %s {int %s; int %s;}".format(name, x, y); } mixin(MakePoint!("Point", "x", "y")); void main() { auto pt = new Point; pt.x = 1; pt.y = 2; writefln("point at (%s, %s)", pt.x, pt.y); } |
April 12, 2017 Re: Dlang Features You Would Like To Share | ||||
---|---|---|---|---|
| ||||
Posted in reply to bluecat | On Wednesday, 12 April 2017 at 21:40:48 UTC, bluecat wrote:
> What are some features that you have discovered that you would like to share with the community? For me, one thing I found interesting was the ability to define structures dynamically using mixins:
>
> import std.stdio;
> import std.format: format;
>
> template MakePoint(string name, string x, string y) {
> const char[] MakePoint = "struct %s {int %s; int %s;}".format(name, x, y);
> }
>
> mixin(MakePoint!("Point", "x", "y"));
>
> void main() {
> auto pt = new Point;
> pt.x = 1;
> pt.y = 2;
> writefln("point at (%s, %s)", pt.x, pt.y);
> }
this one does not need to be a template.
You can build the string using ctfe which is much faster indeed.
|
April 13, 2017 Re: Dlang Features You Would Like To Share | ||||
---|---|---|---|---|
| ||||
Posted in reply to bluecat | On Wednesday, 12 April 2017 at 21:40:48 UTC, bluecat wrote:
> What are some features that you have discovered that you would like to share with the community?
auto use(alias F, T)(T t){return F(t);}
void main()
{ import std.stdio;
foreach(i; 1 .. 11)
{ foreach(j; 1 .. 11) write((i * j).use!(x => x*x), " ");
writeln;
}
}
This way, you can avoid writing long expressions twice with UFCS.
|
April 13, 2017 Re: Dlang Features You Would Like To Share | ||||
---|---|---|---|---|
| ||||
Posted in reply to bluecat | On Wednesday, 12 April 2017 at 21:40:48 UTC, bluecat wrote: > What are some features that you have discovered that you would like to share with the community? For me, one thing I found interesting was the ability to define structures dynamically using mixins: > > import std.stdio; > import std.format: format; > > template MakePoint(string name, string x, string y) { > const char[] MakePoint = "struct %s {int %s; int %s;}".format(name, x, y); > } > > mixin(MakePoint!("Point", "x", "y")); > > void main() { > auto pt = new Point; > pt.x = 1; > pt.y = 2; > writefln("point at (%s, %s)", pt.x, pt.y); > } There are quite a few in https://p0nce.github.io/d-idioms/ and This Week in D: http://arsdnet.net/this-week-in-d/ |
April 13, 2017 Re: Dlang Features You Would Like To Share | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dukc | On Thursday, 13 April 2017 at 05:51:27 UTC, Dukc wrote:
> auto use(alias F, T)(T t){return F(t);}
>
> void main()
> { import std.stdio;
> foreach(i; 1 .. 11)
> { foreach(j; 1 .. 11) write((i * j).use!(x => x*x), " ");
> writeln;
> }
> }
>
> This way, you can avoid writing long expressions twice with UFCS.
If fact you don't need any template to do this. Try the next:
foreach(i; 1 .. 11)
{ foreach(j; 1 .. 11) write((x => x*x)(i * j), " ");
writeln;
}
|
April 13, 2017 Re: Dlang Features You Would Like To Share | ||||
---|---|---|---|---|
| ||||
Posted in reply to bluecat | On Wednesday, 12 April 2017 at 21:40:48 UTC, bluecat wrote: > What are some features that you have discovered that you would like to share with the community? For me, one thing I found interesting was the ability to define structures dynamically using mixins: > > import std.stdio; > import std.format: format; > > template MakePoint(string name, string x, string y) { > const char[] MakePoint = "struct %s {int %s; int %s;}".format(name, x, y); > } > > mixin(MakePoint!("Point", "x", "y")); > > void main() { > auto pt = new Point; > pt.x = 1; > pt.y = 2; > writefln("point at (%s, %s)", pt.x, pt.y); > } I really like the ability to pass delegates as `alias` template arguments. This allows me to pass these delegates as templates, and the "higher-order" template can instantiate them multiple times with multiple types: https://dpaste.dzfl.pl/e2a7a252b5cc |
April 13, 2017 Re: Dlang Features You Would Like To Share | ||||
---|---|---|---|---|
| ||||
Posted in reply to crimaniak | On Thursday, 13 April 2017 at 11:16:46 UTC, crimaniak wrote:
> On Thursday, 13 April 2017 at 05:51:27 UTC, Dukc wrote:
>> auto use(alias F, T)(T t){return F(t);}
>>
>> void main()
>> { import std.stdio;
>> foreach(i; 1 .. 11)
>> { foreach(j; 1 .. 11) write((i * j).use!(x => x*x), " ");
>> writeln;
>> }
>> }
>>
>> This way, you can avoid writing long expressions twice with UFCS.
> If fact you don't need any template to do this. Try the next:
>
> foreach(i; 1 .. 11)
> { foreach(j; 1 .. 11) write((x => x*x)(i * j), " ");
> writeln;
> }
Thats a good one, wrote that down for next time. With that I'll share another one I read about that I thought was really cool:
import std.stdio;
import std.functional: memoize;
ulong fib(ulong n) {
alias mfib = memoize!(fib);
return n < 2 ? 1 : mfib(n-2) + mfib(n-1);
}
void main() {
foreach (x; 1..45) {
writefln("%s", x.fib);
}
}
What this does is make calculating the recursive fibonacci sequence much faster. I don't know too much about the technique, but having it in my optimizations.txt is always a good thing. Now that I think of it, I wonder if there is a page on this website that lists common optimization techniques.
|
April 13, 2017 Re: Dlang Features You Would Like To Share | ||||
---|---|---|---|---|
| ||||
Posted in reply to crimaniak | On Thursday, 13 April 2017 at 11:16:46 UTC, crimaniak wrote:
> If fact you don't need any template to do this. Try the next:
>
> foreach(i; 1 .. 11)
> { foreach(j; 1 .. 11) write((x => x*x)(i * j), " ");
> writeln;
> }
True, that's a good trick too. But I prefer the template at least sometimes because I ususally construct the argument up first and only then start to think about what function to call. With the use template, I can write and read in order I think -Exactly the reason why UFCS rules in my opinion.
|
April 13, 2017 Re: Dlang Features You Would Like To Share | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dukc | On Thursday, 13 April 2017 at 05:51:27 UTC, Dukc wrote:
> auto use(alias F, T)(T t){return F(t);}
>
> void main()
> { import std.stdio;
> foreach(i; 1 .. 11)
> { foreach(j; 1 .. 11) write((i * j).use!(x => x*x), " ");
> writeln;
> }
> }
forgot three letters:
auto use(alias F, T...)(T t){return F(t);}
to make it work with many arguments:
void main()
{ import std.stdio;
foreach(i; 1 .. 11)
{ foreach(j; 1 .. 11) write((i * j).use!((x, y) => x^^y)(2), " ");
writeln;
}
}
|
Copyright © 1999-2021 by the D Language Foundation