Sorry, I forgot to answer. This change is indeed really nice.

Thank you for it!

Cheers,

Julien

---
Julien Delplanque
Doctorant �� l���Universit�� de Lille
http://juliendelplanque.be/phd.html
Equipe Rmod, Inria
B��timent B 40, Avenue Halley 59650 Villeneuve d'Ascq
Num��ro de t��l��phone: +333 59 35 86 40

Le 9 oct. 2018 �� 21:22, Sven Van Caekenberghe <sven@stfx.eu> a ��crit :

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 <sven@stfx.eu> wrote:



On 18 Sep 2018, at 16:45, Sven Van Caekenberghe <sven@stfx.eu> 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