digitalmars.D.learn - String Mixins & Compile Time Evaluation
- Travis Boucher (39/39) Nov 16 2009 I've been playing with string mixins, and they are very powerful.
- Don (6/33) Nov 17 2009 I think you're using an old version of DMD. It's been working since
- Travis Boucher (7/41) Nov 16 2009 Yeah, I am running 1.020 with gdc (freebsd default for gdc package). I
- Bill Baxter (9/48) Nov 17 2009 d
- Bill Baxter (9/43) Nov 17 2009 Ah, forgot about that list. Good point.
- Don (2/47) Nov 17 2009 I can't reproduce it. Do you have a complete test case?
- Bill Baxter (9/60) Nov 17 2009 ss
I've been playing with string mixins, and they are very powerful. One thing I can't figure out is what exactly can and cannot be evaluated at compile time. For example: ---- char[] myFunc1() { return "int a = 1;"; } char[] myFunc2() { char[] myFunc3() { return "int b = 2;"; } return myFunc3(); } void main() { mixin(myFunc1()); mixin(myFunc2()); } ---- myFunc1() can be used as a string mixin. myFunc2() can't be. Another (slightly more complex) example is using an ExpressionTuple. ---- template DataGenerator(T, M...) { char[] data() { char[] rv; foreach (m; M) rv ~= T.stringof ~ " " ~ m ~ ";"; return rv; } } alias DataGenerator!(int, "r", "g", "b") ColorRGBgen; writefln(ColorRGBgen.data()); // int R; int G; int B; struct Color { mixin(ColorRGBgen.data()); // Can't evaluate at compile time } ---- I'm sure there are other things that I'll run into, but I figure there is some simple set of rules of what can and can't be used as a string mixin and other compile time evaluations.
Nov 16 2009
Travis Boucher wrote:I've been playing with string mixins, and they are very powerful. One thing I can't figure out is what exactly can and cannot be evaluated at compile time. For example: ---- char[] myFunc1() { return "int a = 1;"; } char[] myFunc2() { char[] myFunc3() { return "int b = 2;"; } return myFunc3(); } void main() { mixin(myFunc1()); mixin(myFunc2()); } ---- myFunc1() can be used as a string mixin. myFunc2() can't be.I think you're using an old version of DMD. It's been working since DMD1.047. Please upgrade to the latest version, you'll find it a lot less frustrating. The bottom of "function.html" in the spec gives the rules. Though it says nested functions aren't supported, but they are.
Nov 17 2009
Don wrote:Travis Boucher wrote:Yeah, I am running 1.020 with gdc (freebsd default for gdc package). I found a few work arounds, just trying to see what can be done. For now I'll take it as a work in progress and once I start doing anything real with it I'll upgrade to the latest version of dmd. Thanks, Travis BoucherI've been playing with string mixins, and they are very powerful. One thing I can't figure out is what exactly can and cannot be evaluated at compile time. For example: ---- char[] myFunc1() { return "int a = 1;"; } char[] myFunc2() { char[] myFunc3() { return "int b = 2;"; } return myFunc3(); } void main() { mixin(myFunc1()); mixin(myFunc2()); } ---- myFunc1() can be used as a string mixin. myFunc2() can't be.I think you're using an old version of DMD. It's been working since DMD1.047. Please upgrade to the latest version, you'll find it a lot less frustrating. The bottom of "function.html" in the spec gives the rules. Though it says nested functions aren't supported, but they are.
Nov 16 2009
On Mon, Nov 16, 2009 at 8:25 PM, Travis Boucher <boucher.travis gmail.com> wrote:Don wrote:dTravis Boucher wrote:I've been playing with string mixins, and they are very powerful. One thing I can't figure out is what exactly can and cannot be evaluate=sat compile time. For example: ---- char[] myFunc1() { =A0 =A0return "int a =3D 1;"; } char[] myFunc2() { =A0 =A0char[] myFunc3() { =A0 =A0 =A0 =A0return "int b =3D 2;"; =A0 =A0} =A0 =A0return myFunc3(); } void main() { =A0 =A0mixin(myFunc1()); =A0 =A0mixin(myFunc2()); } ---- myFunc1() can be used as a string mixin. myFunc2() can't be.I think you're using an old version of DMD. It's been working since DMD1.047. Please upgrade to the latest version, you'll find it a lot les=Ohhhh, well yeh, Don's been smashing CTFE bugs like crazy lately. I think the version you're using doesn't even have the useful error message fix that tells you what can't be CTFE'd. So definitely upgrade before you try to do anything serious with CTFE. --bbfrustrating. The bottom of "function.html" in the spec gives the rules. Though it says nested functions aren't supported, but they are.Yeah, I am running 1.020 with gdc (freebsd default for gdc package). =A0I found a few work arounds, just trying to see what can be done.
Nov 17 2009
On Tue, Nov 17, 2009 at 2:07 AM, Don <nospam nospam.com> wrote:Travis Boucher wrote:Ah, forgot about that list. Good point. But still Travis should know that the list is not exhaustive. For instance the other day I found that this didn't work for some reason: while(i < a - b) { ... } Instead I had to do int limit =3D a-b; while(i < limit) { ... } --bbI've been playing with string mixins, and they are very powerful. One thing I can't figure out is what exactly can and cannot be evaluated at compile time. For example: ---- char[] myFunc1() { =A0 =A0return "int a =3D 1;"; } char[] myFunc2() { =A0 =A0char[] myFunc3() { =A0 =A0 =A0 =A0return "int b =3D 2;"; =A0 =A0} =A0 =A0return myFunc3(); } void main() { =A0 =A0mixin(myFunc1()); =A0 =A0mixin(myFunc2()); } ---- myFunc1() can be used as a string mixin. myFunc2() can't be.I think you're using an old version of DMD. It's been working since DMD1.047. Please upgrade to the latest version, you'll find it a lot less frustrating. The bottom of "function.html" in the spec gives the rules. Though it says nested functions aren't supported, but they are.
Nov 17 2009
Bill Baxter wrote:On Tue, Nov 17, 2009 at 2:07 AM, Don <nospam nospam.com> wrote:I can't reproduce it. Do you have a complete test case?Travis Boucher wrote:Ah, forgot about that list. Good point. But still Travis should know that the list is not exhaustive. For instance the other day I found that this didn't work for some reason: while(i < a - b) { ... } Instead I had to do int limit = a-b; while(i < limit) { ... }I've been playing with string mixins, and they are very powerful. One thing I can't figure out is what exactly can and cannot be evaluated at compile time. For example: ---- char[] myFunc1() { return "int a = 1;"; } char[] myFunc2() { char[] myFunc3() { return "int b = 2;"; } return myFunc3(); } void main() { mixin(myFunc1()); mixin(myFunc2()); } ---- myFunc1() can be used as a string mixin. myFunc2() can't be.I think you're using an old version of DMD. It's been working since DMD1.047. Please upgrade to the latest version, you'll find it a lot less frustrating. The bottom of "function.html" in the spec gives the rules. Though it says nested functions aren't supported, but they are.
Nov 17 2009
On Tue, Nov 17, 2009 at 4:17 AM, Don <nospam nospam.com> wrote:Bill Baxter wrote:edOn Tue, Nov 17, 2009 at 2:07 AM, Don <nospam nospam.com> wrote:Travis Boucher wrote:I've been playing with string mixins, and they are very powerful. One thing I can't figure out is what exactly can and cannot be evaluat=ssat compile time. For example: ---- char[] myFunc1() { =A0 return "int a =3D 1;"; } char[] myFunc2() { =A0 char[] myFunc3() { =A0 =A0 =A0 return "int b =3D 2;"; =A0 } =A0 return myFunc3(); } void main() { =A0 mixin(myFunc1()); =A0 mixin(myFunc2()); } ---- myFunc1() can be used as a string mixin. myFunc2() can't be.I think you're using an old version of DMD. It's been working since DMD1.047. Please upgrade to the latest version, you'll find it a lot le=:frustrating. The bottom of "function.html" in the spec gives the rules. Though it says nested functions aren't supported, but they are.Ah, forgot about that list. =A0Good point. But still Travis should know that the list is not exhaustive. For instance the other day I found that this didn't work for some reason=Doh! Now I can't either. Maybe it was just a typo that I didn't notice. How about C functions? Any chance those'll ever work? Particularly C stdlib functions. They're one of the major things I'm finding prevents std.string functions from being used CTFE. --bb=A0 while(i < a - b) { ... } Instead I had to do =A0 int limit =3D a-b; =A0 while(i < limit) { ... }I can't reproduce it. Do you have a complete test case?
Nov 17 2009
Bill Baxter wrote:On Tue, Nov 17, 2009 at 4:17 AM, Don <nospam nospam.com> wrote:I don't think it could ever work. CTFE needs to have the source available. If we really needed to, a few C stdlib functions could be made into CTFE intrinsics. But in general, no. Some form of if(__ctfe) will happen, though.Bill Baxter wrote:Doh! Now I can't either. Maybe it was just a typo that I didn't notice. How about C functions? Any chance those'll ever work? Particularly C stdlib functions. They're one of the major things I'm finding prevents std.string functions from being used CTFE.On Tue, Nov 17, 2009 at 2:07 AM, Don <nospam nospam.com> wrote:I can't reproduce it. Do you have a complete test case?Travis Boucher wrote:Ah, forgot about that list. Good point. But still Travis should know that the list is not exhaustive. For instance the other day I found that this didn't work for some reason: while(i < a - b) { ... } Instead I had to do int limit = a-b; while(i < limit) { ... }I've been playing with string mixins, and they are very powerful. One thing I can't figure out is what exactly can and cannot be evaluated at compile time. For example: ---- char[] myFunc1() { return "int a = 1;"; } char[] myFunc2() { char[] myFunc3() { return "int b = 2;"; } return myFunc3(); } void main() { mixin(myFunc1()); mixin(myFunc2()); } ---- myFunc1() can be used as a string mixin. myFunc2() can't be.I think you're using an old version of DMD. It's been working since DMD1.047. Please upgrade to the latest version, you'll find it a lot less frustrating. The bottom of "function.html" in the spec gives the rules. Though it says nested functions aren't supported, but they are.
Nov 17 2009
Don wrote:Bill Baxter wrote:What about having compile-time access to dynamic libraries, implemented via dlopen() etc? Basically a compile-time FFI? There's nothing fundamentally unkosher about that, or so it seems to me. It would certainly be a big jaw-dropper feature for a C-like language. LISP has it, right? :) Cheers, KubaOn Tue, Nov 17, 2009 at 4:17 AM, Don <nospam nospam.com> wrote:I don't think it could ever work. CTFE needs to have the source available. If we really needed to, a few C stdlib functions could be made into CTFE intrinsics. But in general, no. Some form of if(__ctfe) will happen, though.Bill Baxter wrote:How about C functions? Any chance those'll ever work? Particularly C stdlib functions. They're one of the major things I'm finding prevents std.string functions from being used CTFE.On Tue, Nov 17, 2009 at 2:07 AM, Don <nospam nospam.com> wrote:Travis Boucher wrote:I've been playing with string mixins, and they are very powerful. One thing I can't figure out is what exactly can and cannot be evaluated at compile time.
Nov 27 2009