! Copyright (C) 2008 Slava Pestov, Eduardo Cavazos.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel sequences combinators parser splitting math
-quotations arrays make qualified words ;
+quotations arrays make words ;
IN: fry
: _ ( -- * ) "Only valid inside a fry" throw ;
"RENAME: + math => -"
"2 3 - ! => 5" } } ;
+ARTICLE: "qualified" "Qualified word lookup"
+"The " { $vocab-link "qualified" } " vocabulary provides a handful of parsing words which give more control over word lookup than is offered by " { $link POSTPONE: USE: } " and " { $link POSTPONE: USING: } "."
+$nl
+"These words are useful when there is no way to avoid using two vocabularies with identical word names in the same source file."
+{ $subsection POSTPONE: QUALIFIED: }
+{ $subsection POSTPONE: QUALIFIED-WITH: }
+{ $subsection POSTPONE: FROM: }
+{ $subsection POSTPONE: EXCLUDE: }
+{ $subsection POSTPONE: RENAME: } ;
+
+ABOUT: "qualified"
-USING: tools.test qualified ;
-IN: foo
+USING: tools.test qualified eval accessors parser ;
+IN: qualified.tests.foo
: x 1 ;
-IN: bar
+: y 5 ;
+IN: qualified.tests.bar
: x 2 ;
-IN: baz
+: y 4 ;
+IN: qualified.tests.baz
: x 3 ;
-QUALIFIED: foo
-QUALIFIED: bar
-[ 1 2 3 ] [ foo:x bar:x x ] unit-test
+QUALIFIED: qualified.tests.foo
+QUALIFIED: qualified.tests.bar
+[ 1 2 3 ] [ qualified.tests.foo:x qualified.tests.bar:x x ] unit-test
-QUALIFIED-WITH: bar p
+QUALIFIED-WITH: qualified.tests.bar p
[ 2 ] [ p:x ] unit-test
-RENAME: x baz => y
+RENAME: x qualified.tests.baz => y
[ 3 ] [ y ] unit-test
-FROM: baz => x ;
+FROM: qualified.tests.baz => x ;
[ 3 ] [ x ] unit-test
+[ 3 ] [ y ] unit-test
-EXCLUDE: bar => x ;
+EXCLUDE: qualified.tests.bar => x ;
[ 3 ] [ x ] unit-test
+[ 4 ] [ y ] unit-test
+
+[ "USE: qualified IN: qualified.tests FROM: qualified.tests => doesnotexist ;" eval ]
+[ error>> no-word-error? ] must-fail-with
+[ "USE: qualified IN: qualified.tests RENAME: doesnotexist qualified.tests => blah" eval ]
+[ error>> no-word-error? ] must-fail-with
! Copyright (C) 2007, 2008 Daniel Ehrenberg.
! See http://factorcode.org/license.txt for BSD license.
USING: kernel sequences assocs hashtables parser lexer
-vocabs words namespaces vocabs.loader debugger sets ;
+vocabs words namespaces vocabs.loader debugger sets fry ;
IN: qualified
: define-qualified ( vocab-name prefix-name -- )
[ load-vocab vocab-words ] [ CHAR: : suffix ] bi*
- [ -rot >r append r> ] curry assoc-map
+ '[ [ [ _ ] dip append ] dip ] assoc-map
use get push ;
: QUALIFIED:
: expect=> ( -- ) scan "=>" assert= ;
-: partial-vocab ( words name -- assoc )
- dupd [
- lookup [ "No such word: " swap append throw ] unless*
- ] curry map zip ;
+: partial-vocab ( words vocab -- assoc )
+ '[ dup _ lookup [ no-word-error ] unless* ]
+ { } map>assoc ;
-: partial-vocab-ignoring ( words name -- assoc )
+: FROM:
+ #! Syntax: FROM: vocab => words... ;
+ scan dup load-vocab drop expect=>
+ ";" parse-tokens swap partial-vocab use get push ; parsing
+
+: partial-vocab-excluding ( words vocab -- assoc )
[ load-vocab vocab-words keys swap diff ] keep partial-vocab ;
: EXCLUDE:
#! Syntax: EXCLUDE: vocab => words ... ;
scan expect=>
- ";" parse-tokens swap partial-vocab-ignoring use get push ; parsing
-
-: FROM:
- #! Syntax: FROM: vocab => words... ;
- scan dup load-vocab drop expect=>
- ";" parse-tokens swap partial-vocab use get push ; parsing
+ ";" parse-tokens swap partial-vocab-excluding use get push ; parsing
: RENAME:
#! Syntax: RENAME: word vocab => newname
- scan scan dup load-vocab drop lookup [ "No such word" throw ] unless*
+ scan scan dup load-vocab drop
+ dupd lookup [ ] [ no-word-error ] ?if
expect=>
scan associate use get push ; parsing
{ $subsection POSTPONE: PRIVATE> }
{ $subsection "vocabulary-search-errors" }
{ $subsection "vocabulary-search-shadow" }
-{ $see-also "words" } ;
+{ $see-also "words" "qualified" } ;
ARTICLE: "reading-ahead" "Reading ahead"
"Parsing words can consume input:"
] keep
] { } map>assoc ;
-TUPLE: no-word-error name ;
+ERROR: no-word-error name ;
: no-word ( name -- newword )
- dup no-word-error boa
+ dup \ no-word-error boa
swap words-named [ forward-reference? not ] filter
word-restarts throw-restarts
dup vocabulary>> (use+) ;