2009-02-15 20:53:21 -05:00
|
|
|
! Copyright (C) 2007, 2009 Eduardo Cavazos, Slava Pestov.
|
2007-09-20 18:09:08 -04:00
|
|
|
! See http://factorcode.org/license.txt for BSD license.
|
2008-06-30 06:22:05 -04:00
|
|
|
USING: accessors assocs strings kernel sorting namespaces
|
2010-04-17 18:19:37 -04:00
|
|
|
sequences definitions sets combinators ;
|
2007-09-20 18:09:08 -04:00
|
|
|
IN: vocabs
|
|
|
|
|
|
|
|
SYMBOL: dictionary
|
|
|
|
|
2008-04-02 22:27:49 -04:00
|
|
|
TUPLE: vocab < identity-tuple
|
2008-03-20 16:30:59 -04:00
|
|
|
name words
|
2007-09-20 18:09:08 -04:00
|
|
|
main help
|
|
|
|
source-loaded? docs-loaded? ;
|
|
|
|
|
2009-01-27 06:05:46 -05:00
|
|
|
! sources-loaded? slot is one of these three
|
2008-11-23 01:04:18 -05:00
|
|
|
SYMBOL: +parsing+
|
|
|
|
SYMBOL: +running+
|
|
|
|
SYMBOL: +done+
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
: <vocab> ( name -- vocab )
|
2008-06-30 06:22:05 -04:00
|
|
|
\ vocab new
|
|
|
|
swap >>name
|
|
|
|
H{ } clone >>words ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2011-10-29 02:39:40 -04:00
|
|
|
ERROR: bad-vocab-name name ;
|
|
|
|
|
|
|
|
: check-vocab-name ( name -- name )
|
|
|
|
dup string? [ bad-vocab-name ] unless
|
|
|
|
dup ":/\\ " intersects? [ bad-vocab-name ] when ;
|
|
|
|
|
2009-02-15 20:53:21 -05:00
|
|
|
TUPLE: vocab-link name ;
|
2008-08-31 08:45:33 -04:00
|
|
|
|
2009-02-15 20:53:21 -05:00
|
|
|
C: <vocab-link> vocab-link
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-15 20:53:21 -05:00
|
|
|
UNION: vocab-spec vocab vocab-link ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2009-02-15 20:53:21 -05:00
|
|
|
GENERIC: vocab-name ( vocab-spec -- name )
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-08-31 08:45:33 -04:00
|
|
|
M: vocab vocab-name name>> ;
|
|
|
|
|
2009-02-15 20:53:21 -05:00
|
|
|
M: vocab-link vocab-name name>> ;
|
|
|
|
|
2011-10-29 02:39:40 -04:00
|
|
|
M: object vocab-name check-vocab-name ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2011-10-24 06:37:47 -04:00
|
|
|
GENERIC: lookup-vocab ( vocab-spec -- vocab )
|
2009-02-15 20:53:21 -05:00
|
|
|
|
2011-10-24 06:37:47 -04:00
|
|
|
M: vocab lookup-vocab ;
|
2009-02-15 20:53:21 -05:00
|
|
|
|
2011-10-24 06:37:47 -04:00
|
|
|
M: object lookup-vocab ( name -- vocab ) vocab-name dictionary get at ;
|
2009-02-15 20:53:21 -05:00
|
|
|
|
2008-08-31 08:45:33 -04:00
|
|
|
GENERIC: vocab-words ( vocab-spec -- words )
|
|
|
|
|
|
|
|
M: vocab vocab-words words>> ;
|
|
|
|
|
2011-10-24 06:37:47 -04:00
|
|
|
M: object vocab-words lookup-vocab vocab-words ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-08-31 08:45:33 -04:00
|
|
|
M: f vocab-words ;
|
|
|
|
|
|
|
|
GENERIC: vocab-help ( vocab-spec -- help )
|
|
|
|
|
|
|
|
M: vocab vocab-help help>> ;
|
|
|
|
|
2011-10-24 06:37:47 -04:00
|
|
|
M: object vocab-help lookup-vocab vocab-help ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-08-31 08:45:33 -04:00
|
|
|
M: f vocab-help ;
|
|
|
|
|
|
|
|
GENERIC: vocab-main ( vocab-spec -- main )
|
|
|
|
|
|
|
|
M: vocab vocab-main main>> ;
|
|
|
|
|
2011-10-24 06:37:47 -04:00
|
|
|
M: object vocab-main lookup-vocab vocab-main ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-08-31 08:45:33 -04:00
|
|
|
M: f vocab-main ;
|
|
|
|
|
2009-05-01 08:21:56 -04:00
|
|
|
SYMBOL: vocab-observers
|
|
|
|
|
|
|
|
GENERIC: vocabs-changed ( obj -- )
|
|
|
|
|
|
|
|
: add-vocab-observer ( obj -- )
|
|
|
|
vocab-observers get push ;
|
|
|
|
|
|
|
|
: remove-vocab-observer ( obj -- )
|
2009-10-28 01:23:08 -04:00
|
|
|
vocab-observers get remove-eq! drop ;
|
2009-05-01 08:21:56 -04:00
|
|
|
|
|
|
|
: notify-vocab-observers ( -- )
|
|
|
|
vocab-observers get [ vocabs-changed ] each ;
|
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
: create-vocab ( name -- vocab )
|
2009-05-14 23:31:29 -04:00
|
|
|
check-vocab-name
|
2009-05-01 08:21:56 -04:00
|
|
|
dictionary get [ <vocab> ] cache
|
|
|
|
notify-vocab-observers ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-03-20 16:00:49 -04:00
|
|
|
ERROR: no-vocab name ;
|
2008-03-18 21:27:09 -04:00
|
|
|
|
2007-09-20 18:09:08 -04:00
|
|
|
: vocabs ( -- seq )
|
|
|
|
dictionary get keys natural-sort ;
|
|
|
|
|
|
|
|
: words ( vocab -- seq )
|
|
|
|
vocab-words values ;
|
|
|
|
|
|
|
|
: all-words ( -- seq )
|
|
|
|
dictionary get values [ words ] map concat ;
|
|
|
|
|
|
|
|
: words-named ( str -- seq )
|
|
|
|
dictionary get values
|
2008-01-09 17:36:30 -05:00
|
|
|
[ vocab-words at ] with map
|
2008-05-14 00:36:55 -04:00
|
|
|
sift ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: child-vocab? ( prefix name -- ? )
|
|
|
|
2dup = pick empty? or
|
2008-03-31 20:18:05 -04:00
|
|
|
[ 2drop t ] [ swap CHAR: . suffix head? ] if ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
|
|
|
: child-vocabs ( vocab -- seq )
|
2008-04-26 00:12:44 -04:00
|
|
|
vocab-name vocabs [ child-vocab? ] with filter ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-03-19 15:39:08 -04:00
|
|
|
GENERIC: >vocab-link ( name -- vocab )
|
2008-02-11 00:03:54 -05:00
|
|
|
|
2008-03-19 15:39:08 -04:00
|
|
|
M: vocab-spec >vocab-link ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2011-10-29 02:39:40 -04:00
|
|
|
M: object >vocab-link dup lookup-vocab [ ] [ <vocab-link> ] ?if ;
|
2007-09-20 18:09:08 -04:00
|
|
|
|
2008-01-09 04:52:08 -05:00
|
|
|
: forget-vocab ( vocab -- )
|
2010-03-18 00:00:32 -04:00
|
|
|
[ words forget-all ]
|
2010-04-18 15:08:21 -04:00
|
|
|
[ vocab-name dictionary get delete-at ] bi
|
2009-05-01 08:21:56 -04:00
|
|
|
notify-vocab-observers ;
|
2007-12-24 19:40:09 -05:00
|
|
|
|
2008-01-09 16:51:55 -05:00
|
|
|
M: vocab-spec forget* forget-vocab ;
|
2009-02-15 20:53:21 -05:00
|
|
|
|
|
|
|
SYMBOL: load-vocab-hook ! ( name -- vocab )
|
|
|
|
|
2009-03-24 10:11:45 -04:00
|
|
|
: load-vocab ( name -- vocab ) load-vocab-hook get call( name -- vocab ) ;
|
|
|
|
|
|
|
|
PREDICATE: runnable-vocab < vocab
|
2009-03-26 22:27:45 -04:00
|
|
|
vocab-main >boolean ;
|
|
|
|
|
2009-10-28 01:23:08 -04:00
|
|
|
INSTANCE: vocab-spec definition
|