digitalmars.D - Suggestion for an Old-keyword
- Kari Salminen (76/76) Oct 06 2004 Hi,
- Sean Kelly (8/12) Oct 06 2004 Yes. It would be nice to have the initial values of function parameters
- Kari Salminen (47/56) Oct 07 2004 I don't know about the performance problems. They're up to the ones who
Hi, I thought I'd bring up a suggestion for an Old-keyword (The idea taken straight from the Eiffel language): - An old-keyword: Some webpages for info on the old-keyword: http://omicron.felk.cvut.cz/FAQ/articles/a511.html and under that "LOLD: What does the 'old' keyword mean?". http://www.comp.ufla.br/~monserrat/eiffel/advanced_introduction/eiffel.html#s7.2.2.1 Old-keyword would be useful for use in postconditions. Here's some info on the Old-expression that I typed in from the the pages 123-125 of the book "Eiffel The Language" by Bertrand Meyer (ISBN 0-13-247925-7): Old expression A special form of expression, the Old expression, is available in routine postconditions only. In a postcondition clause, the expression old exp has the same type as exp; its value at execution time, on routine exit, is the value of exp as evaluated on routine entry in the current call. An example appeared in the postcondition for forth above. Here is another from routine put in class FIXED_QUEUE of the Data Structure Library; the routine inserts an element into a queue: put(V: T) is -- Add item v to queue. require not_full: not full do .. ensure count = old count + 1; (old empty) implies (item = v); not empty; array_item((last-1+capacity) \\ capacity)=v end -- put The first postcondition clause indicates that any call to put increases the queue size, count, by one. The second indicates that if the queue was initially empty (as expressed by old empty), the the value at cursor position (as given by function item) will be the one just inserted. Operator implies is boolean implication. The syntax of an Old expression is simply Old (Symbol = with a triangle on it) old Expression In expressions involving other symbols, the precedence of the old symbol is higher than that of any operator. So the second Assertion_clause of put above could have been written as old empty implies item=v the other parentheses being also optional since = (equality) has a higher precedence than implies (implication). Using extra parentheses does not hurt, of course, and may enhance readability. The validity constraint expresses that a Postcondition is the only permitted context for an Old expression: An Old expression of the form old e, where e is an expression of type TE, is valid if and only if it satisfies the following two conditions: 1) It appears in a Postcondition clause of a Routine r. 2) Transforming r into a function with result type TE (by adding a result type if r is procedure, or changing its result type it is already a function) and replacing its entire Routine part by do Result := e end would yield a valid routine. The second condition indicates that e must be an expression that would be valid in a "do" or "once" body for r, but does not involve any local entities. A more indirect formulation is necessary because r does necessarily have such a body (it could be of the External or Deferred form). The device of making r a function provides us with a suitable syntactical stage for e's guest apperance in the simplified routine. The value of an Old expression old e is defined only at the end of the execution of a call to r, just before the call returns; it is the result that would have been produced by evaluating e just before the call's execution began. ------------------------------------------ Well, what do you think? Would it be useful in the D language? --- Kari Salminen kaasalm NOSPAM at utu dot fi To email me take out the spaces, NOSPAM and replace at with ' ' and dot with '.'
Oct 06 2004
In article <ck1j0e$3mm$1 digitaldaemon.com>, Kari Salminen says...Hi, I thought I'd bring up a suggestion for an Old-keyword (The idea taken straight from the Eiffel language):..Well, what do you think? Would it be useful in the D language?Yes. It would be nice to have the initial values of function parameters available in the out block, though I'm not sure I'd want to take the performance hit if this weren't done intelligently. Also, what if the parameter is a class type? Should the compiler be expected to do a deep copy or will only the reference be the same? Sean
Oct 06 2004
In article <ck1jn7$49m$1 digitaldaemon.com>, Sean Kelly says...In article <ck1j0e$3mm$1 digitaldaemon.com>, Kari Salminen says...I don't know about the performance problems. They're up to the ones who implement the compiler (Of course hopefully there'll be no problems :)). You got me thinking about that deep copy/shallow copy/reference-thing, so let's take an example and let's also assume obj is a reference to an object: a) Old (obj.func) b) (Old obj).func If I understood correctly how the Old-keyword was specified in the Eiffel The Language -book I think that a) should give the value of the obj.func on entry to the function in whose out-block we are writing the a)-clause. And b) should give the value of the func-function in the out-block but using the reference ("pointer") obj on entry to the function in whose out-block we are writing the b)-clause. So I think a) would be about identical to: Before a function's in-part we make a local variable and initialize it using this: old_objfunc = obj.func; And in the out-block we would write old_objfunc; And b) would be about identical to: Before a function's in-part we make a local variable and initialize it using this: old_obj = obj; And in the out-block we would write old_obj.func; So only the reference would be copied here, not the referenced object. Hopefully some of my thoughts can be deciphered from that text above ;-). Also I shamelessly copied the following from the webpage http://omicron.felk.cvut.cz/FAQ/articles/a511.html LOLD: What does the 'old' keyword mean? "The value of an Old expression old e is [...] the result that would have been produced by evaluation e just before the call's execution began." (ETL2, p.125). This is useful in postconditions. When using the keyword with a reference, it is clear from the definition that the value of "old a" will be the object to which 'a' referred at the beginning of the routine, and not the old value of the actual object. Obtaining a copy of 'a', if that is the required semantics, has to be done explicitly: .. old (clone (a)) ... This makes senses because copy and identity are issues with multiple solutions -- a shallow copy as done by 'clone' by default may not be enough for instance -- and a compiler cannot be reasonably expected to guess correctly which interpretation is appropriate for a given usage. --- Kari Salminen kaasalm NOSPAM at utu dot fi To email me take out the spaces, NOSPAM and replace at with ' ' and dot with '.'I thought I'd bring up a suggestion for an Old-keyword Well, what do you think? Would it be useful in the D language?Yes. It would be nice to have the initial values of function parameters available in the out block, though I'm not sure I'd want to take the performance hit if this weren't done intelligently. Also, what if the parameter is a class type? Should the compiler be expected to do a deep copy or will only the reference be the same?
Oct 07 2004