[Pharo-project] Fwd: Discussion about Nile in Pharo
Begin forwarded message:
From: "Bill Schwab" <BSchwab@anest.ufl.edu> Date: June 1, 2008 4:32:46 PM CEDT To: <damien.cassou@gmail.com> Cc: <knight@acm.org>, <stephane.ducasse@inria.fr> Subject: Re: Discussion about Nile in Pharo
Damien,
A partial reply. Interesting point about the various collection classes. Perhaps we can double-dispatch to make the creation work, something like
ReadStream on:aCollection ^aCollection readStream.
ReadStream and friends would exist, but concrete classes would be instantiated. Could that work? It would be along the lines of Squeak's file directories, where the programmer can think in abstractions and the code does the right thing (and instantiates the correct classes) for the platform.
As far as #next, my proposal is to avoid the error altogether by transforming (RB) old code so that it uses #nextOrNil and will work as before, but without abusing the contentious selector. Untransformed old code would likely break, but there would be a procedure for using a throw-away Squeak image to fix it for inclusion in Pharo, and we would have already done transformed code considered to be part of Pharo. My instinct tells me to get it done up front, for fear that the backward-compatibility arguments would prevent doing it in the future. I am not usually a disk-pack arsonist, but in this case, the sooner the better IMHO. Again, a few messages to the RB, and nothing changes except we rename the abused selector. Everything continues to work; new code can work as it should.
I can check with Dolphin, but I do not believe #peek* are affected. It could get interesting for sockets where new elements could be in transit, but the general feel of peek is to look and either move past the element or leave the position unchanged; the latter would probably be what happens. I will ponder and look at the other dialects.
Bill
Wilhelm K. Schwab, Ph.D. University of Florida Department of Anesthesiology PO Box 100254 Gainesville, FL 32610-0254
Email: bschwab@anest.ufl.edu Tel: (352) 846-1285 FAX: (352) 392-7029
"Damien Cassou" <damien.cassou@gmail.com> 06/01/08 9:47 AM >>> On Sun, Jun 1, 2008 at 3:27 PM, Bill Schwab <BSchwab@anest.ufl.edu> wrote: That is a great next step. Dumb question: do I already have an account by virtue of being on the list, or do I need to create one?
You have to create an account I think. Then, you has to ask the pharo project to join. We will receive a mail and will be able to accept your request (or refuse, we will see :-D).
Your rewrite to cope with #on: is fascinating, but I continue to wonder whether it is necessary. In fact, I _think_ I would prefer to rename the Nile classes (either up front or probably post- install via the RB) to be generic. While I too prefer idioms such as Array writeStream and aCollection readStream, #on: is perfectly ok, though clumsy. What we should do depends on your goal, and of course on what works best.
I do not agree for the following reasons:
- in Nile, there is just one class which is the equivalent of ReadStream, WriteStream and ReadWriteStream. It is named NSCollectionStream. There is no one-to-one relation. - in Nile, there are specific classes to handle strings and arrays, NSStringStream and NSArrayStream.How do you change the existing source code to use the right stream class depending on the collection class?
Changing to Nile via #readStream and #writeStream has its advantages, but the rewrite has made me greedy :) I am thinking of something like the following:
(1) prepare the image by renaming methods (#next -> #nextOrNil:, #next -> #nextAvailable:) to reflect current silently-truncating semantics
- I'm not sure we should do this change now. I would prefer waiting that Nile is the default Stream implementation. That way, we avoid changing the Squeak Stream library. Moreover, I think people need more time to think about throwing errors with #next. They need to see how that change will affect their code in practice. Moreover, this change might introduce a lot of new methods like peekIfAvailable and others.
(2) add the silent truncating methods to Nile;
add #on: methods to Nile, including comments referencing the shortcut methods
#on: is already in Nile and it is the only way to create a new collection stream.
(3) change Nile's #next, #next: to raise errors; noting that after (1), the image will call the truncating methods, and only new code will see the errors
(4) either Smalltalk at:#ReadStream put:NSReadStream, etc., or perhaps better yet just ask the RB to rename the Nile classes, so that one codes in terms of ReadStream, WriteStream, catches EndOfStream. We can provide a defined set of RB steps that anyone can use in a throw-away image to prepare code that we did not fix for them; it should basically be step (1).
Comments? If you at all agree, feel free to edit and put it on the Wiki while I figure out how to access it.
-- Damien Cassou Peter von der Ahé: «I'm beginning to see why Gilad wished us good luck». (http://blogs.sun.com/ahe/entry/override_snafu)
participants (1)
-
Stéphane Ducasse