1 USING: accessors assocs continuations effects io
2 io.encodings.binary io.servers.connection kernel
3 memoize namespaces parser sets sequences serialize
4 threads vocabs vocabs.parser words ;
7 SYMBOL: serving-vocabs V{ } clone serving-vocabs set-global
9 : do-rpc ( args word -- bytes )
10 [ execute ] curry with-datastack object>bytes ; inline
12 MEMO: mem-do-rpc ( args word -- bytes ) do-rpc ; inline
14 : process ( vocabspec -- )
15 vocab-words [ deserialize ] dip deserialize
16 swap at "executer" get execute( args word -- bytes ) write flush ;
19 deserialize dup serving-vocabs get-global index
20 [ process ] [ drop ] if ;
22 : start-serving-vocabs ( -- )
24 binary <threaded-server>
31 serving-vocabs get-global empty? [ start-serving-vocabs ] when
32 current-vocab serving-vocabs get-global adjoin
34 in get [ vocab vocab-words [ stack-effect ] { } assoc-map-as ] curry
35 (( -- words )) define-inline ;
37 SYNTAX: service \ do-rpc "executer" set (service) ;
38 SYNTAX: mem-service \ mem-do-rpc "executer" set (service) ;
43 \ mem-do-rpc "memoize" word-prop [ delete-at ] curry each