digitalmars.D - Request: Implement constant folding for .dup
- Don Clugston (3/3) Feb 19 2007 Since COW is used so much in D, especially with strings, allowing
- Stewart Gordon (3/6) Feb 20 2007 What would the semantics be exactly?
- Don Clugston (9/15) Feb 20 2007 Just create a new const with the same value as the first one -- all
- Stewart Gordon (8/18) Feb 20 2007 So it would behave as though the programmer typed this rather than
- BCS (3/31) Feb 20 2007 Might the issue be that some function would need the .dup at run time bu...
- Frits van Bommel (6/24) Feb 20 2007 I see no problem with allowing this in compile-time functions. However,
- Don Clugston (7/32) Feb 21 2007 Yes, .dup is useless at compile time. But sometimes you have runtime
Since COW is used so much in D, especially with strings, allowing "abc".dup to be constant-folded would greatly increase the amount of existing code which could be used at compile-time.
Feb 19 2007
Don Clugston Wrote:Since COW is used so much in D, especially with strings, allowing "abc".dup to be constant-folded would greatly increase the amount of existing code which could be used at compile-time.What would the semantics be exactly? Stewart.
Feb 20 2007
Stewart Gordon wrote:Don Clugston Wrote:Just create a new const with the same value as the first one -- all compile-time consts have value semantics. ie, char [] a = "xyz"; char [] b = a.dup; would be the same as char [] a = "xyz"; char [] b = "xyz";Since COW is used so much in D, especially with strings, allowing "abc".dup to be constant-folded would greatly increase the amount of existing code which could be used at compile-time.What would the semantics be exactly?
Feb 20 2007
Don Clugston Wrote: <snip>Just create a new const with the same value as the first one -- all compile-time consts have value semantics. ie, char [] a = "xyz"; char [] b = a.dup; would be the same as char [] a = "xyz"; char [] b = "xyz";So it would behave as though the programmer typed this rather than char[] a = "xyz"; char[] b = a; ? There doesn't appear to be any difference. As I try it (both with and without const), the two reference the same copy of the string data either way. But it's probably not defined. OTOH you could try defining .dup to force the new constant/variable to reference a new copy; however, there's an ambiguity or two in this definition. If you're using .dup to define a struct or class member initialiser, should it copy only once, or should every instance of the struct or class contain a new copy? And what about templates? Stewart.
Feb 20 2007
Reply to Stewart,Don Clugston Wrote: <snip>Might the issue be that some function would need the .dup at run time but can otherwise be used at compile time?Just create a new const with the same value as the first one -- all compile-time consts have value semantics. ie, char [] a = "xyz"; char [] b = a.dup; would be the same as char [] a = "xyz"; char [] b = "xyz";So it would behave as though the programmer typed this rather than char[] a = "xyz"; char[] b = a; ? There doesn't appear to be any difference. As I try it (both with and without const), the two reference the same copy of the string data either way. But it's probably not defined. OTOH you could try defining .dup to force the new constant/variable to reference a new copy; however, there's an ambiguity or two in this definition. If you're using .dup to define a struct or class member initialiser, should it copy only once, or should every instance of the struct or class contain a new copy? And what about templates? Stewart.
Feb 20 2007
Don Clugston wrote:Stewart Gordon wrote:I see no problem with allowing this in compile-time functions. However, I can't think of any situation in which this would actually be useful. Since compile-time functions aren't allowed to use non-const arrays, they aren't allowed to modify elements of any arrays they have access to, right? So why would they need .dup?Don Clugston Wrote:Just create a new const with the same value as the first one -- all compile-time consts have value semantics. ie, char [] a = "xyz"; char [] b = a.dup; would be the same as char [] a = "xyz"; char [] b = "xyz";Since COW is used so much in D, especially with strings, allowing "abc".dup to be constant-folded would greatly increase the amount of existing code which could be used at compile-time.What would the semantics be exactly?
Feb 20 2007
Frits van Bommel wrote:Don Clugston wrote:Yes, .dup is useless at compile time. But sometimes you have runtime code that contains things like: char [] s; : return s.dup; With .dup allowable, that existing code can be used at compile time.Stewart Gordon wrote:I see no problem with allowing this in compile-time functions. However, I can't think of any situation in which this would actually be useful. Since compile-time functions aren't allowed to use non-const arrays, they aren't allowed to modify elements of any arrays they have access to, right? So why would they need .dup?Don Clugston Wrote:Just create a new const with the same value as the first one -- all compile-time consts have value semantics. ie, char [] a = "xyz"; char [] b = a.dup; would be the same as char [] a = "xyz"; char [] b = "xyz";Since COW is used so much in D, especially with strings, allowing "abc".dup to be constant-folded would greatly increase the amount of existing code which could be used at compile-time.What would the semantics be exactly?
Feb 21 2007