36 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Factor
		
	
	
			
		
		
	
	
			36 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			Factor
		
	
	
| USING: assocs kernel modules.remote-loading modules.rpc
 | |
| namespaces peg peg.ebnf peg-lexer sequences vocabs vocabs.parser
 | |
| strings ;
 | |
| IN: modules.using
 | |
| 
 | |
| : >qualified ( vocab prefix -- assoc )
 | |
|     [ vocab-words ] [ 58 suffix ] bi* [ swap [ prepend ] dip ] curry assoc-map ;
 | |
| 
 | |
| : >partial-vocab ( words assoc -- assoc )
 | |
|     [ dupd at [ no-word-error ] unless* ] curry { } map>assoc ;
 | |
| 
 | |
| : remote-load ( addr vocabspec -- voab ) [ "modules.remote-loading" remote-vocab (use+) ] dip get-vocab ;
 | |
| 
 | |
| : load'em ( vocab words/? -- ) [ swap >partial-vocab ] when* use get push ;
 | |
| 
 | |
| EBNF: modulize
 | |
| tokenpart = (!(':').)+ => [[ >string ]]
 | |
| s = ':' => [[ drop ignore ]]
 | |
| rpc = tokenpart s s tokenpart => [[ first2 remote-vocab ]]
 | |
| remote = tokenpart s tokenpart => [[ first2 remote-load ]]
 | |
| plain = tokenpart => [[ load-vocab ]]
 | |
| module = rpc | remote | plain
 | |
| ;EBNF
 | |
| 
 | |
| ON-BNF: USING:
 | |
| tokenizer = <foreign factor>
 | |
| sym = !(";"|"}"|"=>").
 | |
| modspec = sym => [[ modulize ]]
 | |
| qualified = modspec sym => [[ first2 >qualified ]]
 | |
| unqualified = modspec => [[ vocab-words ]]
 | |
| words = ("=>" sym+ )? => [[ [ f ] [ second ] if-empty ]]
 | |
| long = "{" ( qualified | unqualified ) words "}" => [[ rest first2 load'em ignore ]]
 | |
| short = modspec => [[ use+ ignore ]]
 | |
| wordSpec = long | short
 | |
| using = wordSpec+ ";" => [[ drop ignore ]]
 | |
| ;ON-BNF |