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/9c83e3cc2f00cab83e57f2e10a139d6ecef3cb...
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