On 11/1/12 9:31 AM, Mark Wills wrote:
> I also thought $= was quite useful,
COMPARE is fine by me, I already have it so $= is redundant.
Nonetheless...
> so I set about writing a version.
> I found it quite torturous to write! I'd be interested to see other
> versions.
>
> : $= ( addr1 len1 addr2 len2 -- flag)
> 2 pick <> if drop 2drop false else rot begin
> dup c@ >r 1+ -rot dup c@ >r 1+ -rot
> r> r> = if 1- else drop -1 then dup >r -rot
> r> 0<= until then ;
This crashes for me. Here's a dump:
s" }}" s" }}" $= .
( 4 ) \ -1073750320 \ 2 \ -1073750318 \ 2
2 ( 5 ) \ -1073750320 \ 2 \ -1073750318 \ 2 \ 2
pick ( 5 ) \ -1073750320 \ 2 \ -1073750318 \ 2 \ 2
<> ( 4 ) \ -1073750320 \ 2 \ -1073750318 \ 0
if ( 3 ) \ -1073750320 \ 2 \ -1073750318
rot ( 3 ) \ 2 \ -1073750318 \ -1073750320
begin ( 3 ) \ 2 \ -1073750318 \ -1073750320
dup ( 4 ) \ 2 \ -1073750318 \ -1073750320 \ -1073750320
c@ ( 4 ) \ 2 \ -1073750318 \ -1073750320 \ 125
>r ( 3 ) \ 2 \ -1073750318 \ -1073750320
1+ ( 3 ) \ 2 \ -1073750318 \ -1073750319
-rot ( 3 ) \ -1073750319 \ 2 \ -1073750318
dup ( 4 ) \ -1073750319 \ 2 \ -1073750318 \ -1073750318
c@ ( 4 ) \ -1073750319 \ 2 \ -1073750318 \ 125
>r ( 3 ) \ -1073750319 \ 2 \ -1073750318
1+ ( 3 ) \ -1073750319 \ 2 \ -1073750317
-rot ( 3 ) \ -1073750317 \ -1073750319 \ 2
r> ( 4 ) \ -1073750317 \ -1073750319 \ 2 \ 125
r> ( 5 ) \ -1073750317 \ -1073750319 \ 2 \ 125 \ 125
= ( 4 ) \ -1073750317 \ -1073750319 \ 2 \ -1
if ( 3 ) \ -1073750317 \ -1073750319 \ 2
1- ( 3 ) \ -1073750317 \ -1073750319 \ 1
else ( 3 ) \ -1073750317 \ -1073750319 \ 1
dup ( 4 ) \ -1073750317 \ -1073750319 \ 1 \ 1
>r ( 3 ) \ -1073750317 \ -1073750319 \ 1
-rot ( 3 ) \ 1 \ -1073750317 \ -1073750319
r> ( 4 ) \ 1 \ -1073750317 \ -1073750319 \ 1
0< ( 4 ) \ 1 \ -1073750317 \ -1073750319 \ 0
= ( 3 ) \ 1 \ -1073750317 \ 0
until ( 2 ) \ 1 \ -1073750317
dup ( 3 ) \ 1 \ -1073750317 \ -1073750317
c@ ( 3 ) \ 1 \ -1073750317 \ 125
>r ( 2 ) \ 1 \ -1073750317
1+ ( 2 ) \ 1 \ -1073750316
-rot ( 2 ) \ -1073750320 \ 1
dup ( 3 ) \ -1073750320 \ 1 \ 1
c@
Largely untested:
: $= ( addr1 len1 addr2 len2 -- flag)
rot \ addr1 addr2 len2 len1
over \ addr1 addr2 len2 len1 len2
<> if 2drop drop 0 exit then \ out if len1<>len2
\ addr1 addr2 len2
over + swap \ addr1 addr2+len2 addr2
?do dup c@ i c@ <> if drop 0 unloop exit then loop
drop true ;
Some define "over + swap" as bounds.
-Doug