From a9383f64418867b5b69f792dd71db532559df63c Mon Sep 17 00:00:00 2001 From: JackChen <17683835261@163.com> Date: Tue, 10 Feb 2026 09:27:09 +0800 Subject: [PATCH 1/4] time-difference --- goldfish/srfi/srfi-19.scm | 31 +++++++++++++++++- tests/goldfish/liii/time-test.scm | 53 +++++++++++++++++++++++++++++++ 2 files changed, 83 insertions(+), 1 deletion(-) diff --git a/goldfish/srfi/srfi-19.scm b/goldfish/srfi/srfi-19.scm index 8ccbe89e..9272b992 100644 --- a/goldfish/srfi/srfi-19.scm +++ b/goldfish/srfi/srfi-19.scm @@ -66,6 +66,7 @@ copy-time ;; Time comparison procedures ;; Time arithmetic procedures + time-difference ;; Current time and clock resolution current-date current-julian-day current-time time-resolution ;; Date object and accessors @@ -155,7 +156,35 @@ ;; Time arithmetic procedures ;; ==================== - ;; TODO + (define (priv:time->nanoseconds time) + (+ (* (time-second time) priv:NANO) + (time-nanosecond time))) + + (define (priv:nanoseconds->values nanoseconds) + (receive (sec ns) (floor/ nanoseconds priv:NANO) + (values ns sec))) + + (define (priv:time-difference time1 time2 time3) + (unless (and (time? time1) (time? time2)) + (error 'wrong-type-arg "time-difference: time1 and time2 must be time objects" (list time1 time2))) + (unless (eq? (time-type time1) (time-type time2)) + (error 'wrong-type-arg "time-difference: time types must match" + (list (time-type time1) (time-type time2)))) + (set-time-type! time3 TIME-DURATION) + (if (and (= (time-second time1) (time-second time2)) + (= (time-nanosecond time1) (time-nanosecond time2))) + (begin + (set-time-second! time3 0) + (set-time-nanosecond! time3 0)) + (receive (nanos secs) + (priv:nanoseconds->values (- (priv:time->nanoseconds time1) + (priv:time->nanoseconds time2))) + (set-time-second! time3 secs) + (set-time-nanosecond! time3 nanos))) + time3) + + (define (time-difference time1 time2) + (priv:time-difference time1 time2 (%make-time TIME-DURATION 0 0))) ;; ==================== ;; Current time and clock resolution diff --git a/tests/goldfish/liii/time-test.scm b/tests/goldfish/liii/time-test.scm index 86e5b1c9..267583ec 100644 --- a/tests/goldfish/liii/time-test.scm +++ b/tests/goldfish/liii/time-test.scm @@ -339,6 +339,59 @@ wrong-type-arg (check (time-nanosecond t3) => 0) (check (time-second t3) => -1234567890)) +#| +time-difference +计算两个时间对象的差值。 + +语法 +---- +(time-difference time1 time2) + +参数 +---- +time1 : time? +time2 : time? +两个时间对象,类型必须相同。 + +返回值 +----- +time? +返回一个 TIME-DURATION 类型的时间对象。 + +错误处理 +-------- +wrong-type-arg +当参数不是时间对象或类型不匹配时抛出错误。 +|# + +;; Test time-difference +(let* ((t1 (make-time TIME-UTC 100 5)) + (t2 (make-time TIME-UTC 900000000 3)) + (d (time-difference t1 t2))) + (check (time-type d) => TIME-DURATION) + (check (time-second d) => 1) + (check (time-nanosecond d) => 100000100)) + +;; Test negative duration normalization +(let* ((t1 (make-time TIME-UTC 100 5)) + (t2 (make-time TIME-UTC 900000000 5)) + (d (time-difference t1 t2))) + (check (time-second d) => -1) + (check (time-nanosecond d) => 100000100)) + +;; Test zero difference +(let* ((t1 (make-time TIME-UTC 123456789 42)) + (d (time-difference t1 t1))) + (check (time-second d) => 0) + (check (time-nanosecond d) => 0)) + +;; Test error conditions +(check-catch 'wrong-type-arg + (time-difference (make-time TIME-UTC 0 0) + (make-time TIME-TAI 0 0))) +(check-catch 'wrong-type-arg + (time-difference "not-time" (make-time TIME-UTC 0 0))) + ;; Test error conditions (check-catch 'wrong-type-arg (time-type "not-a-time")) (check-catch 'wrong-type-arg (time-nanosecond 123)) From d0022eb816b377d8d0e59d4b508d668c34edbe1c Mon Sep 17 00:00:00 2001 From: JackChen <17683835261@163.com> Date: Wed, 11 Feb 2026 09:30:34 +0800 Subject: [PATCH 2/4] time-difference --- devel/210_13.md | 16 ++++++++++++++++ goldfish/srfi/srfi-19.scm | 21 ++++++--------------- 2 files changed, 22 insertions(+), 15 deletions(-) create mode 100644 devel/210_13.md diff --git a/devel/210_13.md b/devel/210_13.md new file mode 100644 index 00000000..18f9f4b1 --- /dev/null +++ b/devel/210_13.md @@ -0,0 +1,16 @@ +# [210_13] srfi-19 time-difference实现 + +## 添加 srfi-19 time-difference实现 + + +## 如何测试 + +```shell +# 可能需要清除缓存 +# rm .xmake/ build/ -r +xmake f -vyD +xmake b goldfish +./bin/goldfish tests/goldfish/liii/time-test.scm +``` + + diff --git a/goldfish/srfi/srfi-19.scm b/goldfish/srfi/srfi-19.scm index 9272b992..e0b6d676 100644 --- a/goldfish/srfi/srfi-19.scm +++ b/goldfish/srfi/srfi-19.scm @@ -160,27 +160,18 @@ (+ (* (time-second time) priv:NANO) (time-nanosecond time))) - (define (priv:nanoseconds->values nanoseconds) - (receive (sec ns) (floor/ nanoseconds priv:NANO) - (values ns sec))) - (define (priv:time-difference time1 time2 time3) (unless (and (time? time1) (time? time2)) (error 'wrong-type-arg "time-difference: time1 and time2 must be time objects" (list time1 time2))) (unless (eq? (time-type time1) (time-type time2)) (error 'wrong-type-arg "time-difference: time types must match" (list (time-type time1) (time-type time2)))) - (set-time-type! time3 TIME-DURATION) - (if (and (= (time-second time1) (time-second time2)) - (= (time-nanosecond time1) (time-nanosecond time2))) - (begin - (set-time-second! time3 0) - (set-time-nanosecond! time3 0)) - (receive (nanos secs) - (priv:nanoseconds->values (- (priv:time->nanoseconds time1) - (priv:time->nanoseconds time2))) - (set-time-second! time3 secs) - (set-time-nanosecond! time3 nanos))) + (receive (secs nanos) + (floor/ (- (priv:time->nanoseconds time1) + (priv:time->nanoseconds time2)) + priv:NANO) + (set-time-second! time3 secs) + (set-time-nanosecond! time3 nanos)) time3) (define (time-difference time1 time2) From 5c6e82b497776c10320f90c7518aedd98286ee39 Mon Sep 17 00:00:00 2001 From: JackChen <17683835261@163.com> Date: Wed, 11 Feb 2026 09:32:18 +0800 Subject: [PATCH 3/4] =?UTF-8?q?=E6=96=87=E6=A1=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- devel/210_13.md | 1 - 1 file changed, 1 deletion(-) diff --git a/devel/210_13.md b/devel/210_13.md index 18f9f4b1..1b798369 100644 --- a/devel/210_13.md +++ b/devel/210_13.md @@ -2,7 +2,6 @@ ## 添加 srfi-19 time-difference实现 - ## 如何测试 ```shell From 84c88723e56904237119c0963d5b6f1f3e7ba76d Mon Sep 17 00:00:00 2001 From: JackChen <17683835261@163.com> Date: Wed, 11 Feb 2026 09:43:22 +0800 Subject: [PATCH 4/4] =?UTF-8?q?=E6=97=B6=E9=97=B4=E7=B1=BB=E5=9E=8B?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- tests/goldfish/liii/time-test.scm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tests/goldfish/liii/time-test.scm b/tests/goldfish/liii/time-test.scm index 267583ec..b3e4ce7e 100644 --- a/tests/goldfish/liii/time-test.scm +++ b/tests/goldfish/liii/time-test.scm @@ -351,17 +351,17 @@ time-difference ---- time1 : time? time2 : time? -两个时间对象,类型必须相同。 +两个时间对象,时间类型必须相同。 返回值 ----- time? -返回一个 TIME-DURATION 类型的时间对象。 +返回一个 TIME-DURATION 时间类型的时间对象。 错误处理 -------- wrong-type-arg -当参数不是时间对象或类型不匹配时抛出错误。 +当参数不是时间对象或时间类型不匹配时抛出错误。 |# ;; Test time-difference