From: Phil Thornley <phil.jpthornley@googlemail.com>
Subject: Re: SPARK examiner visibility problem
Date: Mon, 14 Sep 2009 09:12:36 -0700 (PDT)
Date: 2009-09-14T09:12:36-07:00 [thread overview]
Message-ID: <a6167b51-411f-4ad3-9745-8e0b62b171ec@v2g2000vbb.googlegroups.com> (raw)
In-Reply-To: 8d72d20b-489b-4494-9b13-1b00ee902850@j4g2000yqa.googlegroups.com
On 13 Sep, 23:47, Laurie Dillon <lauradi...@gmail.com> wrote:
> I am having trouble with a toy example of encapsulating IO for a SPARK
> program. My example seems to be consistent with the Spark_IO example
> in the Barnes book.
I feel that this needs a more complete response than I gave this
morning (which was wrong anyway).
>
> I have the following package spec:
>
> -------------------------------------------------------------------------------------
>
> with Ada.Text_IO;
> package Std_IO
> -- encapsulates IO to and from standard input and standard output
> --# own stdin: Istream_Type;
> --# stdout: Ostream_Type;
> --# initializes stdin,
> --# stdout;
> is
> --# type Istream_Type is abstract;
> --# type Ostream_Type is abstract;
>
> procedure New_Line;
> -- output a new line to stdout
> --# global in out stdout;
> --# derives stdout from *;
>
> procedure Put_Line (Item : in String);
> -- output a string followed by a carriage return to stdout
> --# global in out stdout;
> --# derives stdout from *, Item;
>
> procedure Put_Integer (Item : in Integer);
> -- output an integer to stdout
> --# global in out stdout;
> --# derives stdout from *, Item;
>
> procedure Get_Integer (Item : out Integer;
> OK : out Boolean);
> -- input an integer from stdin
> --# global in stdin;
> --# derives Item, OK from stdin;
>
> end Std_IO;
> ----------------------------------------------------------------------------------------------------------
>
> The examiner has no problem with this package (the body carries a
> #hide Std_IO annotation). But when I try to examine a package spec
> (or body) that inherits Std_IO, I get semantic errors at every
> reference to Std_IO.stdin and Std_IO.stdout.
>
> For example, consider the following spec:
> -----------------------------------------------------------------------------------
> --# inherit Std_IO;
> package MyGps
> --# own home;
> is
>
> type Location is
> record
> x : Integer;
> y : Integer;
> end record;
>
> procedure MoveTo (theLoc : in Location);
> -- moves home to the given location
> --# global out home;
> --# derives home from theLoc;
>
> function Distance (theLoc : Location) return Integer;
> -- returns the (taxi) distance from home to the given location
> --# global home;
>
> procedure GetLocation (theLoc : out Location);
> -- prompts user for theLoc
> --# derives theLoc from Std_IO.stdin;
Every import and export of a procedure must be either a parameter or
named in a global annotation.
Here you have said that the exported parameter theLoc is derived from
Std_IO.stdin but that item is not visible. For this annotation to be
acceptable Std_IO.stdin must be imported in a global annotation:
--# global in Std_IO.stdin;
>
> end MyGps;
> ---------------------------------------------------------------------------------------------
> Examiner report says:
>
> Unit name: MyGps
> Unit type: package specification
> Unit has been analysed, any errors are listed below.
>
> 1 error(s) or warning(s)
>
> Line
> 23 --# derives theLoc from Std_IO.stdin;
> ^1
> *** ( 1) Semantic Error :752: The identifier Std_IO.stdin is
> either undeclared
> or not visible at this point. This identifier must appear
> in a
> preceding legal global annotation or formal parameter list.
> -------------------------------------------------------------------------------------
>
> I thought the own declaration for stdin in the spec of Spark_IO should
> qualify as "a preceding legal global annotation". What am I missing
> here?
>
> Analysis of the body of myGps gives similar errors. For example:
>
> Unit name: MyGps
> Unit type: package body
> Unit has been analysed, any errors are listed below.
>
> 14 error(s) or warning(s)
>
> Line
> 35 Std_IO.Put_Line (Item => "Enter x-coordinate of location :
> ");
> ^1,2
> *** ( 1) Semantic Error : 25: The identifier Std_IO.stdout
> (imported by called
> subprogram) is not visible at this point.
> *** ( 2) Semantic Error : 24: The identifier Std_IO.stdout
> (exported by called
> subprogram) is not visible at this point.
This must be the code of GetLocation. The Examiner has identified
that the procedure Put_Line both imports and exports Std_IO.stdout,
but at the moment it isn't visible to the procedure GetLocation (see
above).
Since these errors state that Std_IO.stdout is both imported and
exported by Put_Line then GetLocation must also both import and export
it, so I guess its annotations should be (at least):
--# global in out Std_IO.stdout;
--# derives theLoc from
--# Std_IO.Stdout
--# & Std_IO.Stdout from
--# *;
Hope this is clearer than previously.
Phil
next prev parent reply other threads:[~2009-09-14 16:12 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2009-09-13 22:47 SPARK examiner visibility problem Laurie Dillon
2009-09-14 0:32 ` Britt
2009-09-14 4:26 ` Laurie Dillon
2009-09-14 6:28 ` Ludovic Brenta
2009-09-14 8:16 ` Phil Thornley
2009-09-14 7:40 ` Phil Thornley
2009-09-14 16:12 ` Phil Thornley [this message]
2009-09-14 22:44 ` Laurie Dillon
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox