November 29, 2002 contracts bug | ||||
---|---|---|---|---|
| ||||
Hi, Is this code valid? int[] fun(int i) in { assert(i > 0); } out (result) { assert(result.length == 10); } body { int[] res = new int[10]; res[] = i; int isZero = (result[0] == 0); printf("Is first item zero? %.*s\r\n", cast(char[]) (isZero ? "true" : "false")); result[0] = 0; return res; } int main() { int[] values = fun(2); return 0; } I think it should not be, unless result (declared in out section) function as an implicit variable, like Eiffel defines the Result implicit variable. This code compiles and run (dmd 0.50). Statement 'int isZero = (result[0] == 0);' executes fine, but 'result[0] = 0;' raises an 'Access Violation'. Implicit result variable looks like a good idea, but is terrible when the language provides closures. The following code demonstrates this: template TCollection(T) { class Collection { ... boolean all(boolean (*predicate)(T)) { ... } ... } Collection copyFrom(Collection other) out (result) { assert(result.length == other.length); assert(result !== other); // if result is an implicit variable, the result used in the // closure represents the closure result, not the copyFrom result assert(other.all(fun(item) {return (item in result);}); } body { ... } Best regards, Daniel Yokomiso. "Those are my principles. If you don't like them I have others." - Groucho Marx |
December 03, 2002 Re: contracts bug | ||||
---|---|---|---|---|
| ||||
Posted in reply to Daniel Yokomiso | "Daniel Yokomiso" <daniel_yokomiso@yahoo.com.br> wrote in message news:as6i38$1f3e$1@digitaldaemon.com... > Hi, > > Is this code valid? Yes. result is declared implicitly. |
Copyright © 1999-2021 by the D Language Foundation