* (no subject)
@ 2001-06-12 14:53 jeanmarc.eber
2001-07-03 11:18 ` [Caml-list] Re: improvements for the OCaml toplevel Xavier Leroy
0 siblings, 1 reply; 2+ messages in thread
From: jeanmarc.eber @ 2001-06-12 14:53 UTC (permalink / raw)
To: caml-list
I just began to play seriously with Ocaml's toplevel and have the following
remarks and suggestions:
1. Standard use of the .ocamlinit file:
You have the possibility of "customising" the toplevel by a suitable
'.ocamlinit' file that is "#use"d before going in interactive mode.
Unfortunately, the '.ocamlinit' file isn't "#use"d in script mode, making it
impossible to create a *symmetric* environment for interactive and script mode.
I would suggest to "#use" also the ".ocamlinit" file in script mode (the result
being that it is put in front of your script file).
2. Type of user-defined printers:
The printing formatter system under OCaml is now everywhere in the compiler and
the standard libraries unified toward the "Format.formatter -> ('a,
Format.formatter, unit) format -> 'a type" approach, where all output functions
receive a formatter and a format string, giving everywhere these nice "fprintf
ppf "@[...@]" printo o ..." calls. This of course abstracts away the
destination of your output, that has to be parameterised by the choice of a
suitable formatter.
Unfortunately, user defined printers aren't of type Format.formatter -> ('a,
Format.formatter, unit) format -> 'a, but must be of type ('a,
Format.formatter, unit) format -> 'a. It seems (its not very clear from the
manual) that user-defined printers always have to print on
Format.std_formatter. Why ? I don't see any other explanation than historical
reasons... :-) I nethertheless suggest to unify also this last part of the
formatting system in OCaml. I don't think *many* OCaml users are using
industrially user defined printers and those who do could, I think, accept this
minor (and type tracked by the compiler!) change in their source.
Look at the relevant code in genprintval.ml (comments are mine):
let install_printer path ty fn = (* fn is the user defined printer *)
let print_val ppf obj = (* we have a ppf here *)
try fn obj with (* but we don't use it here !!!! *)
| exn ->
fprintf ppf "<printer %a raised an exception>" Printtyp.path path in
printers := (path, ty, print_val) :: !printers
3. Consequence: a minor subtle bug in OCaml's toplevel:
The following case isn't treated correctly under OCamls toplevel:
- you use "script" mode.
- your script raises an exception.
- your exception type contains one or more values that are printed by a custom
printer.
In this case, OCaml uses Format.err_formatter for its output (only for
exceptions, as other results aren't printed, of course), look at topmain.ml:
let file_argument name =
exit (if Toploop.run_script Format.err_formatter name Sys.argv then 0 else 2)
the exception will be printed on err_formatter, but calls recursively your
custom formatter that outputs on std_formatter... resulting in a not beautiful
"error message".
This shows how urgent it is to standardise *everywhere* on the same (powerful
and practical) formatting technology :-).
Jean-Marc Eber
LexiFi Technologies
-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
^ permalink raw reply [flat|nested] 2+ messages in thread
* [Caml-list] Re: improvements for the OCaml toplevel
2001-06-12 14:53 jeanmarc.eber
@ 2001-07-03 11:18 ` Xavier Leroy
0 siblings, 0 replies; 2+ messages in thread
From: Xavier Leroy @ 2001-07-03 11:18 UTC (permalink / raw)
To: jeanmarc.eber; +Cc: caml-list
> 1. Standard use of the .ocamlinit file: You have the possibility of
> "customising" the toplevel by a suitable '.ocamlinit' file that is
> "#use"d before going in interactive mode. Unfortunately, the
> '.ocamlinit' file isn't "#use"d in script mode, making it impossible
> to create a *symmetric* environment for interactive and script mode.
> I would suggest to "#use" also the ".ocamlinit" file in script mode
> (the result being that it is put in front of your script file).
I can see other situations where it is desirable to start a script in
a known, empty state, regardless of what the users put their .ocamlinit
files. The convention on which ".something" files to read on start-up
seems to vary widely between Unix shells, for instance. So, I don't
quite know what to do.
> 2. Type of user-defined printers: The printing formatter system
> under OCaml is now everywhere in the compiler and the standard
> libraries unified toward the "Format.formatter -> ('a,
> Format.formatter, unit) format -> 'a type" approach, where all
> output functions receive a formatter and a format string, giving
> everywhere these nice "fprintf ppf "@[...@]" printo o ..."
> calls. This of course abstracts away the destination of your output,
> that has to be parameterised by the choice of a suitable formatter.
> Unfortunately, user defined printers aren't of type Format.formatter
> -> ('a, Format.formatter, unit) format -> 'a, but must be of type
> ('a, Format.formatter, unit) format -> 'a.
Minor correction: the user-defined printers themselves (for a type t)
have type "t -> unit", and with your suggestion would have type
"formatter -> t -> unit".
> It seems (its not very
> clear from the manual) that user-defined printers always have to
> print on Format.std_formatter. Why ? I don't see any other
> explanation than historical reasons... :-)
You are correct on the "historical" bit.
> I nethertheless suggest to unify also this last part of the
> formatting system in OCaml. I don't think *many* OCaml users are
> using industrially user defined printers and those who do could, I
> think, accept this minor (and type tracked by the compiler!) change
> in their source.
Being reluctant to break old code (as usual), I implemented a
backward-compatible solution whereas the function given to #install_printer
can either have type "t -> unit" (as before) or type "formatter -> t -> unit"
(as you suggest). In the latter case, the function receives as
argument the formatter where it should output its results. The
documentation will encourage the latter form, and mark the former as
deprecated.
Thanks for your input,
- Xavier Leroy
-------------------
Bug reports: http://caml.inria.fr/bin/caml-bugs FAQ: http://caml.inria.fr/FAQ/
To unsubscribe, mail caml-list-request@inria.fr Archives: http://caml.inria.fr
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2001-07-03 11:18 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2001-06-12 14:53 jeanmarc.eber
2001-07-03 11:18 ` [Caml-list] Re: improvements for the OCaml toplevel Xavier Leroy
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox