From 051ba553db96a7884273f9383695eb552b07880c Mon Sep 17 00:00:00 2001 From: halw Date: Fri, 27 Mar 2009 20:47:18 +0000 Subject: [PATCH] Author:halw Date:2009-03-27T20:47:18.000000Z git-svn-id: https://svn.eiffel.com/eiffel-org/trunk@211 abb3cda0-5349-4a8f-a601-0c33ac3a8c38 --- .../current/method/_images/VGCC_error.png | Bin 0 -> 22575 bytes .../method/_images/VGCC_error.png.data | 3 ++ .../method/eiffel-tutorial-et/et-agents.wiki | 12 +++--- .../et-dynamic-structure-execution-model.wiki | 16 +++---- .../eiffel-tutorial-et/et-inheritance.wiki | 17 +++++--- .../et-other-mechanisms.wiki | 40 +++++++++--------- 6 files changed, 49 insertions(+), 39 deletions(-) create mode 100644 documentation/current/method/_images/VGCC_error.png create mode 100644 documentation/current/method/_images/VGCC_error.png.data diff --git a/documentation/current/method/_images/VGCC_error.png b/documentation/current/method/_images/VGCC_error.png new file mode 100644 index 0000000000000000000000000000000000000000..4acfde61ee25f028f2f611ced081cbd3202baeb2 GIT binary patch literal 22575 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 is the name of a routine of the enclosing class. This is an your_icon.click_actions.extend (agent your_routine) -This adds to the end of my_icon.click_actions -- the list of agents associated with the "click" event for my_icon, denoting an icon in the application's user interface -- an agent representing your_routine. Then when a user clicks on the associated icon at execution, the EiffelVision 2 mechanisms will call the procedure call on every agent of the list, which for this agent will execute your_routine. This is a simple way to associate elements of your application, more precisely its "business model" (the processing that you have defined, directly connected to the application's business domain), with elements of its GUI. +This adds to the end of your_icon.click_actions -- the list of agents associated with the "click" event for your_icon, denoting an icon in the application's user interface -- an agent representing your_routine. Then when a user clicks on the associated icon at execution, the EiffelVision 2 mechanisms will call the procedure call on every agent of the list, which for this agent will execute your_routine. This is a simple way to associate elements of your application, more precisely its "business model" (the processing that you have defined, directly connected to the application's business domain), with elements of its GUI. Similarly although in a completely different area, you may request the integration of a function your_function over the interval 0..1 through a call such as @@ -50,7 +50,7 @@ An agent agent r built from a procedure r Among the features of ROUTINE and its descendants the most important are call, already noted, which calls the associated routine, and item, appearing only in FUNCTION and yielding the result of the associated function, which it obtains by calling call. -As an example of using these mechanisms, here is how the function integral could look like in our INTEGRATOR example class. The details of the integration algorithm (straight forward, and making no claims to numerical sophistication) do not matter, but you see, in the highlighted line, the place were we evaluate the mathematical function associated with f, by calling item on f: +As an example of using these mechanisms, here is how the function integral could look like in our INTEGRATOR example class. The details of the integration algorithm (straight forward, and making no claims to numerical sophistication) do not matter, but you see the place were we evaluate the mathematical function associated with f, by calling item on f: integral (f: FUNCTION [ANY, TUPLE [REAL], REAL]; low, high: REAL): REAL -- Integral of `f' over the interval [`low', `high'] @@ -69,7 +69,7 @@ As an example of using these mechanisms, here is how the function integral until x > high loop - Result := Result + step * f.item ([x]) + Result := Result + step * f.item ([x]) -- Here item is applied to f x := x + step end end @@ -80,7 +80,7 @@ Function integral takes three arguments: the agent f r Result := Result + step * f.item ([x]) -we don't directly pass x to item; instead, we pass a one-element tuple [x], using the syntax for manifest tuples introduced in [[10 Other Mechanisms#Tuple_types|"Tuple types"]] . You will always use tuples for the argument to call and item, because these features must be applicable to any routine, and so cannot rely on a fixed number of arguments. Instead they take a single tuple intended to contain all the arguments. This property is reflected in the type of the second actual generic parameter to f, corresponding to ARGS (the formal generic parameter of FUNCTION): here it's TUPLE [REAL] to require an argument such as [ x], where x is of type REAL. +we don't directly pass x to item; instead, we pass a one-element tuple [x], using the syntax for manifest tuples introduced in [[10 Other Mechanisms#Tuple_types|"Tuple types"]] . You will always use tuples for the argument to call and item, because these features must be applicable to any routine, and so cannot rely on a fixed number of arguments. Instead they take a single tuple intended to contain all the arguments. This property is reflected in the type of the second actual generic parameter to f, corresponding to ARGS (the formal generic parameter of FUNCTION): here it's TUPLE [REAL] to require an argument such as [x], where x is of type REAL. Similarly, consider the agent that the call seen above: @@ -179,7 +179,7 @@ even though the two procedures used in the agents have quite different forms. We end -so that it doesn't take an argument: it is normally called on its target, as in my_account.deposit_one_grand. In contrast, the other routine has an argument: +so that it doesn't take an argument: it is normally called on its target, as in your_account.deposit_one_grand. In contrast, the other routine has an argument: add_to_n (x: INTEGER) -- Add `x' to the value of `total'. @@ -196,5 +196,7 @@ where total is an integer attribute of the enclosing class. Without Agents provide a welcome complement to the other mechanisms of Eiffel. They do not conflict with them but, when appropriate -- as in the examples sketched in this section -- provide clear and expressive programming schemes, superior to the alternatives. +{{SeeAlso|[[Event Programming with Agents]] }} + diff --git a/documentation/current/method/eiffel-tutorial-et/et-dynamic-structure-execution-model.wiki b/documentation/current/method/eiffel-tutorial-et/et-dynamic-structure-execution-model.wiki index 7ca6f5fc..5933150a 100644 --- a/documentation/current/method/eiffel-tutorial-et/et-dynamic-structure-execution-model.wiki +++ b/documentation/current/method/eiffel-tutorial-et/et-dynamic-structure-execution-model.wiki @@ -277,7 +277,7 @@ meaning that, at the time of each call, the value of each formal will be set to In the routine body, it is not permitted to change the value of a formal argument, although it is possible to change the value of an attached object through a procedure call such as formal_1.some_procedure ( ... ) . -==Infix and prefix notation== +==Infix and prefix notations== Basic types such as INTEGER are, as noted, full-status citizens of Eiffel's type system, and so are declared as classes (part of the Kernel Library). INTEGER, for example, is characterized by the features describing integer operations: plus, minus, times, division, less than, and so on. @@ -288,22 +288,22 @@ With the dot notation seen so far, this would imply that simple arithmetic opera instead of the usual i + j - - -This would be awkward. Infix and prefix features solve the problem, reconciling the object-oriented view of computation with common notational practices of mathematics. The addition function is declared in class INTEGER as +This would be awkward. Infix and prefix notations solve the problem, reconciling the object-oriented view of computation with common notational practices of mathematics. The addition function is declared in class INTEGER as - infix "+" (other: INTEGER): INTEGER + plus alias "+" (other: INTEGER): INTEGER do ... end -Such a feature has all the properties and prerogatives of a normal "identifier" feature, except for the form of the calls, which is infix, as in i + j , rather than using dot notation. An infix feature must be a function, and take exactly one argument. Similarly, a function can be declared as prefix "-" , with no argument, permitting calls of the form -3 rather than (3).negated . +Such a feature has all the properties and prerogatives of both normal "identifier-dot" notation and infix notation. This allowing invoking plus using either notation: i.plus (j) or i + j . A feature such as plus allowing infix notation must be a function, and take exactly one argument. + +Prefix notation is allowed as well. A function can be declared as opposite alias "-" , with no argument, permitting calls of the form -3 rather than (3).opposite . Predefined library classes covering basic types such as INTEGER, CHARACTER, BOOLEAN, REAL, DOUBLE are known to the Eiffel compiler, so that a call of the form j + i, although conceptually equivalent to a routine call, can be processed just as efficiently as the corresponding arithmetic expression in an ordinary programming language. This brings the best of both worlds: conceptual simplicity, enabling Eiffel developers, when they want to, to think of integers and the like as objects; and efficiency as good as in lower-level approaches. -Infix and prefix features are available to any class, not just the basic types' predefined classes. For example a graphics class could use the name infix "|-|" for a function computing the distance between two points, to be used in expressions such as +Infix and prefix notations are available to any class, not just the basic types' predefined classes. For example a graphics class could use the name distance alias "|-|" for a function computing the distance between two points, to be used in expressions such as point1 |-| point2 @@ -354,7 +354,7 @@ expanded class feature -- Basic operations - infix "+" (other: INTEGER): INTEGER + plus alias "+" (other: INTEGER): INTEGER do ... end diff --git a/documentation/current/method/eiffel-tutorial-et/et-inheritance.wiki b/documentation/current/method/eiffel-tutorial-et/et-inheritance.wiki index 30b6922b..703773c3 100644 --- a/documentation/current/method/eiffel-tutorial-et/et-inheritance.wiki +++ b/documentation/current/method/eiffel-tutorial-et/et-inheritance.wiki @@ -467,7 +467,12 @@ where the postcondition of some routine q implies the precondition The rule, then, is that for the redefinition to be correct the new precondition ''pre' ''must be weaker than or equal to the original ''pre'', and the new postcondition ''post' ''must be stronger than or equal to the original ''post''. -Because it is impossible to check simply that an assertion is weaker or stronger than another, the language rule relies on different forms of the assertion constructs, require else and ensure then, for redeclared routines. They rely on the mathematical property that, for any assertions p and q, p implies (p or q), and (p and q) implies p. For a precondition, using require else with a new assertion will perform an or, which can only weaken the original; for a postcondition, ensure then will perform an and, which can only strengthen the original. Hence the rule: +Because it is impossible to check simply that an assertion is weaker or stronger than another, the language rule relies on different forms of the assertion constructs, require else and ensure then, for redeclared routines. They rely on the mathematical property that for any assertions p and q, the following are true: + + 1) p implies (p or q) + 2) (p and q) implies p + +For a precondition, using require else with a new assertion will perform an or, which can only weaken the original; for a postcondition, ensure then will perform an and, which can only strengthen the original. Hence the rule: {{rule|name=Assertion Redeclaration|text=In the redeclared version of a routine, it is not permitted to use a require or ensure clause. Instead you may: Introduce a new condition with require else, for or-ing with the original precondition. Introduce a new condition with ensure then, for and-ing with the original postcondition. In the absence of such a clause, the original assertions are retained. }} @@ -521,7 +526,7 @@ More generally, it is permitted to have any number of deferred features and at m All this is not a violation of the Final Name rule (defined in [[9 Inheritance#Multiple_inheritance_and_renaming|"Multiple inheritance and renaming"]] ), since the name clashes prohibited by the rule involve two different features having the same final name; here the result is just one feature, resulting from the join of all the inherited versions. -Sometimes we may want to join ''effective'' features inherited from different parents, assuming again the features have compatible signatures. One way is to redefine them all into a new version; then they again become one feature, with no name clash in the sense of the Final Name rule. But in other cases we may simply want one of the inherited implementations to take over the others. The solution is to revert to the preceding case by '''uneffecting''' the other features; uneffecting an inherited effective feature makes it deferred (this is the reverse of effecting, which turns an inherited deferred feature into an effective one). The syntax uses the undefine subclause: +Sometimes we may want to join ''effective'' features inherited from different parents, assuming again the features have compatible signatures. One way is to redefine them all into a new version. That is, list each in a redefine clause, then write a redefined version of the feature. In this case, they again become one feature, with no name clash in the sense of the Final Name rule. But in other cases we may simply want one of the inherited implementations to take over the others. The solution is to revert to the preceding case by '''uneffecting''' the other features; uneffecting an inherited effective feature makes it deferred (this is the reverse of effecting, which turns an inherited deferred feature into an effective one). The syntax uses the undefine subclause: class D @@ -595,7 +600,7 @@ Thanks to inheritance, a concise class text may achieve a lot, relying on all th This is part of the power of the object-oriented form of reuse, but can create a comprehension and documentation problem when the inheritance structures become deep: how does one understand such a class, either as client author or as maintainer? For clients, the Contract Form, entirely deduced from the class text, does not tell the full story about available features; and maintainers must look to proper ancestors for much of the relevant information. -These observations suggest ways to produce, from a class text, a version that is equivalent feature-wise and assertion-wise, but has no inheritance dependency. This is called the '''Flat Form''' of the class. It is a class text that has no inheritance clause and includes all the features of the class, immediate (declared in the class itself) as well as inherited. For the inherited features, the flat form must of course take account of all the feature adaptation mechanisms: renaming (each feature must appear under its final name), redefinition, effecting, uneffecting and export status change. For redeclared features, else require clauses are or-ed with the precursors' preconditions, and then ensure clauses are and-ed with precursors' postconditions. For invariants, all the ancestors' clauses are concatenated. As a result, the flat form yields a view of the class, its features and its assertions that conforms exactly to the view offered to clients and (except for polymorphic uses) heirs. +These observations suggest ways to produce, from a class text, a version that is equivalent feature-wise and assertion-wise, but has no inheritance dependency. This is called the '''Flat Form''' of the class. It is a class text that has no inheritance clause and includes all the features of the class, immediate (declared in the class itself) as well as inherited. For the inherited features, the flat form must of course take account of all the feature adaptation mechanisms: renaming (each feature must appear under its final name), redefinition, effecting, uneffecting and export status change. For redeclared features, require else clauses are or-ed with the precursors' preconditions, and ensure then clauses are and-ed with precursors' postconditions. For invariants, all the ancestors' clauses are concatenated. As a result, the flat form yields a view of the class, its features and its assertions that conforms exactly to the view offered to clients and (except for polymorphic uses) heirs. As with the Contract Form ( [[8 Design by Contract (tm), Assertions and Exceptions#The_contract_form_of_a_class|"The contract form of a class"]] ), producing the Flat Form is the responsibility of tools in the development environment. In EiffelStudio, you will just click the "Flat" icon. @@ -623,7 +628,7 @@ The Eiffel rule enables, once again, the software developer to craft the resulti So to tune the repeated descendant, feature by feature, for sharing and replication it suffices to use renaming. -Doing nothing will cause sharing, which is indeedthe desired policy in most cases (especially those cases of unintended repeated inheritance: making D inherit from A even though it also inherits from B, which you forgot is already a descendant of A). +Doing nothing will cause sharing, which is indeed the desired policy in most cases (especially those cases of unintended repeated inheritance: making D inherit from A even though it also inherits from B, which you forgot is already a descendant of A). If you use renaming somewhere along the way, so that the final names are different, you will obtain two separate features. It does not matter where the renaming occurs; all that counts is whether in the common descendant, TEACHING_ASSISTANT in the last figure, the names are the same or different. So you can use renaming at that last stage to cause replication; but if the features have been renamed higher you can also use last-minute renaming to avoid replication, by bringing them back to a single name. @@ -684,7 +689,7 @@ class SORTABLE_ARRAY [G -> COMPARABLE] making it '''constrained generic'''. The symbol -> recalls the arrow of inheritance diagrams; what follows it is a type, known as the generic constraint. Such a declaration means that: -Within the class, you may apply the features of the generic constraint -- here the features of COMPARABLE: infix "<", infix "<" etc. -- to expressions of type G. +Within the class, you may apply the features of the generic constraint -- here the features of COMPARABLE: infix "<", infix ">" etc. -- to expressions of type G. A generic derivation is only valid if the chosen actual generic parameter conforms to the constraint. Here you can use SORTABLE_ARRAY [INTEGER] since INTEGER inherits from COMPARABLE, but not SORTABLE_ARRAY [COMPLEX] if COMPLEX is not a descendant of COMPARABLE. @@ -746,7 +751,7 @@ Assignment attempt is useful in the cases cited -- access to external objects be ==Covariance and anchored declarations== -The final property of Eiffel inheritance involves the rules for adapting not only the implementation of inherited features (through redeclaration of either kind, redeclaration and redefinition, as seen so far) and their contracts (through the Assertion Redeclaration rule), but also their types. More general than type is the notion of a feature's '''signature''', defined by the number of its arguments, their types, the indication of whether it has a result (that is to say, is a function or attribute rather than a procedure) and, if so, the type of the result. +The final property of Eiffel inheritance involves the rules for adapting not only the implementation of inherited features (through redeclaration of either kind, effecting and redefinition, as seen so far) and their contracts (through the Assertion Redeclaration rule), but also their types. More general than type is the notion of a feature's '''signature''', defined by the number of its arguments, their types, the indication of whether it has a result (that is to say, is a function or attribute rather than a procedure) and, if so, the type of the result. In many cases the signature of a redeclared feature remains the same as the original's. But in some cases you may want to adapt it to the new class. Assume for example that class ACCOUNT has features diff --git a/documentation/current/method/eiffel-tutorial-et/et-other-mechanisms.wiki b/documentation/current/method/eiffel-tutorial-et/et-other-mechanisms.wiki index beeedb90..e0806c2b 100644 --- a/documentation/current/method/eiffel-tutorial-et/et-other-mechanisms.wiki +++ b/documentation/current/method/eiffel-tutorial-et/et-other-mechanisms.wiki @@ -10,7 +10,7 @@ The Eiffel's method obsession with extendibility, reusability and maintainabilit Eiffel addresses this need through an original mechanism that also takes care of another important issue, poorly addressed by many design and programming approaches: initialization. The idea is simple: if instead of do the implementation of an effective routine starts with the keyword once, it will only be executed the first time the routine is called during a system execution (or, in a multi-threaded environment, the first time in each thread), regardless of what the caller was. Subsequent calls from the same caller or others will have no effect; if the routine is a function, it will always return the result computed by the first call -- object if an expanded type, reference otherwise. -In the case of procedures, this provides a convenient initialization mechanism. A delicate problem in the absence of a once mechanism is how to provide the users of a library with a set of routines which they can call in any order, but which all need, to function properly, the guarantee that some context had been properly set up. Asking the library clients to precede the first call with a call to an initialization procedure setup is not only user-unfriendly but silly: in a well-engineered system we will want to check proper set-up in every of the routines, and report an error if necessary; but then if we were able to detect improper set-up we might as well shut up and set up ourselves (by calling setup). This is not easy, however, since the object on which we call setup must itself be properly initialized, so we are only pushing the problem further. Making setup a once procedure solves it: we can simply include a call +In the case of procedures, this provides a convenient initialization mechanism. A delicate problem in the absence of a once mechanism is how to provide the users of a library with a set of routines which they can call in any order, but which all need, to function properly, the guarantee that some context had been properly set up. Asking the library clients to precede the first call with a call to an initialization procedure setup is not only user-unfriendly but silly: in a well-engineered system we will want to check proper set-up in every one of the routines, and report an error if necessary; but then if we were able to detect improper set-up we might as well shut up and set up ourselves (by calling setup). This is not easy, however, since the object on which we call setup must itself be properly initialized, so we are only pushing the problem further. Making setup a once procedure solves it: we can simply include a call setup @@ -71,48 +71,48 @@ A conditional instruction has the form ... end -The elseif ... then ... part (of which there may be more than one) and the else ... part are optional. After if and elseif comes a boolean expression; after then, elseif and else come zero or more instructions. +The elseif ... then ... part (of which there may be more than one) and the else ... part are optional. After if and elseif comes a boolean expression; after then and else come zero or more instructions. A multi-branch instruction has the form inspect - ''exp'' - when ''v1'' then - ''inst1'' - when ''v2'' then - ''inst2'' + exp + when v1 then + inst + when v2 then + inst2 ... else - ''inst0'' + inst0 end -where the else ''inst0'' part is optional, exp is a character or integer expression, ''v1'', ''v1'', ... are constant values of the same type as exp, all different, and ''inst0'', ''inst1'', ''inst2'', ... are sequences of zero or more instructions. +where the else inst0 part is optional, exp is a character or integer expression, v1, v1, ... are constant values of the same type as exp, all different, and inst0, inst1, inst2, ... are sequences of zero or more instructions. -The effect of such a multi-branch instruction, if the value of exp is one of the ''vi'', is to execute the corresponding ''insti''. If none of the ''vi'' matches, the instruction executes ''inst0'', unless there is no else part, in which case it triggers an exception. +The effect of such a multi-branch instruction, if the value of exp is one of the vi, is to execute the corresponding insti. If none of the vi matches, the instruction executes inst0, unless there is no else part, in which case it triggers an exception. -{{note|Raising an exception is the proper behavior, since the absence of an else indicates that the author asserts that one of the values will match. If you want an instruction that does nothing in this case, rather than cause an exception, use an else part with an empty ''inst0''. In contrast, if c then ''inst'' end with no else part does nothing in the absence of an else part, since in this case there is no implied claim that c must hold. }} +{{note|Raising an exception is the proper behavior, since the absence of an else indicates that the author asserts that one of the values will match. If you want an instruction that does nothing in this case, rather than cause an exception, use an else part with an empty inst0. In contrast, if c then inst end with no else part does nothing in the absence of an else part, since in this case there is no implied claim that c must hold. }} The loop construct has the form from - ''initialization'' + initialization until - ''exit'' + exit invariant - ''inv'' + inv variant - ''var'' + var loop - ''body'' + body end -where the invariant ''inv'' and variant ''var'' parts are optional, the others required. ''initialization'' and ''body'' are sequences of zero or more instructions; ''exit'' and ''inv'' are boolean expressions (more precisely, ''inv'' is an assertion); ''var'' is an integer expression. +where the invariant inv and variant var parts are optional, the others required. initialization and body are sequences of zero or more instructions; exit and inv are boolean expressions (more precisely, inv is an assertion); var is an integer expression. -The effect is to execute ''initialization'', then, zero or more times until ''exit'' is satisfied, to execute ''body''. (If after ''initialization'' the value of ''exit'' is already true, ''body'' will not be executed at all.) Note that the syntax of loops always includes an initialization, as most loops require some preparation. If not, just leave ''initialization''> empty, while including the from since it is a required component. +The effect is to execute initialization, then, zero or more times until exit is satisfied, to execute body. (If after initialization the value of exit is already true, body will not be executed at all.) Note that the syntax of loops always includes an initialization, as most loops require some preparation. If not, just leave initialization empty, while including the from since it is a required component. -The assertion ''inv'', if present, expresses a '''loop invariant''' (not to be confused with class invariants). For the loop to be correct, ''initialization'' must ensure ''inv'', and then every iteration of ''body'' executed when ''exit'' is false must preserve the invariant; so the effect of the loop is to yield a state in which both ''inv'' and ''exit'' are true. The loop must terminate after a finite number of iterations, of course; this can be guaranteed by using a '''loop variant''' ''var''. It must be an integer expression whose value is non-negative after execution of ''initialization'', and decreased by at least one, while remain non-negative, by any execution of ''body'' when ''exit'' is false; since a non-negative integer cannot be decreased forever, this ensures termination. The assertion monitoring mode, if turned on at the highest level, will check these properties of the invariant and variant after initialization and after each loop iteration, triggering an exception if the invariant does not hold or the variant is negative or does not decrease. +The assertion inv, if present, expresses a '''loop invariant''' (not to be confused with class invariants). For the loop to be correct, initialization must ensure inv, and then every iteration of body executed when exit is false must preserve the invariant; so the effect of the loop is to yield a state in which both inv and exit are true. The loop must terminate after a finite number of iterations, of course; this can be guaranteed by using a '''loop variant''' var. It must be an integer expression whose value is non-negative after execution of initialization, and decreased by at least one, while remaining non-negative, by any execution of body when exit is false; since a non-negative integer cannot be decreased forever, this ensures termination. The assertion monitoring mode, if turned on at the highest level, will check these properties of the invariant and variant after initialization and after each loop iteration, triggering an exception if the invariant does not hold or the variant is negative or does not decrease. An occasionally useful instruction is debug (''Debug_key'', ... ) ''instructions'' end where ''instructions'' is a sequence of zero or more instructions and the part in parentheses is optional, containing if present one or more strings, called debug keys. The EiffelStudio compiler lets you specify the corresponding debug compilation option: yes, no, or an explicit debug key. The ''instructions'' will be executed if and only if the corresponding option is on. The obvious use is for instructions that should be part of the system but executed only in some circumstances, for example to provide extra debugging information. @@ -242,7 +242,7 @@ The study of genericity described arrays. Another common kind of container objec TUPLE [X, Y, Z] -denoting a tuple of least three elements, such that the type of the first conforms to X, the second to Y, and the third to Z. +denoting a tuple of at least three elements, such that the type of the first conforms to X, the second to Y, and the third to Z. You may list any number of types in brackets, including none at all: TUPLE, with no types in brackets, denotes tuples of arbitrary length.