SRFI 122 draft 12 comments
Sudarshan S Chawathe
(25 Sep 2016 00:00 UTC)
|
Re: SRFI 122 draft 12 comments Bradley Lucier (26 Sep 2016 20:37 UTC)
|
array-fold-{left|right} and array-reverse
Bradley Lucier
(29 Sep 2016 18:15 UTC)
|
For draft 14 (Re: SRFI 122 draft 12 comments)
Sudarshan S Chawathe
(03 Dec 2016 22:06 UTC)
|
Re: For draft 14 (Re: SRFI 122 draft 12 comments)
Bradley Lucier
(09 Dec 2016 18:28 UTC)
|
Thank you for your comments. My responses are interspersed. Changes are in my local copy for now, which I will put on github later. On 09/24/2016 08:00 PM, Sudarshan S Chawathe wrote: > These comments refer to Draft #12 published: 2016/9/17. > > Most, but not all, are very minor. The comments are in roughly document > order, not significance order, so I hope folks won't punt on the whole > message because of the nitpicky/trivial nature of the first few. (They > get better, I think!) > > I'm sorry to get these in so late given today's "last call" deadline. > As such, they are the result of a rather rushed reading, and so are > somewhat more likely than usual to reflect problems at my end. I'll > also note that I have only skimmed the previous messages on the list, so > it is possible some items have been discussed already. > > * (trivial, naming) Is the ->vector part of the name > interval-lower-bounds->vector (and interval-upper-bounds->vector) > motivated by the need to distinguish it clearly from > interval-lower-bound (and interval-upper-bound)? Otherwise, it > seems interval-lower-bounds (and interval-upper-bounds) would be > more natural, since the objects provided to make-interval are > vectors. Originally I had *->list and *->vector procedures. Both these procedures provided new copies of the data. I then followed a suggestion to get rid of the *->list procedures. John Cowan suggested that I say what happened if someone later modifies an argument to make-interval or the result of the *->vector procedures; the answer is nothing, I make a copy of the vectors going in and a copy of the arguments coming out. So, should I now rename the *->vector procedures? > > * (trivial, formatting) Odd formatting for code explaining > interval-volume. (Probably a missing 'pre' tag.) > > (apply * (vector->list > (vector-map - > (interval-upper-bounds->vector interval) > (interval-lower-bounds->vector interval))) > > A similar comment applies to the code that explains > generic-storage-class. There are a few other similar instances > elsewhere in the document. Some places I use <pre>, some places I use <blockquote>, <code>, and <var> (mainly where the code involves arguments to procedures). I changed this one instance to make it clearer. > > * (minor) Should the signature for interval-contains-multi-index? read > > interval-contains-multi-index? interval index-0 index-1 ... > > following the Scheme reports convention (I think) that ... denotes > 0-or-more of the preceding? (The following text does clarify the > point, since d > 0, so this change would just emphasize the point.) Changed. > > * interval-curry: In the explanation, there is an instance of > left-dimension that should probably read right-dimension. Fixed. > > * (minor) interval-for-each: It was not initially clear to me > whether the procedure f is required to accept multi-indices > separately (one argument per dimension) or combined as a single > list of indices. Given the definition of an interval as a set of > multi-indices, I interpreted an element of an interval to be a > tuple/list of indices and so was leaning toward the latter, but > the sample implementation implies the former. It could just be my > misreading of earlier material, though. (A similar comment applies > to interval-reduce.) A multi-index is not a list, it is what's returned by "values". What "values" returns is not reified in Scheme, it can only be consumed in a closure accepting multiple values. If you want to call what's returned by "values" a tuple, then a multi-index is a tuple, not a list. I realized that interval-reduce can be defined in terms of array-reduce (just introduce an appropriate array by (make-array interval f) and apply array-reduce), so I eliminated interval-reduce > > * (nit) interval-permute: The correspondence is obvious, but the > text here refers to the dimension of the permutation while the > definition of permutations earlier calls it length. I changed the earlier reference to refer to the "dimension" of a permutation. > > * make-array: In the second and third paragraphs of the explanation, > 'array' should read 'make-array'. There are a couple more > instances in the paragraph just before the example too. Fixed (I think). > > * array-map: Should the constraints on f be noted (although they > can be inferred)? I added a sentence of explanation. > > * array-curry: There seems to be a missing pair of parentheses in > the example. I believe > > (equal? ((array-getter A) i j k l) > (array-getter ((array-getter B) i j k) l)) > > should read > > (equal? ((array-getter A) i j k l) > ((array-getter ((array-getter B) i j k)) l)) > > instead. Fixed. > > * array-curry: Defining A and B as in the example, I get an error > when I attempt, for example, > > ((array-getter B) 2 3 5) > > => > > *** ERROR IN (console)@48.1 -- Wrong number of arguments passed > to procedure (#<procedure #12> 2 3 5) > > (using the sample implementation with Gambit v4.6.0). Wow, you are a close reader. Fixed by defining B as (array-curry A 1). (I changed the second argument from the left dimension to the right without changing the example.) > > * Related to above: The following yields true (using the sample > implementation), perhaps suggesting an inconsistency between the > SRFI and implementation on which "side's" (inner v. outer) > dimension is specified by the second argument to array-curry. > (Perhaps this is linked to the left- v. right-dimension confusion > for interval-curry noted above.) > > (equal? ((array-getter A) 2 3 5 7) > ((array-getter ((array-getter B) 2)) 3 5 7)) > > => #t You're right, I fixed the example, I think > > * array-curry: I am having trouble interpreting the statement: > > The type of the subarrays is the same as the type of the input > array. > > Here, does "type" refer to the mutability or domains of the > (sub)arrays, or Scheme types, or something else? I added a sentence of explanation. > > * array-permute: I don't think I understand the significance of the > subtlety noted in the explanation (regarding permuting arguments, > etc.). Is it a result of the convention used for permuting > intervals, and similar to the "usual" confusion when multiplying > permutations (cf. Knuth TAOCP 7.2.1.2."A general framework"), or > something else? I suppose it doesn't really matter for the > purpose of the SRFI, but I got the feeling I am missing some point > here. Many mathematics textbooks specify a permutation by giving its range, with the domain elements implicit, so the permutation function 1->2, 2->1, 3->4, 4->5, and 5->3, or the set of ordered pairs (listed in order of the first element of the pairs, i.e., the domain element) $$ \{(1,2),(2,1),(3,4),(4,5),(5,3))\} $$ is written as $$ (2 1 4 5 3). $$ It didn't seem natural to me to work with permutations in this way, so this SRFI we list the pairs in increasing order of the second elements of the pairs (the range): $$ \{(2,1),(1,2),(5,3),(3,4),(4,5)\} $$ and then I specify the first elements, with the second elements implicit: $$ (2 1 5 3 4) $$ I didn't want to say too much about what I don't do, and rather spend the time explaining what I *do* do. I can't find the word "framework" in TAOCP 7.2.1.2 from http://www.cs.utsa.edu/~wagner/knuth/fasc2b.pdf > > * (minor, formatting) Some (pseudo)code in the array-permute section > seem to be missing 'pre' tags or some such. Yeah, sorry, I can't mix mathjax $\pi$ with <pre>, so I'm stuck with this formatting. > > * interval-reduce (and array-reduce): The order of the arguments in > invocations of the provided 'operator' seems to differ from that > used by the analogous (I think) reduce procedure from SRFI 1. Is > this difference intentional? > > * Related to above: interval-reduce and array-reduce seem closer to > SRFI 1's 'fold' than to its 'reduce' procedure (though the above > comment applies in either case). > > * Would it make sense to include array-fold (and interval-fold) > either in addition to or instead of the -reduce procedures? I'll have to think about this. To do fold-right properly one should introduce a function (array-reverse A), which contains the same entries as in A, with the same domain, only in reverse lexicographical order. Maybe that's the way to go. > > * array-body: Is the returned object the same as the object created > by an application of the maker argument to the storage-class of > the array? (A clarification near its definition may help; I found > things hard to follow.) It's *an* "object created by an application of the maker argument to the storage-class of the array". But after a specialized array has been curried, permuted, and translated, the array elements themselves might occupy only a small subset of the body, and be stored in a rather strange order. Do you think something needs to be said? Brad