]> gitweb.factorcode.org Git - factor.git/blob - core/listener/listener.factor
Thread refactoring work in progress
[factor.git] / core / listener / listener.factor
1 ! Copyright (C) 2003, 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: arrays hashtables io kernel math math.parser memory
4 namespaces parser sequences strings io.styles
5 io.streams.duplex vectors words generic system combinators
6 continuations debugger definitions compiler.units accessors ;
7 IN: listener
8
9 SYMBOL: quit-flag
10
11 SYMBOL: listener-hook
12
13 [ ] listener-hook set-global
14
15 GENERIC: stream-read-quot ( stream -- quot/f )
16
17 : parse-lines-interactive ( lines -- quot/f )
18     [ parse-lines in get ] with-compilation-unit in set ;
19
20 : read-quot-step ( lines -- quot/f )
21     [ parse-lines-interactive ] [
22         dup error>> unexpected-eof?
23         [ 2drop f ] [ rethrow ] if
24     ] recover ;
25
26 : read-quot-loop  ( stream accum -- quot/f )
27     over stream-readln dup [
28         over push
29         dup read-quot-step dup
30         [ 2nip ] [ drop read-quot-loop ] if
31     ] [
32         3drop f
33     ] if ;
34
35 M: object stream-read-quot
36     V{ } clone read-quot-loop ;
37
38 M: duplex-stream stream-read-quot
39     duplex-stream-in stream-read-quot ;
40
41 : read-quot ( -- quot/f ) stdio get stream-read-quot ;
42
43 : bye ( -- ) quit-flag on ;
44
45 : prompt. ( -- )
46     "( " in get " )" 3append
47     H{ { background { 1 0.7 0.7 1 } } } format bl flush ;
48
49 : listen ( -- )
50     listener-hook get call prompt.
51     [ read-quot [ try ] [ bye ] if* ]
52     [
53         dup parse-error? [
54             error-hook get call
55         ] [
56             rethrow
57         ] if
58     ] recover ;
59
60 : until-quit ( -- )
61     quit-flag get
62     [ quit-flag off ]
63     [ listen until-quit ] if ; inline
64
65 : listener ( -- )
66     [ until-quit ] with-interactive-vocabs ;
67
68 MAIN: listener