2005-01-14 12:01:48 -05:00
|
|
|
! Copyright (C) 2003, 2005 Slava Pestov.
|
2005-02-05 22:51:41 -05:00
|
|
|
! See http://factor.sf.net/license.txt for BSD license.
|
2004-07-16 02:26:21 -04:00
|
|
|
IN: prettyprint
|
2005-02-06 00:21:26 -05:00
|
|
|
|
|
|
|
! This using kernel-internals is pretty bad. Remove the
|
|
|
|
! kernel-internals usage as soon as the tuple class is moved
|
|
|
|
! to the generic vocabulary.
|
|
|
|
USING: errors generic kernel kernel-internals lists math
|
|
|
|
namespaces stdio strings presentation unparser vectors words
|
2005-02-09 20:57:19 -05:00
|
|
|
hashtables parser ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2004-12-29 03:35:46 -05:00
|
|
|
SYMBOL: prettyprint-limit
|
2005-02-06 00:21:26 -05:00
|
|
|
SYMBOL: one-line
|
|
|
|
SYMBOL: tab-size
|
2005-02-09 20:57:19 -05:00
|
|
|
SYMBOL: recursion-check
|
2004-12-29 03:35:46 -05:00
|
|
|
|
2004-12-12 23:49:44 -05:00
|
|
|
GENERIC: prettyprint* ( indent obj -- indent )
|
|
|
|
|
|
|
|
M: object prettyprint* ( indent obj -- indent )
|
|
|
|
unparse write ;
|
|
|
|
|
2004-11-25 21:08:09 -05:00
|
|
|
: word-link ( word -- link )
|
|
|
|
[
|
2004-12-20 15:29:55 -05:00
|
|
|
dup word-name unparse ,
|
|
|
|
" [ " ,
|
|
|
|
word-vocabulary unparse ,
|
|
|
|
" ] search" ,
|
2004-11-25 21:08:09 -05:00
|
|
|
] make-string ;
|
|
|
|
|
2004-12-20 15:29:55 -05:00
|
|
|
: word-actions ( search -- list )
|
2004-11-25 21:08:09 -05:00
|
|
|
[
|
2005-01-13 19:49:47 -05:00
|
|
|
[[ "See" "see" ]]
|
|
|
|
[[ "Push" "" ]]
|
|
|
|
[[ "Execute" "execute" ]]
|
|
|
|
[[ "jEdit" "jedit" ]]
|
|
|
|
[[ "Usages" "usages." ]]
|
2004-11-25 21:08:09 -05:00
|
|
|
] ;
|
|
|
|
|
|
|
|
: word-attrs ( word -- attrs )
|
|
|
|
#! Words without a vocabulary do not get a link or an action
|
|
|
|
#! popup.
|
|
|
|
dup word-vocabulary [
|
2004-12-20 15:29:55 -05:00
|
|
|
word-link word-actions <actions> "actions" swons unit
|
2004-11-25 21:08:09 -05:00
|
|
|
] [
|
|
|
|
drop [ ]
|
|
|
|
] ifte ;
|
|
|
|
|
2005-02-09 20:57:19 -05:00
|
|
|
: prettyprint-word ( word -- )
|
2004-11-25 21:08:09 -05:00
|
|
|
dup word-name
|
|
|
|
swap dup word-attrs swap word-style append
|
|
|
|
write-attr ;
|
|
|
|
|
2005-02-09 20:57:19 -05:00
|
|
|
M: word prettyprint* ( indent word -- indent )
|
|
|
|
dup parsing? [
|
|
|
|
\ POSTPONE: prettyprint-word " " write
|
|
|
|
] when
|
|
|
|
prettyprint-word ;
|
|
|
|
|
|
|
|
: indent ( indent -- )
|
|
|
|
#! Print the given number of spaces.
|
|
|
|
" " fill write ;
|
|
|
|
|
|
|
|
: prettyprint-newline ( indent -- )
|
|
|
|
"\n" write indent ;
|
|
|
|
|
|
|
|
: prettyprint-elements ( indent list -- indent )
|
|
|
|
[ prettyprint* " " write ] each ;
|
|
|
|
|
|
|
|
: <prettyprint ( indent -- indent )
|
|
|
|
tab-size get + one-line get [
|
|
|
|
" " write
|
|
|
|
] [
|
|
|
|
dup prettyprint-newline
|
|
|
|
] ifte ;
|
|
|
|
|
|
|
|
: prettyprint> ( indent -- indent )
|
|
|
|
tab-size get - one-line get
|
|
|
|
[ dup prettyprint-newline ] unless ;
|
|
|
|
|
|
|
|
: prettyprint-limit? ( indent -- ? )
|
|
|
|
prettyprint-limit get dup [ >= ] [ nip ] ifte ;
|
|
|
|
|
|
|
|
: check-recursion ( indent obj quot -- ? indent )
|
|
|
|
#! We detect circular structure.
|
|
|
|
pick prettyprint-limit? >r
|
|
|
|
over recursion-check get memq? r> or [
|
|
|
|
2drop "..." write
|
|
|
|
] [
|
|
|
|
over recursion-check [ cons ] change
|
|
|
|
call
|
|
|
|
recursion-check [ cdr ] change
|
|
|
|
] ifte ;
|
|
|
|
|
2005-02-06 00:21:26 -05:00
|
|
|
: prettyprint-sequence ( indent start list end -- indent )
|
|
|
|
#! Prettyprint a list, with start/end delimiters; eg, [ ],
|
|
|
|
#! or { }, or << >>. The body of the list is indented,
|
|
|
|
#! unless the list is empty.
|
|
|
|
over [
|
|
|
|
>r
|
2005-02-09 20:57:19 -05:00
|
|
|
>r prettyprint-word <prettyprint
|
|
|
|
r> prettyprint-elements
|
|
|
|
prettyprint> r> prettyprint-word
|
2005-02-06 00:21:26 -05:00
|
|
|
] [
|
2005-02-09 20:57:19 -05:00
|
|
|
>r >r prettyprint-word " " write
|
|
|
|
r> drop
|
|
|
|
r> prettyprint-word
|
2005-02-06 00:21:26 -05:00
|
|
|
] ifte ;
|
2005-01-13 19:49:47 -05:00
|
|
|
|
|
|
|
M: list prettyprint* ( indent list -- indent )
|
2005-02-09 20:57:19 -05:00
|
|
|
[
|
2005-02-10 17:36:19 -05:00
|
|
|
[
|
|
|
|
\ [ swap \ ] prettyprint-sequence
|
|
|
|
] check-recursion
|
|
|
|
] [
|
|
|
|
f unparse write
|
|
|
|
] ifte* ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2005-01-13 19:49:47 -05:00
|
|
|
M: cons prettyprint* ( indent cons -- indent )
|
2005-02-06 00:21:26 -05:00
|
|
|
#! Here we turn the cons into a list of two elements.
|
2005-02-09 20:57:19 -05:00
|
|
|
[
|
|
|
|
\ [[ swap uncons 2list \ ]] prettyprint-sequence
|
|
|
|
] check-recursion ;
|
2004-07-19 16:10:18 -04:00
|
|
|
|
2004-12-12 23:49:44 -05:00
|
|
|
M: vector prettyprint* ( indent vector -- indent )
|
2005-02-09 20:57:19 -05:00
|
|
|
[
|
|
|
|
\ { swap vector>list \ } prettyprint-sequence
|
|
|
|
] check-recursion ;
|
2004-11-25 20:37:05 -05:00
|
|
|
|
2004-12-12 23:49:44 -05:00
|
|
|
M: hashtable prettyprint* ( indent hashtable -- indent )
|
2005-02-09 20:57:19 -05:00
|
|
|
[
|
|
|
|
\ {{ swap hash>alist \ }} prettyprint-sequence
|
|
|
|
] check-recursion ;
|
2004-11-25 20:37:05 -05:00
|
|
|
|
2005-02-05 22:51:41 -05:00
|
|
|
M: tuple prettyprint* ( indent tuple -- indent )
|
2005-02-09 20:57:19 -05:00
|
|
|
[
|
|
|
|
\ << swap tuple>list \ >> prettyprint-sequence
|
|
|
|
] check-recursion ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2004-07-21 19:26:41 -04:00
|
|
|
: prettyprint ( obj -- )
|
2005-02-09 20:57:19 -05:00
|
|
|
[
|
|
|
|
recursion-check off
|
|
|
|
0 swap prettyprint* drop terpri
|
|
|
|
] with-scope ;
|
2004-07-16 02:26:21 -04:00
|
|
|
|
2004-08-17 23:09:16 -04:00
|
|
|
: vocab-link ( vocab -- link )
|
2004-11-11 15:15:43 -05:00
|
|
|
"vocabularies'" swap cat2 ;
|
2004-08-17 23:09:16 -04:00
|
|
|
|
2004-07-21 19:26:41 -04:00
|
|
|
: . ( obj -- )
|
2004-08-08 21:24:01 -04:00
|
|
|
[
|
2005-02-06 00:21:26 -05:00
|
|
|
one-line on
|
2004-12-29 03:35:46 -05:00
|
|
|
16 prettyprint-limit set
|
2004-07-23 01:21:47 -04:00
|
|
|
prettyprint
|
2004-08-08 21:24:01 -04:00
|
|
|
] with-scope ;
|
2004-07-21 19:26:41 -04:00
|
|
|
|
|
|
|
: [.] ( list -- )
|
|
|
|
#! Unparse each element on its own line.
|
|
|
|
[ . ] each ;
|
|
|
|
|
2004-10-27 21:21:31 -04:00
|
|
|
: {.} ( vector -- )
|
|
|
|
#! Unparse each element on its own line.
|
2005-01-23 16:47:28 -05:00
|
|
|
vector>list reverse [ . ] each ;
|
2004-10-27 21:21:31 -04:00
|
|
|
|
|
|
|
: .s datastack {.} ;
|
|
|
|
: .r callstack {.} ;
|
2004-11-25 23:14:17 -05:00
|
|
|
: .n namestack [.] ;
|
|
|
|
: .c catchstack [.] ;
|
2004-09-14 23:23:05 -04:00
|
|
|
|
|
|
|
! For integers only
|
|
|
|
: .b >bin print ;
|
|
|
|
: .o >oct print ;
|
|
|
|
: .h >hex print ;
|
2004-12-29 03:35:46 -05:00
|
|
|
|
2005-02-09 20:57:19 -05:00
|
|
|
global [ 4 tab-size set ] bind
|