On Tuesday, 23 July 2013 at 20:11:21 UTC, JS wrote:
Your code doesn't exactly do what I wanted but probably because I wasn't clear... I think it is modifiable and solves the problem I was having(again, assuming your code is correct).

Note though that something like

string x = "asd"
join(x,...); // x is compile time known and should be joined at compile time. Not sure if D is smart enough to get this one?

When I get some time later I'll check your code out, what I want to do is get something like

string x = join(a, b, "a", "b"); to produce the same code as
string x = a~b~"ab";

(no looping using for each except for string arrays)

Thanks!


Don't forget that tuples can store more than just types! See this for instance.

  import std.stdio;

  typeof(Xs[0]) sum(Xs...)()
  {
      pragma(msg, Xs); // tuple(1, 2, 3)
      typeof(Xs[0]) y;
      foreach(x; Xs) y ~= x;
      return y;
  }

  int main() {
      auto n = sum!(1, 2, 3);
      enum m = sum!(1, 2, 3);

      pragma(msg, typeof(n)); // int
      writeln(n); // 6
      writeln(m); // 6

      return 0;
  }

Works great. When I comment out the 'sum!("1", "2", "3")' and replace it with a literal '6', the compiled EXE is byte for byte exactly the same. You can exchange the '+=' for '~=' and it will concatenate strings instead. Of course, now all arguments MUST be known at compile time, but that's no surprise.

PS: OK, just noticed that you were hoping to mix run time and compile time arguments. Oops....
Oh well, posting anyway because I think it's neat. lol

As for a~"B"~"C" compiling into a~"BC", I think we just need to work on constant folding in the compiler. (If it doesn't already do this anyway.)

Reply via email to