09-208r2 To: J3 From: Malcolm Cohen Subject: Suggested new feature for F2008 Date: 2009/05/05 1. Introduction The only difference between this and 09-208r1 is the revision of the examples to better illustrate the feature. 2. Description Erik Kruyt made the following suggestion: "R448. This is the only instance of PROCEDURE where no list is allowed. I suggest to change binding-name into binding-name-list, and binding-name [=> procedure-name] in binding-spec-list. Binding-spec is binding-name [=> procedure-name]. The accompanying example in the 2003 standard included such a list, which is now corrected to be consistent with the rule. Is this feasible." This is obviously feasible and obviously simple. The example in F2003 shows we originally intended it this way anyway. Therefore I have Specs, Syntax, and Edits. 3. Example Consider the Fortran 2003 type definition: TYPE frac INTEGER num,denom CONTAINS PRIVATE PROCEDURE :: frac_plus_frac PROCEDURE :: frac_plus_i => frac_plus_int PROCEDURE :: frac_plus_r => frac_plus_real PROCEDURE,PASS(b) :: i_plus_frac PROCEDURE,PASS(b) :: r_plus_frac GENERIC,PUBLIC :: OPERATOR(+) => frac_plus_frac, frac_plus_i, & frac_plus_r, i_plus_frac, r_plus_frac END TYPE Clearly the GENERIC statement is a lot more convenient to use than the PROCEDURE statement. The extension would allow the above type to be written as TYPE frac INTEGER num,denom CONTAINS PRIVATE PROCEDURE :: frac_plus_frac, frac_plus_i=>frac_plus_int, & frac_plus_r=>frac_plus_real PROCEDURE,PASS(b) :: i_plus_frac, r_plus_frac GENERIC,PUBLIC :: OPERATOR(+) => frac_plus_frac, frac_plus_i, & frac_plus_r, i_plus_frac, r_plus_frac END TYPE The example in F2003 at [447:17-29] was similar to this; that example was changed in the F2008 draft (because it was not valid syntax); the Edits below reinstate the F2003 example as it used to be. 4. Specification That the syntax for specifying a type-bound procedure be extended to allow specifying more than one type-bound procedure in a single statement. This is consistent with the way of declaring procedure pointer components (also known as object-bound procedures), the procedure declaration statement and the (MODULE) PROCEDURE statement. 5. Syntax The name for the new syntax term is stylistically similar to the component declaration statement (component-decl and proc-decl), and type declaration statement (entity-decl). PROCEDURE [ [ , ] :: ] and PROCEDURE ( ) [ , ] :: where is [ => ] 6. Edits to N1776 [73:12,14,14+] 4.5.5 R448 Replace " [ => ]" with ""; replace ":: " with ":: "; add new rule "R448a <> [ => ]". {The new syntax.} [73:15,18] 4.5.5 C464, 4.5.5p1 After "appears" insert "in a ", twice. {Improve clarity.} [74:19] 4.5.5p2, first sentence. "declares a ... procedure." -> "declares one or more ... procedures." [472:40-42] C.1.3p4 Replace the three type-bound procedure statements with one "PROCEDURE,PRIVATE :: rat_asgn_i, rat_plus_i, rat_plus_rat=>rat_plus". {Reinstate the example of what we originally intended to do.} [473:29] Change "rat_plus_rat" to "rat_plus". ===END===