• Aspect location in expression function.

    From Blady@21:1/5 to All on Sat May 14 13:47:28 2022
    Hello,

    I'm puzzled when I want to changed a function body with aspects to an expression function, for instance:

    function Length (S : Some_Tagged_Tyoe) return Natural
    with Pre => S.Valid
    is
    begin
    return S.Length;
    end;

    have to be changed in:

    function Length (S : Some_Tagged_Tyoe) return Natural
    is (S.Length)
    with Pre => S.Valid;

    The location of the aspect has moved to the end.

    I'd like simply replace the begin block by the expression, as:

    function Length (S : Some_Tagged_Tyoe) return Natural
    with Pre => S.Valid
    is (S.Length);

    What could be any reasons not to permit it?

    Thanks, Pascal.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From J-P. Rosen@21:1/5 to All on Sat May 14 17:40:03 2022
    Le 14/05/2022 à 13:47, Blady a écrit :
    Hello,

    I'm puzzled when I want to changed a function body with aspects to an expression function, for instance:

    function Length (S : Some_Tagged_Tyoe) return Natural
      with Pre => S.Valid
      is
      begin
      return S.Length;
      end;

    have to be changed in:

    function Length (S : Some_Tagged_Tyoe) return Natural
      is (S.Length)
      with Pre => S.Valid;

    The location of the aspect has moved to the end.

    I'd like simply replace the begin block by the expression, as:

    function Length (S : Some_Tagged_Tyoe) return Natural
      with Pre => S.Valid
      is (S.Length);

    What could be any reasons not to permit it?

    What you say is logical if you think of an expression function as a
    body; however, it is more like a specification (it can appear in a
    package spec, although it can complete a specification), so the place
    where the aspect appears makes sense. And it would be confusing to allow
    the aspect in two different places. It is the same for separate bodies
    of subprograms.

    --
    J-P. Rosen
    Adalog
    2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
    Tel: +33 1 45 29 21 52
    https://www.adalog.fr

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Randy Brukardt@21:1/5 to J-P. Rosen on Mon May 23 23:05:12 2022
    "J-P. Rosen" <rosen@adalog.fr> wrote in message news:t5oigj$pag$1@dont-email.me...
    Le 14/05/2022 à 13:47, Blady a écrit :
    Hello,

    I'm puzzled when I want to changed a function body with aspects to an
    expression function, for instance:

    function Length (S : Some_Tagged_Tyoe) return Natural
    with Pre => S.Valid
    is
    begin
    return S.Length;
    end;

    have to be changed in:

    function Length (S : Some_Tagged_Tyoe) return Natural
    is (S.Length)
    with Pre => S.Valid;

    The location of the aspect has moved to the end.

    I'd like simply replace the begin block by the expression, as:

    function Length (S : Some_Tagged_Tyoe) return Natural
    with Pre => S.Valid
    is (S.Length);

    What could be any reasons not to permit it?

    What you say is logical if you think of an expression function as a body; however, it is more like a specification (it can appear in a package spec, although it can complete a specification), so the place where the aspect appears makes sense. And it would be confusing to allow the aspect in two different places. It is the same for separate bodies of subprograms.

    To make a functioning :LR grammar for Ada, I *had* to allow the aspect specification in both places, and then make one of them illegal. Which is
    more work than just allowing in either place. So I guess it is a matter of perspective. :-)

    To the OP: we discussed placement of aspect specifications ad-nausem, as
    issues like this always were coming up. There is no consistent rule that
    really works well, because one does not want small things following large
    sets of aspect specs -- they can get lost and overlooked.

    For instance, one puts aspect specifications after "is abstract" as
    otherwise that could be lost after a lengthy precondition expression (and
    it's too important to be lost). See how that could happen in the following (illegal) declaration:

    procedure P (A, B ,,,)
    with Pre => <very long expression that extends over several lines
    here>
    is abstract;

    So something like this (and "is null" as well) require the Pre at the end:

    procedure P (A, B ,,,)
    is abstract
    with Pre => <very long expression that extends over several lines
    here>;

    Expression functions generally follow the same rules as the older null procedures, thus they ended up with the same positioning. It's not as
    obvious a case here, since the return expression can also be long, but we thought it should be consistent.

    BTW, I don't think there ever is a reason to go from an expression with a normal body to an expression function (assuming the body is legal). A normal body is more readable and less of a hassle during maintenance. The advantage
    of an expression function is to use it in places where a regular body is not allowed and/or just to be lazy writing the body - neither of which would
    ever require changing *to* an expression function. Maintenance might require changing *from* an expression function if the body has gotten too complex
    (for instance, needs a variable declaration), but that generally will
    require moving the function as well so "ease" of doing so isn't very
    relevant.

    Randy.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From J-P. Rosen@21:1/5 to All on Tue May 24 12:01:08 2022
    Le 24/05/2022 à 06:05, Randy Brukardt a écrit :
    To make a functioning :LR grammar for Ada, I*had* to allow the aspect specification in both places, and then make one of them illegal. Which is more work than just allowing in either place. So I guess it is a matter of perspective.:-)

    But if you allow it in either place, then you have to decide what
    happens if it appears in /both/ places... Would you like conformance
    checking? I bet no ;-)

    --
    J-P. Rosen
    Adalog
    2 rue du Docteur Lombard, 92441 Issy-les-Moulineaux CEDEX
    Tel: +33 1 45 29 21 52
    https://www.adalog.fr

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From G.B.@21:1/5 to Randy Brukardt on Tue May 24 20:24:14 2022
    On 24.05.22 06:05, Randy Brukardt wrote:

    To the OP: we discussed placement of aspect specifications ad-nausem, as issues like this always were coming up. There is no consistent rule that really works well, because one does not want small things following large sets of aspect specs -- they can get lost and overlooked.

    For instance, one puts aspect specifications after "is abstract" as
    otherwise that could be lost after a lengthy precondition expression (and it's too important to be lost).

    Isn't this emphasis on "is abstract" loosing the very point of abstraction?

    See how that could happen in the following
    (illegal) declaration:

    procedure P (A, B ,,,)
    with Pre => <very long expression that extends over several lines here>
    is abstract;

    Who cares to see "is abstract" if P is in a spec?
    The implementer, I guess, but the client? Less so.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Randy Brukardt@21:1/5 to G.B. on Wed May 25 00:20:50 2022
    "G.B." <bauhaus@notmyhomepage.invalid> wrote in message news:t6j7se$8b1$1@dont-email.me...
    On 24.05.22 06:05, Randy Brukardt wrote:
    ...
    Who cares to see "is abstract" if P is in a spec?
    The implementer, I guess, but the client? Less so.

    Any client that needs to declare an extension (pretty common in OOP), especially as "abstract" routines mostly are used with root types (and interfaces). I suppose you could "program by error" and just let the
    compiler complain if you don't give a body for something abstract, but it's generally recommended to know what you're doing and not just try to make the compiler happy.

    Randy.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From Randy Brukardt@21:1/5 to J-P. Rosen on Wed May 25 00:17:28 2022
    "J-P. Rosen" <rosen@adalog.fr> wrote in message news:t6iad4$263$1@dont-email.me...
    Le 24/05/2022 à 06:05, Randy Brukardt a écrit :
    To make a functioning :LR grammar for Ada, I*had* to allow the aspect
    specification in both places, and then make one of them illegal. Which is
    more work than just allowing in either place. So I guess it is a matter
    of
    perspective.:-)

    But if you allow it in either place, then you have to decide what happens
    if it appears in /both/ places... Would you like conformance checking? I
    bet no ;-)

    An individual aspect can only be specified once per entity, so specifying it
    in both is obviously illegal. One would have to check the exact wording to ensure that it really said that, but surely that would be the intent.

    Randy.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)
  • From G.B.@21:1/5 to Randy Brukardt on Wed May 25 20:45:58 2022
    On 25.05.22 07:20, Randy Brukardt wrote:
    "G.B." <bauhaus@notmyhomepage.invalid> wrote in message news:t6j7se$8b1$1@dont-email.me...
    On 24.05.22 06:05, Randy Brukardt wrote:
    ...
    Who cares to see "is abstract" if P is in a spec?
    The implementer, I guess, but the client? Less so.

    Any client that needs to declare an extension (pretty common in OOP),

    Another, dare I say, more frequent way of being a client of a type
    is being a caller of the type's subprograms, such as P, rather than
    being an implementer of a type's concrete behavior. (The two can
    overlap, but I'm thinking of the more frequent human clients here :) )

    A case I'd single out is a type that comes with a factory F.
    I'd expect the associated type T to be abstract. This goes
    without saying! ;-) A client needs to know the "behavioral"
    interface of T and also that of F.
    The "is abstract" then remains as helpful language technology,
    but as seen inside the factory.

    (So, I'd put "is abstract" last.)

    especially as "abstract" routines mostly are used with root types (and interfaces). I suppose you could "program by error"

    Not design errors, but mechanical errors duly output by the compiler.
    The programmer will be programming by "following the language's rules".
    IDEs and compilers will assist the programmer who is implementing
    an abstract type. For example, the usual IDE has this suggestion
    following its compiler's error message::

    Fix: "Add unimplemented methods"
    (for)
    Error: "The type must implement[!] the inherited abstract method ..."

    The IDE will do so if you answer "Yes" and programmers can provide their
    own adjustments to template text that this mechanism will be using. Thus, again, programmers can involve useful language technology in
    a template's text. I remember some Ada tools offering similar features.

    --- SoupGate-Win32 v1.05
    * Origin: fsxNet Usenet Gateway (21:1/5)