[local-time-devel] TIMESTAMP-DIFFERENCE: documentation; return rational values

J.P. Larocque jpl at thoughtcrime.us
Tue May 4 19:41:59 UTC 2010


Hi,

I have two changes to LOCAL-TIME that I would like to share:

The first documents the type of the return value in the docstring for
TIMESTAMP-DIFFERENCE.  It also documents that function in the manual.

The second change makes TIMESTAMP-DIFFERENCE return a RATIONAL instead
of a DOUBLE-FLOAT (in the non-whole case).  I really think that's
better behavior, because if a library client wants the exactness of a
rational while the function returns a float, they would have to
reimplement the function on their own.  Whereas if a client expressly
does not want the precision of a rational but the function does return
a rational, then the client is always free to use FLOAT or COERCE to
get a value of the precision they want.

Hope you find this useful,

-- 
J.P. Larocque <jpl at thoughtcrime.us>
-------------- next part --------------
Tue May  4 12:06:38 PDT 2010  J.P. Larocque <jpl at thoughtcrime.us>
  * Document TIMESTAMP-DIFFERENCE and add return type to function docstring

Tue May  4 12:12:52 PDT 2010  J.P. Larocque <jpl at thoughtcrime.us>
  * Make TIMESTAMP-DIFFERENCE return RATIONALs.
  
  Previously TIMESTAMP-DIFFERENCE would return an integer if the
  difference was an integer value, or a float if the nanoseconds of the
  difference was non-zero.  It now always returns a rational (and by
  extension an integer if the mathematical value is an integer).
  Clients that don't want the precision of rationals can convert the
  result to a float.
  
  Also remove the carries from second to nsec and from day to second.
  The carries were previously used to normalize nsec (which could have
  been negative) to [0,10^9).  The function then checked whether nsec
  was non-zero, in order to determine whether to return an integer or a
  double-float.  Now that rationals are always returned, there's no need
  to check, and therefore the carries now have no effect on the end
  result.  Since the carries made the code a little bit less clear, now
  is a good time to remove them.

New patches:

[Document TIMESTAMP-DIFFERENCE and add return type to function docstring
J.P. Larocque <jpl at thoughtcrime.us>**20100504190638] {
hunk ./doc/local-time.texinfo 502
+ at itindex timestamp-difference
+ at defun timestamp-difference time-a time-b
+
+Returns the difference between @var{time-a} and @var{time-b} in
+seconds.  An @code{integer} is returned when the actual difference is
+a whole number; otherwise, a @code{double-float} is returned.
+ at end defun
+
+
hunk ./src/local-time.lisp 926
-  "Returns the difference between TIME-A and TIME-B in seconds"
+  "Returns the difference between TIME-A and TIME-B in seconds.  An INTEGER is returned when the actual difference is a whole number; otherwise, a DOUBLE-FLOAT is returned."
}

[Make TIMESTAMP-DIFFERENCE return RATIONALs.
J.P. Larocque <jpl at thoughtcrime.us>**20100504191252
 
 Previously TIMESTAMP-DIFFERENCE would return an integer if the
 difference was an integer value, or a float if the nanoseconds of the
 difference was non-zero.  It now always returns a rational (and by
 extension an integer if the mathematical value is an integer).
 Clients that don't want the precision of rationals can convert the
 result to a float.
 
 Also remove the carries from second to nsec and from day to second.
 The carries were previously used to normalize nsec (which could have
 been negative) to [0,10^9).  The function then checked whether nsec
 was non-zero, in order to determine whether to return an integer or a
 double-float.  Now that rationals are always returned, there's no need
 to check, and therefore the carries now have no effect on the end
 result.  Since the carries made the code a little bit less clear, now
 is a good time to remove them.
] {
hunk ./doc/local-time.texinfo 505
-Returns the difference between @var{time-a} and @var{time-b} in
-seconds.  An @code{integer} is returned when the actual difference is
-a whole number; otherwise, a @code{double-float} is returned.
+Returns the difference between @var{time-a} and @var{time-b} as a
+ at code{rational} number of seconds.
+
+ at quotation Note
+In prior versions of @name{}, this function returned a
+ at code{double-float} instead of a @code{rational} whenever the result
+was not a whole number.
+ at end quotation
hunk ./src/local-time.lisp 926
-  "Returns the difference between TIME-A and TIME-B in seconds.  An INTEGER is returned when the actual difference is a whole number; otherwise, a DOUBLE-FLOAT is returned."
+  "Returns the difference between TIME-A and TIME-B as a RATIONAL number of seconds."
hunk ./src/local-time.lisp 930
-    (when (minusp nsec)
-      (decf second)
-      (incf nsec 1000000000))
-    (when (minusp second)
-      (decf day)
-      (incf second +seconds-per-day+))
-    (let ((result (+ (* day +seconds-per-day+)
-                     second)))
-      (unless (zerop nsec)
-        ;; this incf turns the result into a float, so only do this when necessary
-        (incf result (/ nsec 1000000000d0)))
-      result)))
+    (+ (* day +seconds-per-day+)
+       second
+       (/ nsec 1000000000))))
}

