! Copyright (C) 2007 Doug Coleman. ! See https://factorcode.org/license.txt for BSD license. USING: accessors combinators.smart effects.parser generalizations grouping kernel lexer math math.order parser quotations sequences splitting.monotonic strings unicode words ; IN: roman = ( ch1 ch2 -- ? ) [ roman-digit-index ] bi@ >= ; : roman-digit-value ( ch -- n ) roman-digit-index roman-values nth ; : roman-value ( seq -- n ) [ [ roman-digit-value ] map ] [ all-eq? ] bi [ sum ] [ first2 swap - ] if ; PRIVATE> : >roman ( n -- str ) roman-range-check roman-values roman-digits [ [ /mod swap ] dip concat ] 2map "" concat-as nip ; : >ROMAN ( n -- str ) >roman >upper ; : roman> ( str -- n ) >lower [ roman-digit>= ] monotonic-split [ roman-value ] map-sum ; ] _ napply @ [ >roman ] _ napply ] ; PRIVATE> << SYNTAX: ROMAN-OP: scan-word [ name>> "roman" prepend create-word-in ] keep 1quotation '[ _ binary-roman-op ] scan-effect define-declared ; >> ROMAN-OP: + ( x y -- z ) ROMAN-OP: - ( x y -- z ) ROMAN-OP: * ( x y -- z ) ROMAN-OP: /i ( x y -- z ) ROMAN-OP: /mod ( x y -- z w ) SYNTAX: ROMAN: scan-token roman> suffix! ;