[m-rev.] for review: print formatted dates and durations with io.print

Sebastian Godelet sebastian.godelet+github at gmail.com
Tue Dec 23 23:02:19 AEDT 2014


On Mon, 22 Dec 2014 16:53:20 +0800
Sebastian Godelet <sebastian.godelet+github at gmail.com> wrote:

> On Mon, 22 Dec 2014 11:11:40 +1100 (AEDT)
> Julien Fischer <jfischer at opturion.com> wrote:
> 
> > 
> > Print formatted dates and durations with io.print.
> 
> In the io.print documentation it is mentioned that values will be
> print in a human-readable form, would you consider a string
> representation like in ISO 8601, such as: 2014-12-19T16:05:00:00Z
> as human-readable?

I think I didn't express myself clearly here, I'm sorry that my English
is not that fluent.
What I wanted to say that it would be better that the
date_to_string/1 function would return an ISO 8601 compliant formatted
date(_time). The current result lacks the 'T' which serves as a
separator <date>T<time>.
I just noted since in mercury-json this behaviour was intended, I
suspect that many json parsing libraries for other languages use the
standard convention.
It would be really helpful for interoperability if Mercury would do the
same.

> 
> I think it would be confusing for a user to see durations printed in
> an ISO 8601 format, but not the date_times.
> 
> One problem with the current time implementation is that the time zone
> information (or at least the offset, or UTC/local) is irreversibly
> lost. For a start maybe a UTC/local boolean could be stored in the
> time.tm representation.

