factor/library/tools/word-tools.factor

105 lines
2.6 KiB
Factor
Raw Normal View History

2006-03-25 01:06:52 -05:00
! Copyright (C) 2005, 2006 Slava Pestov.
! See http://factorcode.org/license.txt for BSD license.
2005-03-10 17:57:22 -05:00
IN: words
2006-08-12 16:57:49 -04:00
USING: arrays definitions hashtables help inspector io kernel
math namespaces prettyprint sequences strings styles ;
2005-03-10 17:57:22 -05:00
: word-outliner ( word quot -- )
swap natural-sort [
dup rot curry >r [ synopsis ] keep r>
write-outliner terpri
] each-with ;
: usage. ( word -- )
usage [ usage. ] word-outliner ;
2005-04-14 19:37:13 -04:00
: annotate ( word quot -- | quot: word def -- def )
2005-08-23 15:50:32 -04:00
over >r >r dup word-def r> call r> swap define-compound ;
2005-04-01 12:42:14 -05:00
inline
2005-03-10 17:57:22 -05:00
2006-03-18 01:57:57 -05:00
: watch-msg ( word prefix -- ) write word-name print .s flush ;
2005-09-14 00:37:50 -04:00
2005-04-14 19:37:13 -04:00
: (watch) ( word def -- def )
2005-08-08 15:21:14 -04:00
[
2005-09-14 00:37:50 -04:00
swap literalize
dup , "===> Entering: " , \ watch-msg ,
swap %
, "===> Leaving: " , \ watch-msg ,
2005-08-25 15:27:38 -04:00
] [ ] make ;
2005-03-10 17:57:22 -05:00
2006-03-25 01:06:52 -05:00
: watch ( word -- ) [ (watch) ] annotate ;
2005-03-10 17:57:22 -05:00
2005-08-24 21:52:10 -04:00
: profile ( word -- )
2006-08-12 16:57:49 -04:00
[
swap [ global [ inc ] bind ] curry swap append
] annotate ;
: fuzzy ( full short -- indices )
0 swap >array [ swap pick index* [ 1+ ] keep ] map 2nip
-1 over member? [ drop f ] when ;
: (runs) ( n i seq -- )
2dup length < [
3dup nth [
number= [
>r >r 1+ r> r>
] [
split-next,
rot drop [ nth 1+ ] 2keep
] if >r 1+ r>
] keep split, (runs)
] [
3drop
] if ;
: runs ( seq -- seq )
[
split-next,
dup first 0 rot (runs)
] { } make ;
: prev >r 1- r> nth ;
: next >r 1+ r> nth ;
: score-1 ( i full -- n )
{
{ [ over zero? ] [ 2drop 10 ] }
{ [ 2dup length 1- = ] [ 2drop 4 ] }
{ [ 2dup prev Letter? not ] [ 2drop 10 ] }
{ [ 2dup next Letter? not ] [ 2drop 4 ] }
{ [ t ] [ 2drop 1 ] }
} cond ;
: score ( full fuzzy -- n )
dup [
[ [ length ] 2apply - 15 swap [-] 3 / ] 2keep
runs [
[ swap score-1 ] map-with dup supremum swap length *
] map-with sum +
] [
2drop 0
] if ;
: completion ( str word -- { score indices word } )
[
word-name [ swap fuzzy ] keep swap [ score ] keep
] keep
3array ;
: completions ( str -- seq )
all-words [ completion ] map-with [ first zero? not ] subset
[ [ first ] 2apply - ] sort dup length 20 min tail* ;
: fuzzy. ( fuzzy full -- )
dup length [
pick member?
[ hilite-style >r ch>string r> format ] [ write1 ] if
] 2each drop ;
: apropos ( str -- )
completions [
first3 dup presented associate [
word-name fuzzy. drop
] with-nesting terpri
] each ;