Context:

[TODO file
attila.lendvai at gmail.com**20100420063102
 Ignore-this: c6136055d112035c5df541adde00d862
] 
[no need to :shadow #:time anymore because it's called time-of-day now
attila.lendvai at gmail.com**20100419193011
 Ignore-this: b7dbc95244891992951f58265ab368aa
] 
[Updated copyright year for probably no reason
Daniel Lowe <dlowe at bitmuse.com>**20100324195045
 Ignore-this: 76fb8af82a60d2f4c0e952febde10363
] 
[Many default offset inconsistencies resolved, more tests pass
Daniel Lowe <dlowe at bitmuse.com>**20100324194517
 Ignore-this: b414446d02273d5e75b9a93bed5ca6fa
] 
[Fixed offset bug in minimize and maximize part functions
Daniel Lowe <dlowe at bitmuse.com>**20100324152342
 Ignore-this: b58b5e69598805c9b30a6b600560ade
] 
[fix parentheses from last patch
jaap at streamtech.nl**20100209114731
 Ignore-this: a70910106b446020eed799cebab65b6c
] 
[roll back my change where adjust-timestamp defaulted to UTC (both are broken, but this way it's at least backwards compatible)
attila.lendvai at gmail.com**20100209102239
 Ignore-this: 63f876b8f1bf5483e874b3dbc0d4e177
] 
[use hu.dwim.stefil for unit testing.
attila.lendvai at gmail.com**20100127081740
 Ignore-this: e5ddf9db232c9723b233e19ba1c9948c
 
 useful things for copy/pasting:
 darcs get http://common-lisp.net/project/alexandria/darcs/alexandria/
 darcs get http://dwim.hu/darcs/hu.dwim.stefil
 (asdf:test-system :local-time)
] 
[follow documentation/ -> doc/ rename in .boring
attila.lendvai at gmail.com**20100127081710
 Ignore-this: 2ea403b64f5ada4b2e9dbb4b013b99b9
] 
[added a (check-type result time-of-day) in cl-postgres integration
attila.lendvai at gmail.com**20100126123531
 Ignore-this: 4750c6ffaa3e8ed41d10fe2fb9d5b229
] 
[renamed 'time to 'time-of-day for less conflict headaches
attila.lendvai at gmail.com**20100126123505
 Ignore-this: 50b518114f386d042701ad92260e4794
] 
[fix valid-date-p
attila.lendvai at gmail.com**20091206211948
 Ignore-this: 207df3b76010adf3a2e749fe9d60db57
] 
[Added date and time types.
levente.meszaros at gmail.com**20091201201849
 Ignore-this: b858bbe9a6b10f4ed106fba83d69e406
] 
[Split local-time.asd and introduce cl-postgres+local-time.asd.
levente.meszaros at gmail.com**20091009161856
 Ignore-this: 3e4521adc1a0afa273c63d304cd6e9c8
] 
[TAG before controversial changes
Daniel Lowe <dlowe at bitmuse.com>**20100126123450
 Ignore-this: 7f2ec6e3a5baa0691637367f1b22aed
] 
[fix test adjust-timestamp/bug3 (PLEASE AUDIT!)
attila.lendvai at gmail.com**20100125122540
 Ignore-this: 6b449034e6c96f245709a808c5e14593
] 
[fix test adjust-timestamp/bug2 (PLEASE AUDIT!)
attila.lendvai at gmail.com**20100125122530
 Ignore-this: 212178187413618cb83e4e7d0bd8658e
] 
[adjust-timestamp defaults to :utc-offset 0 unless timezone is specified. fixes surprises shown by test adjust-timestamp/bug2 (PLEASE AUDIT!)
attila.lendvai at gmail.com**20100125122507
 Ignore-this: 1eff627c0e5d072b89d7119c4426f229
] 
[added adjust-timestamp/bug3
attila.lendvai at gmail.com**20100125121843
 Ignore-this: 2c3cd77b1f107152dd36633734ae4ae
] 
[whitespace
attila.lendvai at gmail.com**20100125120759
 Ignore-this: 341ea584efa430672b4a7fae8368184a
] 
[added test adjust-timestamp/bug2
attila.lendvai at gmail.com**20100124185450
 Ignore-this: 996991645615afe1a9a6be8cef3c7a4f
] 
[Fix SBCL conditional compilation
Jonathan Lee <jonathlee at gmail.com>**20100102181805
 Ignore-this: e084a602df8e1931fff11d4d9f6ba814
] 
[Updated asdf version number to 1.0.1
dlowe at bitmuse.com**20100111031331
 Ignore-this: 17e00a012590c5116fbdeb86566b1786
] 
[added +months-per-year+
attila.lendvai at gmail.com**20091202102038
 Ignore-this: 5c1c99bee45537409939c4da0ada1075
] 
[another take on reread-timezone-repository & co.
attila.lendvai at gmail.com**20091030235517
 Ignore-this: ad00124eea993a623c42e0cd9b6ad81c
] 
[try to make the initialization of *project-home-directory* a bit less fragile when not loading through ASDF
attila.lendvai at gmail.com**20091030093403
 Ignore-this: 5a848c282db52a5edb38df6fdf9c186e
 
 although i personally am much more interested in making local-time load with xcvb, than keeping it in one
 file that can be CL:LOAD'ed...
] 
[make it loadable with (load "local-time.lisp")
attila.lendvai at gmail.com**20091030092409
 Ignore-this: b3aae958e1003af861646fda0f036c9d
] 
[fix #+#. voodoo, one less compilation warning
attila.lendvai at gmail.com**20091030091812
 Ignore-this: b80cc242457896e43c168c9fdc1aadf3
] 
[formatting, semantically NOP
attila.lendvai at gmail.com**20091030091743
 Ignore-this: 6edfb0b406108f1b3cd296a245dac55f
] 
[whitespace changes, one less warning
attila.lendvai at gmail.com**20091029122310
 Ignore-this: 6a319ea0491a85a8bd270a2468c7b47a
] 
[added a deftype for timezone-offset, fix bug reported by Abhishek Reddy and Huw Giddens
attila.lendvai at gmail.com**20091029122004
 Ignore-this: a3e828c02dcdf1d195311cfe5305ec6f
 
 http://common-lisp.net/pipermail/local-time-devel/2009-October/000173.html
] 
[some tests
attila.lendvai at gmail.com**20091029121803
 Ignore-this: 9c510d5a16519beeeed2738d290742a1
] 
[Don't discard value of sb-ext:get-time-of-day
Daniel Lowe <dlowe at bitmuse.com>**20091022155025
 Ignore-this: 565ad4c1ee49c11d900c3e1781e9f6e0
] 
[Provide support for formatting the day as an ordinal (e.g. 1st, 22nd)
Daniel White <daniel at whitehouse.id.au>**20091022132601
 Ignore-this: c166703967661a3d7e32a4489184fdd4
] 
[fix test: reread-timezone-repository is not public in local-time package (anymore?)
attila.lendvai at gmail.com**20091005090107
 Ignore-this: 8e3f2381c3c11afdd5123055e332f904
] 
[comments
attila.lendvai at gmail.com**20091002083019
 Ignore-this: 855a9b7004e33350c0a0394e242f459d
] 
[ccl-windows-without-gettimeofday
essdir at web.de**20090901164212
 Ignore-this: b6df4f6bd69eff0d6fd18dc1a90097e7
] 
[Minor bugfix: :utc-offset instead of :offset
Maciej Katafiasz <mathrick at gmail.com>**20090808135148
 Ignore-this: e20b7cff5ec220a83bd112265b06f99f
] 
[follow the format-rfcnumber-timestring nameing convention, rename format-http-timestring
attila.lendvai at gmail.com**20090928091959
 Ignore-this: a35c5d543cabb520ff676c9a490f1cb2
] 
[Make timestamp manipulation functions take and respect timezone arguments.
Maciej Katafiasz <mathrick at gmail.com>**20090727180103
 Ignore-this: 79214728e4966f44d8d4587bd850c53b
] 
[Make WITH-DECODED-TIMESTAMP and related take timezone/offset arguments.
Maciej Katafiasz <mathrick at gmail.com>**20090727175400
 Ignore-this: 296084f8d9179fe257c69118b7123309
] 
[Make ENCODE-TIMESTAMP accept timezones instead of fixed offsets.
Maciej Katafiasz <mathrick at gmail.com>**20090727174013
 Ignore-this: f6420e93d194396afb221821e1312652
] 
[update TODO, add link to chronicity
attila.lendvai at gmail.com**20090729181326
 Ignore-this: aa290ebfb4f6001600cf33a228a99a41
] 
[Use symbols instead of strings where possible.
Maciej Katafiasz <mathrick at gmail.com>**20090724164920] 
[added a once failing test
attila.lendvai at gmail.com**20090616143818
 Ignore-this: 741ad01d47b47e15cb4877567d3ba9d9
] 
[add a more useful error when find-timezone-by-location-name is used without reading in the timezone files
attila.lendvai at gmail.com**20090616143733
 Ignore-this: c982ca27ef16e7f865afece963b6c9be
] 
[fix (print (now)) when *timezone* is (find-timezone-by-location-name "UTC")
attila.lendvai at gmail.com**20090616141707
 Ignore-this: ac694826aa5e9719d41c51503e0a8785
] 
[clean up gettimeofday stuff, follow sbcl's changes (but remain backward compatible)
attila.lendvai at gmail.com**20090521170712
 Ignore-this: 70b2754c0a254abb060dce0f15bb266
] 
[remove superfluous eval-when around reread-timezone-repository
attila.lendvai at gmail.com**20090513213236
 Ignore-this: 337cf4b3d50d0714f2c4a4a3d84e356f
] 
[Local-time now passes all tests in CCL
Daniel Lowe <dlowe at bitmuse.com>**20090417142203] 
[Changed lispworks/ccl kluge to another, better kluge
Daniel Lowe <dlowe at bitmuse.com>**20090417142156] 
[In WITH-DECODED-TIMESTAMP, declare nsec type as ranged integer instead of FIXNUM
Daniel Lowe <dlowe at bitmuse.com>**20090416204555] 
[clarification comment for the lispworks #_ situation
attila.lendvai at gmail.com**20090324135651
 Ignore-this: 1f97d85c23ecffd5806f7a3c137f8491
] 
[Less intrusive version of the Lispworks patch for #_.
Larry Clapp <larry at theclapp.org>**20090324132813
 
 Use an around method in ASDF's compile-op to set the readtable to ignore #_.
 This achieves the same end, but more elegantly, and doesn't pollute the
 regular readtable.
] 
[be more conservative when installing global reader macros as a lispwork workaround
attila.lendvai at gmail.com**20090323142133
 Ignore-this: dca64a6f7daa4d478beba41d1c102a16
] 
[Work with Lispworks
Larry Clapp <larry at theclapp.org>**20090323132602
 
 - Added a dummy reader macro for #_ so the
 
     #+ccl
     (... #_gettimeofday ... )
     
   doesn't break the compile
 - Fix %unix-gettimeofday for Lisps other than CMU, SBCL, and CCL.
] 
[TAG local-time-1.0.1
Daniel Lowe <dlowe at bitmuse.com>**20090312154109] 
Patch bundle hash:
a18ffd55d6ce7d3fe20d55413e2b95a3b27b6f1f


More information about the local-time-devel mailing list