simplify dip/call/curry/compose in callable objects before prettyprinting

db4
Joe Groff 2009-08-06 16:16:17 -04:00
parent 634e1dd525
commit 0a4d926212
5 changed files with 93 additions and 4 deletions

View File

@ -3,8 +3,9 @@
USING: accessors arrays byte-arrays byte-vectors generic hashtables USING: accessors arrays byte-arrays byte-vectors generic hashtables
assocs kernel math namespaces make sequences strings sbufs vectors assocs kernel math namespaces make sequences strings sbufs vectors
words prettyprint.config prettyprint.custom prettyprint.sections words prettyprint.config prettyprint.custom prettyprint.sections
quotations io io.pathnames io.styles math.parser effects classes.tuple prettyprint.backend.callables quotations io io.pathnames io.styles
math.order classes.tuple.private classes combinators colors ; math.parser effects classes.tuple math.order classes.tuple.private
classes combinators colors ;
IN: prettyprint.backend IN: prettyprint.backend
M: effect pprint* effect>string "(" ")" surround text ; M: effect pprint* effect>string "(" ")" surround text ;
@ -177,8 +178,7 @@ M: callstack pprint-delims drop \ CS{ \ } ;
M: object >pprint-sequence ; M: object >pprint-sequence ;
M: vector >pprint-sequence ; M: vector >pprint-sequence ;
M: byte-vector >pprint-sequence ; M: byte-vector >pprint-sequence ;
M: curry >pprint-sequence ; M: callable >pprint-sequence simplify-callable ;
M: compose >pprint-sequence ;
M: hashtable >pprint-sequence >alist ; M: hashtable >pprint-sequence >alist ;
M: wrapper >pprint-sequence wrapped>> 1array ; M: wrapper >pprint-sequence wrapped>> 1array ;
M: callstack >pprint-sequence callstack>array ; M: callstack >pprint-sequence callstack>array ;

View File

@ -0,0 +1 @@
Joe Groff

View File

@ -0,0 +1,15 @@
! (c) 2009 Joe Groff bsd license
USING: kernel math prettyprint prettyprint.backend.callables
tools.test ;
IN: prettyprint.backend.callables
[ [ dip ] ] [ [ dip ] simplify-callable ] unit-test
[ [ [ + ] dip ] ] [ [ [ + ] dip ] simplify-callable ] unit-test
[ [ + 5 ] ] [ [ 5 [ + ] dip ] simplify-callable ] unit-test
[ [ + ] ] [ [ [ + ] call ] simplify-callable ] unit-test
[ [ call ] ] [ [ call ] simplify-callable ] unit-test
[ [ 5 + ] ] [ [ 5 [ + ] curry call ] simplify-callable ] unit-test
[ [ 4 5 + ] ] [ [ 4 5 [ + ] 2curry call ] simplify-callable ] unit-test
[ [ 4 5 6 + ] ] [ [ 4 5 6 [ + ] 3curry call ] simplify-callable ] unit-test
[ [ + . ] ] [ [ [ + ] [ . ] compose call ] simplify-callable ] unit-test
[ [ . + ] ] [ [ [ + ] [ . ] prepose call ] simplify-callable ] unit-test

View File

@ -0,0 +1,72 @@
! (c) 2009 Joe Groff bsd license
USING: combinators combinators.short-circuit generalizations
kernel macros math math.ranges quotations sequences words ;
IN: prettyprint.backend.callables
<PRIVATE
CONSTANT: simple-combinators { dip call curry 2curry 3curry compose prepose }
: literal? ( obj -- ? ) word? not ;
MACRO: slice-match? ( quots -- quot: ( seq end -- ? ) )
dup length
[ 0 [a,b) [ [ - swap nth ] swap prefix prepend ] 2map ]
[ nip \ nip swap \ >= [ ] 3sequence ] 2bi
prefix \ 2&& [ ] 2sequence ;
: end-len>from-to ( seq end len -- from to seq )
[ - ] [ drop 1 + ] 2bi rot ;
: slice-change ( seq end len quot -- seq' )
[ end-len>from-to ] dip
[ [ subseq ] dip call ] curry
[ replace-slice ] 3bi ; inline
: when-slice-match ( seq i criteria quot -- seq' )
[ [ 2dup ] dip slice-match? ] dip [ drop ] if ; inline
: simplify-dip ( quot i -- quot' )
{ [ literal? ] [ callable? ] }
[ 2 [ first2 swap suffix ] slice-change ] when-slice-match ;
: simplify-call ( quot i -- quot' )
{ [ callable? ] }
[ 1 [ first ] slice-change ] when-slice-match ;
: simplify-curry ( quot i -- quot' )
{ [ literal? ] [ callable? ] }
[ 2 [ first2 swap prefix 1quotation ] slice-change ] when-slice-match ;
: simplify-2curry ( quot i -- quot' )
{ [ literal? ] [ literal? ] [ callable? ] }
[ 3 [ [ 2 head ] [ third ] bi append 1quotation ] slice-change ] when-slice-match ;
: simplify-3curry ( quot i -- quot' )
{ [ literal? ] [ literal? ] [ literal? ] [ callable? ] }
[ 4 [ [ 3 head ] [ fourth ] bi append 1quotation ] slice-change ] when-slice-match ;
: simplify-compose ( quot i -- quot' )
{ [ callable? ] [ callable? ] }
[ 2 [ first2 append 1quotation ] slice-change ] when-slice-match ;
: simplify-prepose ( quot i -- quot' )
{ [ callable? ] [ callable? ] }
[ 2 [ first2 swap append 1quotation ] slice-change ] when-slice-match ;
: (simplify-callable) ( quot -- quot' )
dup [ simple-combinators member? ] find {
{ \ dip [ simplify-dip ] }
{ \ call [ simplify-call ] }
{ \ curry [ simplify-curry ] }
{ \ 2curry [ simplify-2curry ] }
{ \ 3curry [ simplify-3curry ] }
{ \ compose [ simplify-compose ] }
{ \ prepose [ simplify-prepose ] }
[ 2drop ]
} case ;
PRIVATE>
: simplify-callable ( quot -- quot' )
[ (simplify-callable) ] to-fixed-point ;

View File

@ -0,0 +1 @@
Quotation simplification for prettyprinting automatically-constructed callable objects