digitalmars.D - Why I loved D :)
- Kozzi (39/39) Oct 07 2013 In my work we are rewriting some of ours modules from PHP to D.
- Namespace (3/42) Oct 07 2013 That is awesome. I love this features in PHP and miss it in many
- Namespace (35/74) Oct 07 2013 I would prefer something like this:
- Artur Skawina (17/57) Oct 07 2013 Neat. But dangerous. You'll want type safety (ie using the same 'T'
- Meta (3/23) Oct 07 2013 We are so close to a destructuring syntax it hurts. Is there any
- Andrej Mitrovic (2/4) Oct 07 2013 Not without a mixin statement or a mixin expression.
- Meta (4/8) Oct 07 2013 That's something along the lines of what I was thinking. Do you
- Andrei Alexandrescu (4/6) Oct 07 2013 No, we need to add syntax for that. Once it becomes clear that's all we
- Nick Sabalausky (4/7) Oct 07 2013 with()
- Andrej Mitrovic (3/4) Oct 07 2013 That right there is something I would have never thought of. Pretty
- Brad Anderson (6/6) Oct 07 2013 Nice.
- Szymon Gatner (2/6) Oct 08 2013 It is actually a standard now ;)
In my work we are rewriting some of ours modules from PHP to D. And today one of my colleague want to rewrite some of PHP code, where he use list statement. I never use this statement in PHP. So I do not know if there is a some alternative in D phobos. So I try to write my own solution. And it took approximately only one minute and that why I ove D. Because I was able to implement same functionality with same syntax quite fast :). Here is my solution. Yes I know, it is not perfect but it works :P. import std.stdio; struct list { void*[] ptrs; static list opCall(T...)(auto ref T vars) { list ls; foreach(ref var; vars) { ls.ptrs ~= &var; } return ls; } void opAssign(T)(T[] values) { foreach(index, ptr; ptrs) { *(cast(T*)ptr) = values[index]; } } } void main(string[] args) { int a, b, c; list(a, b, c) = [1,2,3]; writeln(a); writeln(b); writeln(c); }
Oct 07 2013
On Monday, 7 October 2013 at 21:04:35 UTC, Kozzi wrote:In my work we are rewriting some of ours modules from PHP to D. And today one of my colleague want to rewrite some of PHP code, where he use list statement. I never use this statement in PHP. So I do not know if there is a some alternative in D phobos. So I try to write my own solution. And it took approximately only one minute and that why I ove D. Because I was able to implement same functionality with same syntax quite fast :). Here is my solution. Yes I know, it is not perfect but it works :P. import std.stdio; struct list { void*[] ptrs; static list opCall(T...)(auto ref T vars) { list ls; foreach(ref var; vars) { ls.ptrs ~= &var; } return ls; } void opAssign(T)(T[] values) { foreach(index, ptr; ptrs) { *(cast(T*)ptr) = values[index]; } } } void main(string[] args) { int a, b, c; list(a, b, c) = [1,2,3]; writeln(a); writeln(b); writeln(c); }That is awesome. I love this features in PHP and miss it in many other languages. :)
Oct 07 2013
On Monday, 7 October 2013 at 21:04:35 UTC, Kozzi wrote:In my work we are rewriting some of ours modules from PHP to D. And today one of my colleague want to rewrite some of PHP code, where he use list statement. I never use this statement in PHP. So I do not know if there is a some alternative in D phobos. So I try to write my own solution. And it took approximately only one minute and that why I ove D. Because I was able to implement same functionality with same syntax quite fast :). Here is my solution. Yes I know, it is not perfect but it works :P. import std.stdio; struct list { void*[] ptrs; static list opCall(T...)(auto ref T vars) { list ls; foreach(ref var; vars) { ls.ptrs ~= &var; } return ls; } void opAssign(T)(T[] values) { foreach(index, ptr; ptrs) { *(cast(T*)ptr) = values[index]; } } } void main(string[] args) { int a, b, c; list(a, b, c) = [1,2,3]; writeln(a); writeln(b); writeln(c); }I would prefer something like this: ---- import std.stdio; struct List(T...) { public: alias Type = T[0]; Type*[] ptrs; void opAssign(Type[] values) { foreach (index, ptr; ptrs) { *ptr = values[index]; } } } List!U list(U = T[0], T...)(auto ref T vars) { List!U tmpList; foreach (ref var; vars) { tmpList.ptrs ~= &var; } return tmpList; } void main(string[] args) { int a, b, c; list(a, b, c) = [1, 2, 3]; writeln(a); writeln(b); writeln(c); } ----
Oct 07 2013
On 10/07/13 23:04, Kozzi wrote:In my work we are rewriting some of ours modules from PHP to D. And today one of my colleague want to rewrite some of PHP code, where he use list statement. I never use this statement in PHP. So I do not know if there is a some alternative in D phobos. So I try to write my own solution. And it took approximately only one minute and that why I ove D. Because I was able to implement same functionality with same syntax quite fast :). Here is my solution. Yes I know, it is not perfect but it works :P. import std.stdio; struct list { void*[] ptrs; static list opCall(T...)(auto ref T vars) { list ls; foreach(ref var; vars) { ls.ptrs ~= &var; } return ls; } void opAssign(T)(T[] values) { foreach(index, ptr; ptrs) { *(cast(T*)ptr) = values[index]; } } } void main(string[] args) { int a, b, c; list(a, b, c) = [1,2,3]; writeln(a); writeln(b); writeln(c); }Neat. But dangerous. You'll want type safety (ie using the same 'T' everywhere) and 'ref' instead of 'auto ref' (the latter will accept rvalues, so you could be taking an address of a local variable and escaping it). Let me try, with a slightly safer version: void list(A...)(typeof([A]) a) property { foreach (I, ref _; A) A[I] = a[I]; } void main(string[] args) { int a, b, c; list!(a, b, c) = [1, 2, 3]; import std.stdio; writeln(a); writeln(b); writeln(c); } SCNR. We need an IODCC. :^) artur
Oct 07 2013
On Monday, 7 October 2013 at 21:56:21 UTC, Artur Skawina wrote:Neat. But dangerous. You'll want type safety (ie using the same 'T' everywhere) and 'ref' instead of 'auto ref' (the latter will accept rvalues, so you could be taking an address of a local variable and escaping it). Let me try, with a slightly safer version: void list(A...)(typeof([A]) a) property { foreach (I, ref _; A) A[I] = a[I]; } void main(string[] args) { int a, b, c; list!(a, b, c) = [1, 2, 3]; import std.stdio; writeln(a); writeln(b); writeln(c); } SCNR. We need an IODCC. :^) arturWe are so close to a destructuring syntax it hurts. Is there any way to insert a, b and c into the current scope automagically?
Oct 07 2013
On 10/8/13, Meta <jared771 gmail.com> wrote:Is there any way to insert a, b and c into the current scope automagically?Not without a mixin statement or a mixin expression.
Oct 07 2013
On Monday, 7 October 2013 at 23:22:04 UTC, Andrej Mitrovic wrote:On 10/8/13, Meta <jared771 gmail.com> wrote:That's something along the lines of what I was thinking. Do you have a specific example you're thinking of, or just a general "yeah, it can probably be done"?Is there any way to insert a, b and c into the current scope automagically?Not without a mixin statement or a mixin expression.
Oct 07 2013
On 10/7/13 4:08 PM, Meta wrote:We are so close to a destructuring syntax it hurts. Is there any way to insert a, b and c into the current scope automagically?No, we need to add syntax for that. Once it becomes clear that's all we need for glommable tuples, we'll add it. Andrei
Oct 07 2013
On Tue, 08 Oct 2013 01:08:42 +0200 "Meta" <jared771 gmail.com> wrote:We are so close to a destructuring syntax it hurts. Is there any way to insert a, b and c into the current scope automagically?with() <g>
Oct 07 2013
On 10/7/13, Artur Skawina <art.08.09 gmail.com> wrote:list(A...)(typeof([A]) a)That right there is something I would have never thought of. Pretty cool that it's allowed.
Oct 07 2013
Nice. C++'s Boost uses the tuple library to accomplish this: int i; char c; double d; tie(i, c, d) = make_tuple(1, 'a', 5.5); Phobos don't have ref item tuples though so it's not quite so simple to do it using this approach in D unfortunately.
Oct 07 2013
On Monday, 7 October 2013 at 23:34:35 UTC, Brad Anderson wrote:Nice. C++'s Boost uses the tuple library to accomplish this: int i; char c; double d; tie(i, c, d) = make_tuple(1, 'a', 5.5);It is actually a standard now ;)
Oct 08 2013