I decided to add it for real:

https://github.com/svenvc/ston/commit/9c83e3cc2f00cab83e57f2e10a139d6ecef3cb30

add support for Fraction and ScaledDecimal as direct numeric literals (in STON 
mode, not in JSON mode) with units tests

> On 25 Sep 2018, at 14:13, Sven Van Caekenberghe <[email protected]> wrote:
> 
> 
> 
>> On 18 Sep 2018, at 16:45, Sven Van Caekenberghe <[email protected]> wrote:
>> 
>> Of course, we could also extend the basic number parser and allow the native 
>> (stored) notation
>> 
>> 1/3
>> 3/2s2
>> 
>> Note how that last one should use the more exact #storeOn: notation, not the 
>> #printOn: 
>> 
>> I'll have to think about this a bit more, as I can really not choose right 
>> now.
> 
> I am still not sure if we should do this or not, but here is a POC 
> implementation of the above.
> 
> It implements the following syntax extension (see the class comment of STON 
> for the rest).
> 
> number
>  int
>  int denominator
>  int denominator scale
>  int frac
>  int exp
>  int frac exp
> 
> denominator
>  / digits
> 
> scale
>  s digits
> 
> 
> STONWriter>>#writeFraction: fraction
>       jsonMode
>               ifTrue: [ self writeFloat: fraction asFloat ] 
>               ifFalse: [
>                       writeStream
>                               print: fraction numerator;
>                               nextPut: $/;
>                               print: fraction denominator ]
> 
> STONWriter>>#writeScaledDecimal: scaledDecimal
>       jsonMode
>               ifTrue: [ self writeFloat: scaledDecimal asFloat ]
>               ifFalse: [ 
>                       writeStream
>                               print: scaledDecimal numerator;
>                               nextPut: $/;
>                               print: scaledDecimal denominator;
>                               nextPut: $s;
>                               print: scaledDecimal scale ]
> 
> Fraction>>#stonOn: stonWriter
>       stonWriter writeFraction: self
> 
> ScaledDecimal>>#stonOn: stonWriter
>       stonWriter writeScaledDecimal: self
> 
> STONReader>>parseNumber
>       | negated number |
>       negated := readStream peekFor: $-.
>       number := self parseNumberInteger.
>       (readStream peekFor: $/)
>               ifTrue: [ 
>                       number := Fraction numerator: number denominator: self 
> parseNumberInteger.
>                       (readStream peekFor: $s)
>                               ifTrue: [ number := ScaledDecimal 
> newFromNumber: number scale: self parseNumberInteger ] ]
>               ifFalse: [ 
>                       (readStream peekFor: $.)
>                               ifTrue: [ number := number + self 
> parseNumberFraction ].
>                       ((readStream peekFor: $e) or: [ readStream peekFor: $E 
> ])
>                               ifTrue: [ number := number * self 
> parseNumberExponent ] ].
>       negated
>               ifTrue: [ number := number negated ].
>       self consumeWhitespace.
>       ^ number
> 
> Sven
> 


Reply via email to