It looks like it is recurring enough to be part of the Ston booklet :) I will add it.
S. > On 1 Dec 2020, at 10:54, Sven Van Caekenberghe <s...@stfx.eu> wrote: > > Hi Offray, > > This is a recurring question. BlockClosures are way too general and powerful > to be serialised. That is why serialising BlockClosures is not supported in > STON. > > The code inside a block can refer to and even affect state outside the block. > Furthermore the return operator is quite special as it returns from some > outer context. > > A subset of BlockClosures are those that are clean. These do not close over > other variables, nor do they contain a return. By using their source code > representation, it is possible to serialise/materialise them. > > You can try this by adding the following methods: > > BlockClosure>>#stonOn: stonWriter > self isClean > ifTrue: [ stonWriter writeObject: self listSingleton: self printString ] > ifFalse: [ stonWriter error: 'Only clean blocks can be serialized' ] > > BlockClosure>>#stonContainSubObjects > ^ false > > BlockClosure class>>#fromSton: stonReader > ^ self compilerClass new > source: stonReader parseListSingleton; > evaluate > > With these additions you can do the following: > > STON fromString: (STON toString: [ :x :y | x + y ]). > > Note that the actual class name depends on the Pharo version (BlockClosure in > Pharo 7, FullBlockClosure in Pharo 9 and maybe soon CleanBlockClosure - > Marcus is working on that last one and that would be very cool because it > would say exactly what it it). > > I am still not 100% convinced to add this as a standard feature to STON. > Using source code fully exposes the implementation, while using the compiler > can be dangerous. It also adds a dependency on source code and the compiler. > But it would be good if people can experiment with this feature. > > Does this help you ? > > Regards, > > Sven > > PS: I would not modify an object just to serialise it. > >> On 30 Nov 2020, at 18:19, Offray Vladimir Luna Cárdenas >> <offray.l...@mutabit.com> wrote: >> >> Hi, >> >> I'm using STON for all my light storage serialization needs, like the >> Grafoscopio notebooks, and I also love it, as Russ stated in their mail >> question, and I share with him a similar request: for my Brea[1] static >> site generator I would like to store some BreaQuery objects as external >> STON files, and recover them, so I can run the queries that >> recreate/update the website easily. I could store them as Grafoscopio >> notebooks, but I don't want to make Grafoscopio a prerequisite for Brea >> or I could use Fuel, but I would like to store queries as a diff >> friendly text based format. I have considered Metacello/Iceberg packages >> to export code in a diff friendly format, but It maybe overkill. So I >> would like to see if STON can serve me here too. >> >> [1] https://mutabit.com/repos.fossil/brea/ >> [2] https://mutabit.com/repos.fossil/indieweb/ >> >> So far, I'm able to serialize a code block as a string using: >> >> BreaQuery>>asStonModified >> self codeBlock: self codeBlock asString >> ^ STON toStringPretty: self >> >> But I'm unable to populate a block from a string. There is any way to >> make a string, lets say 'a + b', to become the code contents of a block, >> ie: [a + b ] ? >> >> Thanks, >> >> Offray >> -------------------------------------------- Stéphane Ducasse http://stephane.ducasse.free.fr / http://www.pharo.org 03 59 35 87 52 Assistant: Aurore Dalle FAX 03 59 57 78 50 TEL 03 59 35 86 16 S. Ducasse - Inria 40, avenue Halley, Parc Scientifique de la Haute Borne, Bât.A, Park Plaza Villeneuve d'Ascq 59650 France