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

Reply via email to