anti-aliasing fixes
This commit is contained in:
parent
93f8fe8c5c
commit
81d87d51a9
|
@ -101,7 +101,8 @@ The following kinds of sequences are supported by this facility:
|
||||||
Absequences carry a SEQUENCE-BEHAVIOR record that contains MAKER,
|
Absequences carry a SEQUENCE-BEHAVIOR record that contains MAKER,
|
||||||
PREDICATE, etc. procedures. They are the official backdoor where
|
PREDICATE, etc. procedures. They are the official backdoor where
|
||||||
user-defined sequence types enter the general sequence lib. There are
|
user-defined sequence types enter the general sequence lib. There are
|
||||||
Examples.
|
Examples. [ The Examples demonstrate how one might introduce hidden
|
||||||
|
aliasing, i.e. shared subsequences, and break some banged procedures ... ]
|
||||||
|
|
||||||
*
|
*
|
||||||
|
|
||||||
|
@ -299,6 +300,8 @@ S1 = < s0[start+i] : i in [0:end-start) >.
|
||||||
(sequence-copy! s1 start1 s0 [start0 end0]) --> unspec
|
(sequence-copy! s1 start1 s0 [start0 end0]) --> unspec
|
||||||
|
|
||||||
Synopsis: Set s1[start1 + i] := s0[start0 + i] for 0 <= i < end0 - start0.
|
Synopsis: Set s1[start1 + i] := s0[start0 + i] for 0 <= i < end0 - start0.
|
||||||
|
Assignment is parallel -- if there's no hidden aliasing (s1[j] and s0[k]
|
||||||
|
referring to the same location although j ~= k).
|
||||||
|
|
||||||
*
|
*
|
||||||
|
|
||||||
|
@ -373,6 +376,7 @@ arg. ]
|
||||||
|
|
||||||
Synopsis: Set s1[start1 + i] := (proc s0[start0 + i])
|
Synopsis: Set s1[start1 + i] := (proc s0[start0 + i])
|
||||||
for 0 <= i < end1 - start1, return s1.
|
for 0 <= i < end1 - start1, return s1.
|
||||||
|
Assignment is parallel -- if there's no hidden aliasing.
|
||||||
|
|
||||||
Attention: differing from CL's MAP-INTO, these procs expect
|
Attention: differing from CL's MAP-INTO, these procs expect
|
||||||
end1 - start1 <= s0.length - start0, i.e. the destination S1 drives the
|
end1 - start1 <= s0.length - start0, i.e. the destination S1 drives the
|
||||||
|
@ -390,6 +394,7 @@ Synopsis: Set s1[i] := (proc s00[i] ...) for i in [0:s1.length), return s1.
|
||||||
|
|
||||||
Attention: differing from CL's MAP-INTO, these procs expect the sequences
|
Attention: differing from CL's MAP-INTO, these procs expect the sequences
|
||||||
S00, ... to be no less long than the destination S1, like MAP! in SRFI-1.
|
S00, ... to be no less long than the destination S1, like MAP! in SRFI-1.
|
||||||
|
Doesn't cope with absequent aliasing problems.
|
||||||
|
|
||||||
*
|
*
|
||||||
|
|
||||||
|
|
|
@ -80,16 +80,28 @@
|
||||||
s opts))
|
s opts))
|
||||||
|
|
||||||
|
|
||||||
|
;; for internal use
|
||||||
|
(define (%sequence-copy! s1 start1 s0 start0 end0)
|
||||||
|
(if (<= start1 start0)
|
||||||
|
(do ((i0 start0 (+ i0 1))
|
||||||
|
(i1 start1 (+ i1 1)))
|
||||||
|
((= i0 end0) (unspecific))
|
||||||
|
(sequence-set! s1 i1 (sequence-ref s0 i0)))
|
||||||
|
(let ((end1 (+ start1 (- end0 start0))))
|
||||||
|
(do ((i0 (- end0 1) (- i0 1))
|
||||||
|
(i1 (- end1 1) (- i1 1)))
|
||||||
|
((= i0 (- start0 1)) (unspecific))
|
||||||
|
(sequence-set! s1 i1 (sequence-ref s0 i0))))))
|
||||||
|
|
||||||
|
|
||||||
(define (sequence-copy! s1 start1 s0 . opts)
|
(define (sequence-copy! s1 start1 s0 . opts)
|
||||||
(let-optionals opts ((start0 0) (end0 (sequence-length s0)))
|
(let-optionals opts ((start0 0) (end0 (sequence-length s0)))
|
||||||
(assert (<= 0 start0 end0 (sequence-length s0))
|
(assert (<= 0 start0 end0 (sequence-length s0))
|
||||||
sequence-copy!)
|
sequence-copy!)
|
||||||
(assert (<= 0 start1 (+ start1 (- end0 start0)) (sequence-length s1))
|
(assert (<= 0 start1 (+ start1 (- end0 start0)) (sequence-length s1))
|
||||||
sequence-copy!)
|
sequence-copy!)
|
||||||
(do ((i0 start0 (+ i0 1))
|
(%sequence-copy! s1 start1 s0 start0 end0)
|
||||||
(i1 start1 (+ i1 1)))
|
))
|
||||||
((= i0 end0) (unspecific))
|
|
||||||
(sequence-set! s1 i1 (sequence-ref s0 i0)))))
|
|
||||||
|
|
||||||
;; ...
|
;; ...
|
||||||
(define (subsequence s start end)
|
(define (subsequence s start end)
|
||||||
|
@ -209,20 +221,31 @@
|
||||||
proc seq seqs))
|
proc seq seqs))
|
||||||
|
|
||||||
|
|
||||||
|
;; for internal use
|
||||||
|
(define (%sequence-map-into! s1 proc s0 start1 end1 start0)
|
||||||
|
(if (<= start1 start0)
|
||||||
|
(do ((i0 start0 (+ i0 1))
|
||||||
|
(i1 start1 (+ i1 1)))
|
||||||
|
((= i1 end1) s1)
|
||||||
|
(sequence-set! s1 i1 (proc (sequence-ref s0 i0))))
|
||||||
|
(let ((end0 (+ start0 (- end1 start1))))
|
||||||
|
(do ((i0 (- end0 1) (- i0 1))
|
||||||
|
(i1 (- end1 1) (- i1 1)))
|
||||||
|
((= i0 (- start0 1)) s1)
|
||||||
|
(sequence-set! s1 i1 (proc (sequence-ref s0 i0)))))))
|
||||||
|
|
||||||
|
|
||||||
(define (sequence-map-into! s1 proc s0 . opts)
|
(define (sequence-map-into! s1 proc s0 . opts)
|
||||||
(let-optionals opts ((start1 0)
|
(let-optionals opts ((start1 0)
|
||||||
(end1 (sequence-length s1))
|
(end1 (sequence-length s1))
|
||||||
(start0 0))
|
(start0 0))
|
||||||
(assert (<= 0 start0 (sequence-length s0))
|
(assert (<= 0 start0 (sequence-length s0))
|
||||||
sequence-map-into!)
|
sequence-map-into!)
|
||||||
(assert (<= 0 start1 (sequence-length s1))
|
(assert (<= 0 start1 end1 (sequence-length s1))
|
||||||
sequence-map-into!)
|
sequence-map-into!)
|
||||||
(assert (<= (- end1 start1) (- (sequence-length s0) start0))
|
(assert (<= (- end1 start1) (- (sequence-length s0) start0))
|
||||||
sequence-map-into!)
|
sequence-map-into!)
|
||||||
(do ((i0 start0 (+ i0 1))
|
(%sequence-map-into! s1 proc s0 start1 end1 start0)))
|
||||||
(i1 start1 (+ i1 1)))
|
|
||||||
((= i1 end1) s1)
|
|
||||||
(sequence-set! s1 i1 (proc (sequence-ref s0 i0))))))
|
|
||||||
|
|
||||||
|
|
||||||
(define (sequences-map-into! seq proc . seqs)
|
(define (sequences-map-into! seq proc . seqs)
|
||||||
|
|
Loading…
Reference in New Issue