On Tue, 2008-07-15 at 15:26 +0200, Stéphane Ducasse wrote:
Hi
I would like to get your thoughts on the following:
Following the blog of ramon and his code in sandstoneDB which extends dataStream as follows:
Here is a typical example:
fileNamed: aName do: aBlock | file | file := self fileNamed: aName. ^ file ifNil: [ nil ] ifNotNil: [ [ aBlock value: file ] ensure: [ file close ] ]
fileNamed: aString "Here is the way to use DataStream and ReferenceStream: rr := ReferenceStream fileNamed: 'test.obj'. rr nextPut: <your object>. rr close. better use: fileNamed:do: "
| strm | strm := self on: (FileStream fileNamed: aString). "will be binary" strm byteStream setFileTypeToObject. "Type and Creator not to be text, so can attach correctly to an email msg" ^ strm
There is similar pattern in FileStream
detectFile: aBlock do: anotherBlock
| file | file := aBlock value. ^ file ifNil: [ nil ] ifNotNil: [ [anotherBlock value: file] ensure: [file close]]
fileNamed: fileName ^ self concreteStream fileNamed: (self fullName: fileName)
fileNamed: fileName do: aBlock "Avi Bryant says, ''This idiom is quite common in other languages that make heavy use of closures (i.e. Lisp (with-file 'foo' (f) ...) and Ruby (File.open('foo'){| f|...})). It's time Squeak had it, too.'' Returns the result of aBlock."
^ self detectFile: [ self fileNamed: fileName ] do: aBlock
I have a question: - would not be better to even wrap the on: into the first block of the ensure: message? What do you mean? Can you give an example?
- do we have to close a file even if its creation failed?
Is there anything in the above examples that raises this question? Usually it is the other way round. You can't close a file (that you don't have) if the creation failed. I was wondering about the name of the methods. Is a idiom smthg create aBlock value: smthg smthg destroy not supposed to be called during: ? Norbert