[MLton-user] Strange date behaviour

Matthew Fluet fluet at tti-c.org
Fri Jul 6 16:01:15 PDT 2007


On Thu, 5 Jul 2007, Matthew Fluet wrote:
> On 7/5/07, Joe Hurd <joe at gilith.com> wrote:
>>  Am I being stupid here, or is Date.fmt throwing a bogus exception?
>>
>>  I'm experiencing this on both Mac OS X (i386) and Linux (i386).
>>
>>  Joe
>>
>>  fel-hurd:~$ mlton
>>  MLton MLTONVERSION (built Mon Oct 30 23:08:10 2006 on frogbat.local)
>>  fel-hurd:~$ cat t.sml
>>  print (Date.fmt
>>           "%d/%m/%Y"
>>           (Date.date
>>              {year = 1876, month = Date.Apr, day = 19,
>>               hour = 0, minute = 0, second = 0,
>>               offset = NONE}));
>>  fel-hurd:~$ mlton t.sml
>>  fel-hurd:~$ ./t
>>  unhandled exception: Date
>
> There appears to be a check in $(SML_LIB)/basis/system/date.sml that
> raises Date when the year is <= 1900 and converting a date to a struct
> tm (defined in <time.h>).  The comment claims to check whether the
> date may be passed to ISO/ANSI C functions.  The documentation for
> <time.h> [1] says that the struct tm includes the component:
>  int    tm_year  Years since 1900.
> That seems to be the origin of the check.  However, later in the
> documentation, it says:
>  tm_year is a signed value; therefore, years before 1900 may be represented.
> Hence, it seems that the check can safely be removed.
>
> [1] http://www.opengroup.org/onlinepubs/009695399/basedefs/time.h.html

I've checked in a fix for this bug.  As noted above, for those not wishing 
to recompile mlton for this bug, it suffices to effect the following 
patch:

Index: system/date.sml
===================================================================
--- system/date.sml       (revision 5731)
+++ system/date.sml       (revision 5732)
@@ -160,8 +160,7 @@
      (* Check whether date may be passed to ISO/ANSI C functions: *)

      fun okDate (T {year, month, day, hour, minute, second, ...}) =
-        1900 <= year
-        andalso 1 <= day    andalso day    <= monthdays year month
+        1 <= day    andalso day    <= monthdays year month
          andalso 0 <= hour   andalso hour   <= 23
          andalso 0 <= minute andalso minute <= 59
          andalso 0 <= second andalso second <= 61 (* leap seconds *)

The location of system/date.sml depends on your installation.  If mlton 
has been installed system-wide, it is in /usr/local/lib/mlton/sml/basis. 
If mlton has been built from source, it is in <src>/build/lib/sml/basis.



More information about the MLton-user mailing list