Generalized arrays in the presence of call/cc
Bradley Lucier
(27 Jul 2022 12:39 UTC)
|
Re: Generalized arrays in the presence of call/cc
Marc Nieper-Wißkirchen
(27 Jul 2022 13:15 UTC)
|
Re: Generalized arrays in the presence of call/cc Bradley Lucier (27 Jul 2022 15:11 UTC)
|
Re: Generalized arrays in the presence of call/cc
John Cowan
(27 Jul 2022 20:19 UTC)
|
Re: Generalized arrays in the presence of call/cc
Marc Nieper-Wißkirchen
(27 Jul 2022 21:04 UTC)
|
Re: Generalized arrays in the presence of call/cc
Bradley Lucier
(28 Jul 2022 21:47 UTC)
|
Re: Generalized arrays in the presence of call/cc
John Cowan
(30 Jul 2022 15:33 UTC)
|
Re: Generalized arrays in the presence of call/cc
Marc Nieper-Wißkirchen
(30 Jul 2022 17:06 UTC)
|
Re: Generalized arrays in the presence of call/cc
Bradley Lucier
(30 Jul 2022 19:48 UTC)
|
Re: Generalized arrays in the presence of call/cc
Bradley Lucier
(06 Aug 2022 17:58 UTC)
|
Re: Generalized arrays in the presence of call/cc
John Cowan
(06 Aug 2022 18:05 UTC)
|
Re: Generalized arrays in the presence of call/cc
Bradley Lucier
(10 Aug 2022 18:27 UTC)
|
On 7/27/22 9:15 AM, Marc Nieper-Wißkirchen wrote: > The specification of `map` and `vector-map` in the R7RS is archetypical > for such well-behavedness of higher-order procedures. Thanks for the pointer. For vector-map it says: If multiple returns occur from vector-map, the values returned by earlier returns are not mutated. I think the following implementation satisfies this condition, but I don't think it's what people had in mind: (define (screwy-vector-map f v) (let* ((n (vector-length v)) (temp (make-vector n))) (do ((i 0 (fx+ i 1))) ((fx= i n) (vector-copy temp)) (vector-set! temp i (f (vector-ref v i)))))) It appears that if f in (screwy-vector-map f v) captures continuations for different values of i, say k0 with i=3 and k1 with i=5, and then f returns different values depending on which continuation it's following, then what k0 and k1 return may depend on whether k0 is called before k1 or vice versa. But once a value is returned by the original call to screwy-vector-map or by k0 or k1, it is never changed by calls to k0 or k1 (because of the call to vector-copy). (I spent about 20 minutes working on a specific example but thought it would be simpler just to post this email, because screwy-vector-map is just supposed to be illustrative.) So I'm beginning to be suspicious of any code that has *-set! in it. But it appears to me that the loops beginning at the lines https://github.com/scheme-requests-for-implementation/srfi-231/blob/f8bdf64e755216cba4722925a3b234f67b3e3e09/generic-arrays.scm#L787 and https://github.com/scheme-requests-for-implementation/srfi-231/blob/f8bdf64e755216cba4722925a3b234f67b3e3e09/generic-arrays.scm#L888 are call/cc save, even though I use set! to compute the arguments to the procedure f. Do people disagree with this assessment? Brad