On Wed, Nov 2, 2016 at 8:51 PM, Henrik Nergaard <henrik.nerga...@uia.no> wrote:
> You could always store the closure as a string and then evaluate it on > materialization, at least if it is clean (no thisContext and no return) > > For blocks without no self usage: > ------------------ > | blk | > > blk := [ :a :b | a <= b ]. > > #_ assert: blk isClean. > > blk := Compiler evaluate: blk asString. > > #_ assert: (blk value: 1 value: 2) > ---------------- > > If self is used then it must also be stored to materialize it correctly > again: > > ---------------- > | blk ref | > > blk := [ self crLog ]. > ref := blk receiver. > blk := Smalltalk compiler evaluate: blk asString in: nil to: ref. > blk value > ---------------- > > On the topic of STON, is there a way to specify that a variable should > only be serialized if it is referenced elsewhere depper in the tree? > This could be useful, for example when storing morphs that are active in > the world to only include #owner that are not the root serialized object > and other structures were you might not want to serialize its parent but > only deeper into the tree structure. > > I proposed exactly that to SIXX developer which would allow you to serialize at least SortedCollection with clean closures. > Best regards, > Henrik > > > -----Original Message----- > From: Pharo-users [mailto:pharo-users-boun...@lists.pharo.org] On Behalf > Of Sven Van Caekenberghe > Sent: Wednesday, November 2, 2016 11:11 PM > To: Any question about pharo is welcome <pharo-users@lists.pharo.org > Subject: Re: [Pharo-users] About STONS efficiency at storing nested > objects { was : (Re: Keeping data with an application)} > > You can't serialise blocks with STON. > > The design goal of STON was to be able to serialise regular domain models. > > Classes are written as a global reference to their name, as a kind of > shortcut (as opposed to writing out the whole class structure). > > For blocks there is no easy solution, AFAIK. > > > On 2 Nov 2016, at 20:03, Dimitris Chloupis <kilon.al...@gmail.com> > wrote: > > > > I tried to use my ChronosManager object with it and STON does not seem > > to like this > > > > m := ChronosManager new. > > s:= STON toString: m > > s inspect. > > > > STONWriter>>error: > > BlockClosure(Object)>>stonOn: > > STONWriter>>nextPut: > > STONWriter>>encodeKey:value: > > STONMapWriter>>at:put: > > [ :each | > > (anObject instVarNamed: each) > > ifNotNil: [ :value | dictionary at: each asSymbol put: value ] > > ifNil: [ anObject stonShouldWriteNilInstVars > > ifTrue: [ dictionary at: each asSymbol put: nil ] > ] ] in [ > > :dictionary | instanceVariableNames > > do: [ :each | > > (anObject instVarNamed: each) > > ifNotNil: [ :value | dictionary at: each asSymbol > put: value ] > > ifNil: [ anObject stonShouldWriteNilInstVars > > ifTrue: [ dictionary at: each > asSymbol put: nil ] ] ] ] in STONWriter>>writeObject: in Block: [ :each | > ... > > Array(SequenceableCollection)>>do: > > [ :dictionary | > > instanceVariableNames > > do: [ :each | > > (anObject instVarNamed: each) > > ifNotNil: [ :value | dictionary at: each asSymbol > put: value ] > > ifNil: [ anObject stonShouldWriteNilInstVars > > ifTrue: [ dictionary at: each > asSymbol put: nil ] ] ] ] in STONWriter>>writeObject: in Block: [ > :dictionary | ... > > [ self newlineIndent. > > block value: mapWriter ] in [ | mapWriter | mapWriter := STONMapWriter > > on: self. > > writeStream nextPut: ${. > > self > > indentedDo: [ self newlineIndent. > > block value: mapWriter ]. > > self newlineIndent. > > writeStream nextPut: $} ] in STONWriter>>writeObject:streamMap: in > Block: [ self newlineIndent.... > > STONWriter>>indentedDo: > > [ | mapWriter | > > mapWriter := STONMapWriter on: self. > > writeStream nextPut: ${. > > self > > indentedDo: [ self newlineIndent. > > block value: mapWriter ]. > > self newlineIndent. > > writeStream nextPut: $} ] in STONWriter>>writeObject:streamMap: in > Block: [ | mapWriter |... > > [ writeStream nextPutAll: anObject class stonName. > > self prettyPrintSpace. > > block value ] in STONWriter>>writeObject:do: in Block: [ writeStream > nextPutAll: anObject class stonName....etc... > > STONWriter>>with:do: > > STONWriter>>writeObject:do: > > STONWriter>>writeObject:streamMap: > > STONWriter>>writeObject: > > KMKeymap(Object)>>stonOn: > > STONWriter>>nextPut: > > STONWriter>>encodeKey:value: > > [ :key :value | > > first > > ifTrue: [ first := false ] > > ifFalse: [ self mapElementSeparator ]. > > self encodeKey: key value: value ] in [ self newlineIndent. > > pairs > > keysAndValuesDo: [ :key :value | > > first > > ifTrue: [ first := false ] > > ifFalse: [ self mapElementSeparator ]. > > self encodeKey: key value: value ] ] in > STONWriter>>encodeMap: in Block: [ :key :value | ... > > [ :assoc | aBlock value: assoc key value: assoc value ] in > Dictionary>>keysAndValuesDo: in Block: [ :assoc | aBlock value: assoc key > value: assoc va...etc... > > [ :each | each ifNotNil: [ aBlock value: each ] ] in > > Dictionary>>associationsDo: in Block: [ :each | each ifNotNil: [ > > aBlock value: each ] ] > > Array(SequenceableCollection)>>do: > > Dictionary>>associationsDo: > > Dictionary>>keysAndValuesDo: > > [ self newlineIndent. > > pairs > > keysAndValuesDo: [ :key :value | > > first > > ifTrue: [ first := false ] > > ifFalse: [ self mapElementSeparator ]. > > self encodeKey: key value: value ] ] in > STONWriter>>encodeMap: in Block: [ self newlineIndent.... > > STONWriter>>indentedDo: > > STONWriter>>encodeMap: > > [ self encodeMap: hashedCollection ] in STONWriter>>writeMap: in > > Block: [ self encodeMap: hashedCollection ] > > STONWriter>>with:do: > > > > > > -- Mariano http://marianopeck.wordpress.com