From: "Johan Baltié" <johan.baltie@wanadoo.fr>
To: Jacques Garrigue <garrigue@kurims.kyoto-u.ac.jp>
Cc: caml-list@inria.fr
Subject: Re: [Caml-list] Statically detecting arrays bound exceptions ?? (was: Universal Serializer)
Date: Wed, 17 Jul 2002 08:14:24 +0100 [thread overview]
Message-ID: <20020717071424.M65430@wanadoo.fr> (raw)
In-Reply-To: <20020717154649S.garrigue@kurims.kyoto-u.ac.jp>
> From: "Johan Baltié" <johan.baltie@wanadoo.fr>
>
> > Well, Ada does. The strong typing gives information to the compiler for it to
> > deduce when range checking is not needed:
> >
> > declare
> > subtype Index is Integer range 1..10;
> > type Arr is array (Index) of Integer;
> > a : Arr;
> > element : Integer;
> > j : Index := 1;
> > k : Integer := 11;
> > begin
> > for i in a'Range loop
> > element := a(i); -- no range checking needed, i is in range by definition
> > end loop;
> > a(j); -- range checking not needed, j is within Index by definition
> > a(k); -- range checking needed due possibility of k being outside of Index
> > exception
> > when Constraint_Error =>
> > -- process the out-of-range error from a(k)
> > end;
>
> This is similar to Pascal ranges.
> The trouble is that typical code doesn't look like that, but rather
>
> let bubble_once arr =
> for i = 0 to Array.length arr - 2 do
> if arr.(i) > arr.(i+1) then begin
> let tmp = arr.(i) in
> arr.(i) <- arr.(i+1);
> arr.(i+1) <- tmp
> end
> done
>
> or worse
>
> let bubble_one arr last =
> assert (last < Array.length arr);
> let swap i =
> let tmp = arr.(i) in
> arr.(i) <- arr.(i+1);
> arr.(i+1) <- tmp
> in
> for i = 0 to last - 1 do
> if arr.(i) < arr.(i+1) then swap i
> done
>
> In the first case, that's not too difficult: you just have to know
> that Array.length returns the length of an array, and do a bit of
> arithmetic.
>
> In the second case, you should propagate the information from the
> assertion to the loop bound, and additionally treat swap as if it were
> inlined (we know it is its only call context).
No it's not such a mess.
A subrange is a type. As ocaml is a bit strong on is types it solves itself the
problem
let bubble_one arr last =
assert (last < Array.length arr);
let swap i =
let tmp = arr.(i) in
arr.(i) <- arr.(i+1);
arr.(i+1) <- tmp
in
for i = 0 to last - 1 do
if arr.(i) < arr.(i+1) then swap i
done
the {..} are my subranges types
bubble_one: a' {0..b'} array -> int -> unit
swap: {0..b'} -> unit
the "for" should be like in Ada, working with range types and no problem will
ever occur.
> And it's fragile:
> if you move "swap" out of the function, then it might be used on any
> array, and you have to do the bound check.
If you move swap out of the function, in another one using another array, the
type will change and a warning/error/check will occur if the types are incompatible.
> [snipped]
> Jacques Garrigue
Ciao
Jo
-------------------
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
Beginner's list: http://groups.yahoo.com/group/ocaml_beginners
next prev parent reply other threads:[~2002-07-17 7:15 UTC|newest]
Thread overview: 12+ messages / expand[flat|nested] mbox.gz Atom feed top
2002-07-17 6:19 Johan Baltié
2002-07-17 6:46 ` Jacques Garrigue
2002-07-17 7:14 ` Johan Baltié [this message]
2002-07-17 7:32 ` Jacques Garrigue
2002-07-17 7:53 ` [Caml-list] Sub{range,type} (was: Statically detecting arrays bound exceptions ??) Johan Baltié
-- strict thread matches above, loose matches on Subject: below --
2002-07-08 19:53 [Caml-list] productivity improvement Oleg
[not found] ` <15657.61603.221054.289184@spike.artisan.com>
2002-07-09 4:43 ` [Caml-list] Universal Serializer (was: productivity improvement) Oleg
2002-07-09 7:59 ` Nicolas Cannasse
2002-07-10 16:06 ` John Max Skaller
2002-07-10 22:29 ` Michael Vanier
2002-07-12 12:41 ` John Max Skaller
2002-07-14 12:25 ` [Caml-list] Statically detecting arrays bound exceptions ?? (was: Universal Serializer) Berke Durak
2002-07-14 13:24 ` Alessandro Baretta
2002-07-15 8:23 ` Xavier Leroy
2002-07-15 8:39 ` Noel Welsh
2002-07-15 21:22 ` Oleg
2002-07-15 22:44 ` Michael Vanier
2002-07-16 6:43 ` Florian Hars
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20020717071424.M65430@wanadoo.fr \
--to=johan.baltie@wanadoo.fr \
--cc=caml-list@inria.fr \
--cc=garrigue@kurims.kyoto-u.ac.jp \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox