www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - More on boxer

I think I may have found another problem with boxer/writefln:

import std.stdio: writefln;
import std.boxer: box, Box;
import d.func: putr;

void main() {
  auto a = new Box[1];
  a[0] = box(a);
  writefln(a); // Error: Stack Overflow
  putr(a); // Error: Stack Overflow
}

(I have to fix my str/repr/put/putr still for such situation).
Note that in Python there isn't such bug:

 a = [1, 2]
 a[1] = a
 print a
[1, [...]] --------------------------------- I think cmp among arrays or Box is buggy so if you need it you may use something similar to the following (not much tested still): import std.boxer: Box, boxArray; import std.stdio: writefln; int boxArrayCmp(Box[] ba1, Box[] ba2) { if (ba1.length < ba2.length) { foreach (i, field; ba1) { if (field < ba2[i]) return -1; else if (field > ba2[i]) return 1; } return -1; } else { foreach (i, field; ba2) { if (field < ba1[i]) return 1; else if (field > ba1[i]) return -1; } if (ba1.length == ba2.length) return 0; else return 1; } } void main() { auto b1 = boxArray(10, 20, 15.5); auto b2 = boxArray(10, 20, 15.6); auto b3 = boxArray(10, 20.0, 15.5); auto b4 = boxArray(10, 20.0); writefln(boxArrayCmp(b1, b2), " ", b1 < b2); // -1 false writefln(boxArrayCmp(b2, b1), " ", b2 > b1); // 1 false writefln(boxArrayCmp(b1, b3), " ", b1 == b3); // 0 false writefln(boxArrayCmp(b1, b4), " ", b1 > b4); // 1 true } Bye, bearophile
Apr 17 2008