-! Copyright (C) 2008 Slava Pestov.
+! Copyright (C) 2008, 2010 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
-USING: byte-arrays strings sequences sequences.private
-fry kernel words parser lexer assocs math.order ;
+USING: ascii assocs byte-arrays fry hints kernel lexer math
+parser sequences sequences.private strings summary words ;
IN: tr
+ERROR: bad-tr ;
+
+M: bad-tr summary
+ drop "TR: can only be used with ASCII characters" ;
+
<PRIVATE
+: tr-nth ( n mapping -- ch ) nth-unsafe 127 bitand ; inline
+
+: check-tr ( from to -- )
+ [ [ ascii? ] all? ] both? [ bad-tr ] unless ;
+
: compute-tr ( quot from to -- mapping )
- zip [ 256 ] 2dip '[ [ @ , at ] keep or ] B{ } map-as ; inline
+ [ 128 <iota> ] 3dip zip
+ '[ [ _ call( x -- y ) _ at ] keep or ] B{ } map-as ; inline
: tr-hints ( word -- )
- { { byte-array } { string } } "specializer" set-word-prop ;
+ { { byte-array } { string } } set-specializer ;
: create-tr ( token -- word )
- create-in dup tr-hints ;
+ create-word-in dup tr-hints ;
: tr-quot ( mapping -- quot )
- '[ [ dup 0 255 between? [ , nth-unsafe ] when ] map ] ;
+ '[ [ dup ascii? [ _ tr-nth ] when ] map ] ;
: define-tr ( word mapping -- )
- tr-quot (( seq -- translated )) define-declared ;
+ tr-quot ( seq -- translated ) define-declared ;
: fast-tr-quot ( mapping -- quot )
- '[ [ , nth-unsafe ] change-each ] ;
+ '[ [ _ tr-nth ] map! drop ] ;
: define-fast-tr ( word mapping -- )
- fast-tr-quot (( seq -- )) define-declared ;
+ fast-tr-quot ( seq -- ) define-declared ;
PRIVATE>
-: TR:
- scan parse-definition
+SYNTAX: TR:
+ scan-token parse-definition
unclip-last [ unclip-last ] dip compute-tr
+ [ check-tr ]
[ [ create-tr ] dip define-tr ]
- [ [ "-fast" append create-tr ] dip define-fast-tr ] 2bi ;
- parsing
+ [ [ "-fast" append create-tr ] dip define-fast-tr ] 2tri ;