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

Sebastian Godelet sebastian.godelet+github at gmail.com
Mon Dec 22 19:53:20 AEDT 2014


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 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.

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