job-specifier: Preserve '%find-best-next' arguments exactness
The behavior of the 'min' procedure which converts its parameters to
inexact numbers when at least one of them is inexact was causing
'%find-best-next' to always return real numbers.
* src/mcron/job-specifier.scm (%find-best-next): Preserve the exactness
of numbers in NEXT-LIST.
* tests/job-specifier.scm ("%find-best-next: exact"): New test.
Reported-by: Ludovic Courtès <ludo@gnu.org>
This commit is contained in:
parent
e66f0dcdd6
commit
fad58ca8c2
2 changed files with 16 additions and 3 deletions
|
|
@ -60,12 +60,16 @@ go into the list. For example, (range 1 6 2) returns '(1 3 5)."
|
|||
;; consisting of the smallest element of the NEXT-LIST, and the smallest
|
||||
;; element larger than the CURRENT value. If an example of the latter
|
||||
;; cannot be found, +INF.0 will be returned.
|
||||
(define (exact-min a b)
|
||||
;; An implement of 'min' which preserves the exactness its arguments.
|
||||
(if (< a b) a b))
|
||||
|
||||
(let loop ((smallest (inf)) (closest+ (inf)) (lst next-list))
|
||||
(match lst
|
||||
(() (cons smallest closest+))
|
||||
((time . rest)
|
||||
(loop (min time smallest)
|
||||
(if (> time current) (min time closest+) closest+)
|
||||
(loop (exact-min time smallest)
|
||||
(if (> time current) (exact-min time closest+) closest+)
|
||||
rest)))))
|
||||
|
||||
(define (bump-time time value-list component higher-component
|
||||
|
|
|
|||
|
|
@ -16,7 +16,8 @@
|
|||
;;; You should have received a copy of the GNU General Public License
|
||||
;;; along with GNU Mcron. If not, see <http://www.gnu.org/licenses/>.
|
||||
|
||||
(use-modules (srfi srfi-64)
|
||||
(use-modules (ice-9 match)
|
||||
(srfi srfi-64)
|
||||
(mcron job-specifier))
|
||||
|
||||
(test-begin "job-specifier")
|
||||
|
|
@ -40,4 +41,12 @@
|
|||
(test-assert "range: reverse boundaries"
|
||||
(range 10 3))
|
||||
|
||||
(define %find-best-next (@@ (mcron job-specifier) %find-best-next))
|
||||
|
||||
(test-assert "%find-best-next: exact"
|
||||
;; Ensure that '%find-best-next' preserves the exactness of the numbers
|
||||
;; inside the NEXT-LIST argument.
|
||||
(match (pk 'match (%find-best-next 1 '(0 2)))
|
||||
((a . b) (and (exact? a) (exact? b)))))
|
||||
|
||||
(test-end)
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue