Clean up pprint-use and related code to use manifests

db4
Slava Pestov 2009-05-16 08:54:14 -05:00
parent 274655e77c
commit 7c388d702a
6 changed files with 36 additions and 88 deletions

View File

@ -161,10 +161,6 @@ $nl
ABOUT: "prettyprint" ABOUT: "prettyprint"
HELP: with-pprint
{ $values { "obj" object } { "quot" quotation } }
{ $description "Sets up the prettyprinter and calls the quotation in a new scope. The quotation should add sections to the top-level block. When the quotation returns, the top-level block is printed to " { $link output-stream } "." } ;
HELP: pprint HELP: pprint
{ $values { "obj" object } } { $values { "obj" object } }
{ $description "Prettyprints an object to " { $link output-stream } ". Output is influenced by many variables; see " { $link "prettyprint-variables" } "." } { $description "Prettyprints an object to " { $link output-stream } ". Output is influenced by many variables; see " { $link "prettyprint-variables" } "." }
@ -225,8 +221,3 @@ HELP: .r
HELP: .s HELP: .s
{ $description "Displays the contents of the data stack, with the top of the stack printed first." } ; { $description "Displays the contents of the data stack, with the top of the stack printed first." } ;
HELP: in.
{ $values { "vocab" "a vocabulary specifier" } }
{ $description "Prettyprints a " { $snippet "IN:" } " declaration." }
$prettyprinting-note ;

View File

@ -4,78 +4,16 @@ USING: arrays accessors assocs colors combinators grouping io
io.streams.string io.styles kernel make math math.parser namespaces io.streams.string io.styles kernel make math math.parser namespaces
parser prettyprint.backend prettyprint.config prettyprint.custom parser prettyprint.backend prettyprint.config prettyprint.custom
prettyprint.sections quotations sequences sorting strings vocabs prettyprint.sections quotations sequences sorting strings vocabs
vocabs.parser words sets ; vocabs.prettyprint words sets ;
IN: prettyprint IN: prettyprint
<PRIVATE
: make-pprint ( obj quot -- block in use )
[
0 position set
H{ } clone pprinter-use set
V{ } clone recursion-check set
V{ } clone pprinter-stack set
over <object
call
pprinter-block
pprinter-in get
pprinter-use get keys
] with-scope ; inline
: with-pprint ( obj quot -- )
make-pprint 2drop do-pprint ; inline
: pprint-vocab ( vocab -- )
dup vocab present-text ;
: write-in ( vocab -- )
[ \ IN: pprint-word pprint-vocab ] with-pprint ;
: in. ( vocab -- )
[ write-in ] when* ;
: use. ( seq -- )
[
natural-sort [
\ USING: pprint-word
[ pprint-vocab ] each
\ ; pprint-word
] with-pprint
] unless-empty ;
: use/in. ( in use -- )
over "syntax" 2array diff
[ nip use. ]
[ empty? not and [ nl ] when ]
[ drop in. ]
2tri ;
: vocab-names ( words -- vocabs )
dictionary get
[ [ words>> eq? nip ] with assoc-find 2drop ] curry map sift ;
: prelude. ( -- )
in get use get vocab-names prune in get ".private" append swap remove use/in. ;
[
nl
{ { font-style bold } { font-name "sans-serif" } } [
"Restarts were invoked adding vocabularies to the search path." print
"To avoid doing this in the future, add the following USING:" print
"and IN: forms at the top of the source file:" print nl
] with-style
{ { page-color T{ rgba f 0.8 0.8 0.8 1.0 } } } [ prelude. ] with-nesting
nl nl
] print-use-hook set-global
PRIVATE>
: with-use ( obj quot -- ) : with-use ( obj quot -- )
make-pprint [ use/in. ] [ empty? not or [ nl ] when ] 2bi make-pprint (pprint-manifest
[ pprint-manifest) ] [ [ drop nl ] unless-empty ] bi
do-pprint ; inline do-pprint ; inline
: with-in ( obj quot -- ) : with-in ( obj quot -- )
make-pprint drop [ write-in bl ] when* do-pprint ; inline make-pprint current-vocab>> [ pprint-in bl ] when* do-pprint ; inline
: pprint ( obj -- ) [ pprint* ] with-pprint ; : pprint ( obj -- ) [ pprint* ] with-pprint ;

View File

