[OT] MultiByteFileStream (was: Re: [Vm-dev] VM Maker: CMakeVMMaker-StasenkoIgor.104.mcz)

Levente Uzonyi leves at elte.hu
Tue May 17 19:59:39 UTC 2011


On Tue, 17 May 2011, Eliot Miranda wrote:

snip

> I'm just trying to eliminate the explicit references to CrLfFileStream in
> the Cog VMMaker, but I've hit a snag.  e.g. there's this idiom:
> 
> InterpreterPlugin class methods for translation
> storeString: s onFileNamed: fileName
> "Store the given string in a file of the given name."
> 
> | f |
> f := CrLfFileStream forceNewFileNamed: fileName.
> f nextPutAll: s.
> f close.

I prefer the *fileNamed:do: versions, because they give less work for the 
finalization process:

FileStream forceNewFileNamed: fileName do: [ :file |
 	file nextPutAll: s ].

> 
> that I'd like to replace with
> 
> VMMaker class methods for utilities
> newFileStream
> "Always output files in unix lf format.
> A single format is friendlier to e.g. external version control systems.
> The Microsoft and old MacOS classic C compilers all accept lf format files."
> 
> ^MultiByteFileStream new
> lineEndConvention: #lf;
> yourself
> 
> InterpreterPlugin class methods for translation
> storeString: s onFileNamed: fileName
> "Store the given string in a file of the given name."
> 
> | f |
> f := VMMaker newFileStream forceNewFileNamed: fileName.
> f nextPutAll: s.
> f close.
> 
> but only class-side methods understand forceNewFileNamed:, and hence one
> would have to write
> 
> 
> 
> InterpreterPlugin class methods for translation
> storeString: s onFileNamed: fileName
> "Store the given string in a file of the given name."
> 
> | f |
> f := MultiByteFileStream forceNewFileNamed: fileName.
> f lineEndConvention: #lf.
> f nextPutAll: s.
> f close
> 
> which is a tad tedious and distributed.  I could have a set of convenience
> methods in VMMaker class, forceNewFileStream: oldFileStream etc.  There
> could be subclasses of MultiByteFileStream purely for instance creation
> (MultiByteLfFileStream et al).  Or...?  Any thoughts?

Or pass everything to the method of VMMaker:

InterpreterPlugin class >> #storeString: s onFileNamed: fileName

 	VMMaker
 		newFileWith: #forceNewFileNamed:
 		named: fileName
 		do: [ :file | file nextPutAll: s ].

VMMaker class >> #newFileWith: creatorSelector named: filename do: aBlock

 	| file |
 	file := MultiByteFileStream perform: creatorSelector with: filename.
 	^[
 		file lineEndConvention: #lf.
 		aBlock value: file ]
 		ensure: [ file close ].

If you find #newFileWith:named:do: too long, then you can still add 
convenience methods which all send this one, e.g.:

VMMaker class >> #forceNewFileNamed: filename do: aBlock

 	^self
 		newFileWith: #forceNewFileNamed:
 		named: filename
 		do: aBlock


Subclassing is also possible, but you can't override #initialize yet, 
because FileStream and subclasses don't use it (#new doesn't sent it). The 
changes I just pushed to the Inbox also fix this.


Levente

> 
> best,
> Eliot

snip


More information about the Vm-dev mailing list