Here I wanted to say that in ISO 8601 date_times without an timezone
designator are assumed to be local time, which is (a) not always the
case (b) and be not really desirable (since in server-client
applications the term local time is not really clearly defined.

I hope this email is the right place to raise this possible issue.

Greetings, Sebastian.

P.S: Happy Christmas eve

> 
> Another question I have is how a user can hook the print mechanism for
> custom types, unfortunately there is no typeclass such as
> stringifiable(T) with to_string(T) = string or similar.
> I have read in the manual that the current usage of typeclasses in the
> standard library is due to historical reasons,
> are there (still) any technical restrictions on adding a typeclass for
> this purpose?
> 
> Cheers, Sebastian.
> 
> > 
> > Change the io.print family of predicates to print out the formatted
> > version of dates and durations rather than their underlying
> > representation.
> > 
> > library/io.m:
> > library/stream.string_writer.m:
> >  	As above.
> > 
> >  	Avoid a change of tense in the middle of the descriptive
> > comment for {io,stream.string_writer}.print.
> > 
> > tests/hard_coded/Mmakefile:
> > tests/hard_coded/print_date.{m,exp}:
> >  	Add a test for the above.
> > 
> > Julien.
> > 
> > diff --git a/library/io.m b/library/io.m
> > index 498a532..238d36b 100644
> > --- a/library/io.m
> > +++ b/library/io.m
> > @@ -388,8 +388,12 @@
> >       % If the argument is just a single string or character, it
> > will be printed % out exactly as is (unquoted).  If the argument is
> > of type integer (i.e. % an arbitrary precision integer), then its
> > decimal representation will be
> > -    % printed.  If the argument is of type univ, then it will print
> > out the
> > -    % value stored in the univ, but not the type.
> > +    % printed.  If the argument is of type univ, then the value
> > stored in the
> > +    % the univ will be printed out, but not the type.  If the
> > argument is of
> > +    % type date_time, it will be printed out in the same form as
> > the string
> > +    % returned by the function date_to_string/1.  If the argument
> > is of type
> > +    % duration, it will be printed out in the same form as the
> > string
> > +    % returned by the function duration_to_string/1.
> >       %
> >       % print/5 is the same as print/4 except that it allows the
> > caller to % specify how non-canonical types should be handled.
> > print/3 and diff --git a/library/stream.string_writer.m
> > b/library/stream.string_writer.m index 88e1be2..88c439d 100644
> > --- a/library/stream.string_writer.m
> > +++ b/library/stream.string_writer.m
> > @@ -51,8 +51,12 @@
> >       % If the argument is just a single string or character, it
> > will be printed % out exactly as is (unquoted).  If the argument is
> > of type integer (i.e. % an arbitrary precision integer), then its
> > decimal representation will be
> > -    % printed.  If the argument is of type univ, then it will print
> > out the
> > -    % value stored in the univ, but not the type.
> > +    % printed.  If the argument is of type univ, then the value
> > stored in the
> > +    % the univ will be printed out, but not the type.  If the
> > argument is of
> > +    % type date_time, it will be printed out in the same form as
> > the string
> > +    % returned by the function date_to_string/1.  If the argument
> > is of type
> > +    % duration, it will be printed out in the same form as the
> > string
> > +    % returned by the function duration_to_string/1.
> >       %
> >       % print/5 is the same as print/4 except that it allows the
> > caller to % specify how non-canonical types should be handled.
> > print/4 implicitly @@ -178,6 +182,7 @@
> > 
> >   :- import_module array.
> >   :- import_module bitmap.
> > +:- import_module calendar.
> >   :- import_module int.
> >   :- import_module integer.
> >   :- import_module require.
> > @@ -264,6 +269,10 @@ print(Stream, NonCanon, Term, !State) :-
> >           write_univ(Stream, OrigUniv, !State)
> >       ; dynamic_cast(Term, BigInt) ->
> >           put(Stream, integer.to_string(BigInt), !State)
> > +    ; dynamic_cast(Term, DateTime) ->
> > +        put(Stream, date_to_string(DateTime), !State)
> > +    ; dynamic_cast(Term, Duration) ->
> > +        put(Stream, duration_to_string(Duration), !State)
> >       ;
> >           print_quoted(Stream, NonCanon, Term, !State)
> >       ).
> > diff --git a/tests/hard_coded/Mmakefile b/tests/hard_coded/Mmakefile
> > index a99bc57..6dc9480 100644
> > --- a/tests/hard_coded/Mmakefile
> > +++ b/tests/hard_coded/Mmakefile
> > @@ -232,6 +232,7 @@ ORDINARY_PROGS=	\
> >   	pretty_printing \
> >   	prince_frameopt \
> >   	print_bigint \
> > +	print_date \
> >   	print_stream \
> >   	profdeep_seg_fault \
> >   	promise_equiv_with_svars \
> > diff --git a/tests/hard_coded/print_date.exp
> > b/tests/hard_coded/print_date.exp new file mode 100644
> > index 0000000..d831d20
> > --- /dev/null
> > +++ b/tests/hard_coded/print_date.exp
> > @@ -0,0 +1,2 @@
> > +2014-12-19 16:05:00
> > +P5DT7H55M
> > diff --git a/tests/hard_coded/print_date.m
> > b/tests/hard_coded/print_date.m new file mode 100644
> > index 0000000..7e71d32
> > --- /dev/null
> > +++ b/tests/hard_coded/print_date.m
> > @@ -0,0 +1,20 @@
> > +% vim: ft=mercury ts=4 sw=4 et wm=0 tw=0
> > +
> > +% Test io.print with dates and durations.
> > +
> > +:- module print_date.
> > +:- interface.
> > +
> > +:- import_module io.
> > +:- pred main(io::di, io::uo) is det.
> > +
> > +:- implementation.
> > +
> > +:- import_module calendar.
> > +
> > +main(!IO) :-
> > +    Date1 = det_init_date(2014, december, 19, 16, 5, 0, 0),
> > +    Date2 = det_init_date(2014, december, 25, 0, 0, 0, 0),
> > +    io.print_line(Date1, !IO),
> > +    Duration = duration(Date1, Date2),
> > +    io.print_line(Duration, !IO).
> > _______________________________________________
> > reviews mailing list
> > reviews at lists.mercurylang.org
> > https://www.mercurylang.org/lists/listinfo/reviews
> 




More information about the reviews mailing list