@ -1,9 +1,9 @@
! Copyright (C) 2003, 2008 Slava Pestov. ! Copyright (C) 2003, 2009 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license. ! See http://factorcode.org/license.txt for BSD license.
USING: arrays generic hashtables io kernel math assocs USING: arrays generic hashtables io kernel math assocs
namespaces make sequences strings io.styles vectors words namespaces make sequences strings io.styles vectors words
prettyprint.config splitting classes continuations prettyprint.config splitting classes continuations
accessors sets ; accessors sets vocabs.parser combinators vocabs ;
IN: prettyprint.sections IN: prettyprint.sections
! State ! State
@ -19,8 +19,16 @@ TUPLE: pprinter last-newline line-count indent ;
: <pprinter> ( -- pprinter ) 0 1 0 pprinter boa ; : <pprinter> ( -- pprinter ) 0 1 0 pprinter boa ;
: (record-vocab) ( vocab -- )
dup pprinter-in get dup [ vocab-name ] when =
[ drop ] [ pprinter-use get conjoin ] if ;
: record-vocab ( word -- ) : record-vocab ( word -- )
vocabulary>> [ pprinter-use get conjoin ] when* ; vocabulary>> {
{ f [ ] }
{ "syntax" [ ] }
[ (record-vocab) ]
} case ;
! Utility words ! Utility words
: line-limit? ( -- ? ) : line-limit? ( -- ? )
@ -327,7 +335,14 @@ M: block long-section ( block -- )
] each ] each
] if-nonempty ; ] if-nonempty ;
: make-pprint ( obj quot -- block in use ) : pprinter-manifest ( -- manifest )
<manifest>
[ [ pprinter-use get keys >vector ] dip (>>search-vocabs) ]
[ [ pprinter-in get ] dip (>>current-vocab) ]
[ ]
tri ;
: make-pprint ( obj quot -- block manifest )
[ [
0 position set 0 position set
H{ } clone pprinter-use set H{ } clone pprinter-use set
@ -336,9 +351,8 @@ M: block long-section ( block -- )
over <object over <object
call call
pprinter-block pprinter-block
pprinter-in get pprinter-manifest
pprinter-use get keys
] with-scope ; inline ] with-scope ; inline
: with-pprint ( obj quot -- ) : with-pprint ( obj quot -- )
make-pprint 2drop do-pprint ; inline make-pprint drop do-pprint ; inline

View File

@ -1,6 +1,6 @@
USING: help.markup help.syntax strings definitions generic words classes ;
FROM: prettyprint.sections => with-pprint ;
IN: see IN: see
USING: help.markup help.syntax strings prettyprint.private
definitions generic words classes ;
HELP: synopsis HELP: synopsis
{ $values { "defspec" "a definition specifier" } { "str" string } } { $values { "defspec" "a definition specifier" } { "str" string } }

View File

@ -7,7 +7,7 @@ generic.single generic.standard generic.hook io io.pathnames
io.streams.string io.styles kernel make namespaces prettyprint io.streams.string io.styles kernel make namespaces prettyprint
prettyprint.backend prettyprint.config prettyprint.custom prettyprint.backend prettyprint.config prettyprint.custom
prettyprint.sections sequences sets sorting strings summary words prettyprint.sections sequences sets sorting strings summary words
words.symbol words.constant words.alias ; words.symbol words.constant words.alias vocabs ;
IN: see IN: see
GENERIC: synopsis* ( defspec -- ) GENERIC: synopsis* ( defspec -- )
@ -44,7 +44,7 @@ M: word print-stack-effect? drop t ;
<PRIVATE <PRIVATE
: seeing-word ( word -- ) : seeing-word ( word -- )
vocabulary>> pprinter-in set ; vocabulary>> vocab pprinter-in set ;
: word-synopsis ( word -- ) : word-synopsis ( word -- )
{ {

View File

@ -64,15 +64,20 @@ M: rename pprint-qualified ( rename -- )
PRIVATE> PRIVATE>
: pprint-manifest ( manifest -- ) : (pprint-manifest ( manifest -- quots )
[ [
[ search-vocabs>> [ '[ _ pprint-using ] , ] unless-empty ] [ search-vocabs>> [ '[ _ pprint-using ] , ] unless-empty ]
[ qualified-vocabs>> [ extra-words? not ] filter [ '[ _ pprint-qualified ] , ] each ] [ qualified-vocabs>> [ extra-words? not ] filter [ '[ _ pprint-qualified ] , ] each ]
[ current-vocab>> [ '[ _ pprint-in ] , ] when* ] [ current-vocab>> [ '[ _ pprint-in ] , ] when* ]
tri tri
] { } make ] { } make ;
: pprint-manifest) ( quots -- )
[ nl ] [ call( -- ) ] interleave ; [ nl ] [ call( -- ) ] interleave ;
: pprint-manifest ( manifest -- )
(pprint-manifest pprint-manifest) ;
[ [
nl nl
{ { font-style bold } { font-name "sans-serif" } } [ { { font-style bold } { font-name "sans-serif" } } [