! Copyright (C) 2007 Doug Coleman. ! See http://factorcode.org/license.txt for BSD license. USING: accessors arrays assocs fry generalizations grouping kernel lexer macros make math math.order math.vectors namespaces parser quotations sequences sequences.private splitting.monotonic stack-checker strings unicode.case words effects ; IN: roman = ; : roman>n ( ch -- n ) roman-digit-index roman-values nth ; : (>roman) ( n -- ) roman-values roman-digits [ [ /mod swap ] dip concat % ] 2each drop ; : (roman>) ( seq -- n ) [ [ roman>n ] map ] [ all-eq? ] bi [ sum ] [ first2 swap - ] if ; PRIVATE> : >roman ( n -- str ) dup roman-range-check [ (>roman) ] "" make ; : >ROMAN ( n -- str ) >roman >upper ; : roman> ( str -- n ) >lower [ roman<= ] monotonic-split [ (roman>) ] sigma ; > ] [ ] [ infer out>> ] tri '[ [ roman> ] _ napply @ [ >roman ] _ napply ] ; PRIVATE> << SYNTAX: ROMAN-OP: scan-word [ name>> "roman" prepend create-in ] keep 1quotation '[ _ binary-roman-op ] dup infer [ in>> ] [ out>> ] bi [ "string" ] bi@ define-declared ; >> ROMAN-OP: + ROMAN-OP: - ROMAN-OP: * ROMAN-OP: /i ROMAN-OP: /mod SYNTAX: ROMAN: scan roman> parsed ;