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 >
