March 29, 2012 Re: Issue 3789, stucts equality | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | El 27/03/2012 22:20, Steven Schveighoffer escribió:
> On Mon, 26 Mar 2012 17:25:07 -0400, Alvaro <alvaroDotSegura@gmail.com>
> wrote:
>
>> Maybe it makes more sense that struct==struct applies == to each of
>> its fields. It would be the same as bitwise comparison for simple
>> primitive types, but would be more useful with other types such as
>> strings.
>
> That's exactly what bug 3789 advocates for. Please vote up!
>
> http://d.puremagic.com/issues/show_bug.cgi?id=3789
>
> -Steve
BTW, today I encountered a problem that is probably related to this bug.
if you have a map with BigInt as key, it duplicates keys:
int[BigInt] a;
a[BigInt(3)] = 1;
a[BigInt(3)] = 2;
writeln(a);
prints
[3:2, 3:1]
|
March 29, 2012 Re: Issue 3789, stucts equality | ||||
---|---|---|---|---|
| ||||
Posted in reply to Alvaro | Alvaro: > BTW, today I encountered a problem that is probably related to this bug. > > if you have a map with BigInt as key, it duplicates keys: > > int[BigInt] a; > a[BigInt(3)] = 1; > a[BigInt(3)] = 2; > writeln(a); > > prints > > [3:2, 3:1] Thank you for your example. BigInt usage has several other problems, this is only a partial sample of them: ----------------------------- import std.bigint; void main() { BigInt[10] a; a[0] = 1; // OK a[] = 1; // Error } test.d(5): Error: cannot implicitly convert expression (1) of type int to BigInt[] ----------------------------- import std.bigint; void main() { BigInt b; switch (b) { case BigInt(0): break; default: break; } } test2.d(4): Error: 'b' is not of integral type, it is a BigInt test2.d(5): Error: case must be a string or an integral constant, not BigInt(BigUint([0u]),false) ----------------------------- import std.bigint; struct Count(T) { T n; this(T n_) { this.n = n_; } const bool empty = false; @property T front() { return n; } void popFront() { n++; } // line 7 } void main() { auto co = Count!BigInt(BigInt(0)); foreach (b; co) {} } test2.d(7): Error: var has no effect in expression (__pitmp877) test2.d(10): Error: template instance test.Count!(BigInt) error instantiating ----------------------------- You can't compile this program: import std.stdio, std.bigint; BigInt positiveIntegerPow(in BigInt inBase, in BigInt inExp) pure nothrow in { assert(inBase >= 0 && inExp >= 0); } out(result) { assert(result >= 0); } body { BigInt base = inBase; BigInt exp = inExp; auto result = BigInt(1); while (exp) { if (exp & 1) result *= base; exp >>= 1; base *= base; } return result; } void main() { writeln(positiveIntegerPow(BigInt(5), BigInt(6))); } You have to change it to: import std.stdio, std.bigint; BigInt positiveIntegerPow(in BigInt inBase, in BigInt inExp) in { assert(cast()inBase >= 0 && cast()inExp >= 0); } out(result) { assert(cast()result >= 0); } body { BigInt base = cast()inBase; BigInt exp = cast()inExp; auto result = BigInt(1); while (exp != 0) { if (exp % 2) result *= base; exp >>= 1; base *= base; } return result; } void main() { writeln(positiveIntegerPow(BigInt(5), BigInt(6))); } The problems in that little program are: - You can't assign a const BigInt to a nonconst one. - BigInt operations aren't pure or nothrow - while(exp) is not supported - if if(exp & 1) is not supported - assert(result>=0); where result is const is not supported. Bye, bearophile |
Copyright © 1999-2021 by the D Language Foundation