Liste des Groupes | Revenir à cl forth |
On 2024-10-06 15:59, dxf wrote:Oh, I missed your definition for ">INT", because you use ">int" (sic lower case) in your definition for ".T"On 6/10/2024 9:48 pm, Ruvim wrote:You did not provide output for test cases.On 2024-10-06 11:51, dxf wrote:>Is there an easier way of doing this? End goal is a double number representing centi-secs.>
>
>
empty decimal
>
: SPLIT ( a u c -- a2 u2 a3 u3 ) >r 2dup r> scan 2swap 2 pick - ;
: >INT ( adr len -- u ) 0 0 2swap >number 2drop drop ;
>
: /T ( a u -- $hour $min $sec )
2 0 do [char] : split 2swap dup if 1 /string then loop
2 0 do dup 0= if 2rot 2rot then loop ;
>
: .T 2swap 2rot cr >int . ." hr " >int . ." min " >int . ." sec " ;
>
s" 1:2:3" /t .t
s" 02:03" /t .t
s" 03" /t .t
s" 23:59:59" /t .t
s" 0:00:03" /t .t
>
I would use `split-string` factor as:
>
: /t ( sd.time -- sd.hour sd.min sd.sec )
s" :" split-string
s" :" split-string
;
>
\ Where
>
: split-string
( sd.text sd.separator -- sd.left sd.right | sd.text 0 0 )
dup >r 3 pick >r ( R: u.[sd.separator][1] addr.[st.text][2] )
search 0= if 2rdrop 0 0 exit then ( addr u )
over r@ - r> swap 2swap r> /string
;
It fails with s" 03". The test case may be unreasonable so I tried
s" :03" however it also fails. The complication is most tools scan
from the beginning whereas we would like to scan from the end.
I expect that "03" is equivalent to "03:00:00", which means 3 hours, 0 minutes, 0 seconds.
And ":03" is equivalent to "00:03:00", which means 0 hours, 3 minutes, 0 seconds.
My above implementation for `/t` produces:
s" 1:2:3" /t .t \ "1 hr 2 min 3 sec"
s" 02:03" /t .t \ "2 hr 3 min 0 sec"
s" 03" /t .t \ "3 hr 0 min 0 sec"
s" :03" /t .t \ "0 hr 3 min 0 sec"
What is wrong?
Maybe your `>int` works incorrectly with an empty string?
For testing I use:
: >int ( sd.number -- u ) 0. 2swap >number 2drop drop ;
\ the empty string produces 0
Les messages affichés proviennent d'usenet.