1 ! Copyright (C) 2008 Jose Antonio Ortega Ruiz.
2 ! See http://factorcode.org/license.txt for BSD license.
4 USING: accessors arrays classes classes.tuple compiler.units
5 combinators continuations debugger definitions eval help io
6 io.files io.pathnames io.streams.string kernel lexer listener
7 listener.private make math namespaces parser prettyprint
8 prettyprint.config quotations sequences strings source-files
9 tools.vocabs vectors vocabs vocabs.loader ;
15 TUPLE: fuel-status in use ds? restarts ;
17 SYMBOL: fuel-status-stack
18 V{ } clone fuel-status-stack set-global
20 SYMBOL: fuel-eval-result
21 f clone fuel-eval-result set-global
23 SYMBOL: fuel-eval-output
24 f clone fuel-eval-result set-global
26 SYMBOL: fuel-eval-res-flag
27 t clone fuel-eval-res-flag set-global
29 : fuel-eval-restartable? ( -- ? )
30 fuel-eval-res-flag get-global ; inline
32 : fuel-eval-restartable ( -- )
33 t fuel-eval-res-flag set-global ; inline
35 : fuel-eval-non-restartable ( -- )
36 f fuel-eval-res-flag set-global ; inline
38 : push-fuel-status ( -- )
39 in get use get clone display-stacks? get restarts get-global clone
41 fuel-status-stack get push ;
43 : pop-fuel-status ( -- )
44 fuel-status-stack get empty? [
45 fuel-status-stack get pop {
47 [ use>> clone use set ]
48 [ ds?>> display-stacks? swap [ on ] [ off ] if ]
50 restarts>> fuel-eval-restartable? [ drop ] [
51 clone restarts set-global
58 ! Lispy pretty printing
60 GENERIC: fuel-pprint ( obj -- )
62 M: object fuel-pprint pprint ; inline
64 M: f fuel-pprint drop "nil" write ; inline
66 M: integer fuel-pprint pprint ; inline
68 M: string fuel-pprint pprint ; inline
70 M: sequence fuel-pprint
71 dup empty? [ drop f fuel-pprint ] [
73 [ " " write ] [ fuel-pprint ] interleave
77 M: tuple fuel-pprint tuple>array fuel-pprint ; inline
79 M: continuation fuel-pprint drop ":continuation" write ; inline
81 M: restart fuel-pprint name>> fuel-pprint ; inline
85 : fuel-restarts ( obj -- seq )
86 compute-restarts :restarts prefix ; inline
88 M: condition fuel-pprint
89 [ error>> ] [ fuel-restarts ] bi 2array condition prefix fuel-pprint ;
91 M: source-file-error fuel-pprint
92 [ file>> ] [ error>> ] bi 2array source-file-error prefix
95 M: source-file fuel-pprint path>> fuel-pprint ;
97 ! Evaluation vocabulary
99 : fuel-eval-set-result ( obj -- )
100 clone fuel-eval-result set-global ; inline
104 fuel-eval-result get-global
105 fuel-eval-output get-global
108 : fuel-forget-error ( -- ) f error set-global ; inline
109 : fuel-forget-result ( -- ) f fuel-eval-result set-global ; inline
110 : fuel-forget-output ( -- ) f fuel-eval-output set-global ; inline
112 : (fuel-begin-eval) ( -- )
119 : (fuel-end-eval) ( quot -- )
120 with-string-writer fuel-eval-output set-global
121 fuel-retort pop-fuel-status ; inline
123 : (fuel-eval) ( lines -- )
124 [ [ parse-lines ] with-compilation-unit call ] curry
125 [ print-error ] recover ; inline
127 : (fuel-eval-each) ( lines -- )
128 [ 1vector (fuel-eval) ] each ; inline
130 : (fuel-eval-usings) ( usings -- )
131 [ "USING: " prepend " ;" append ] map
132 (fuel-eval-each) fuel-forget-error fuel-forget-output ;
134 : (fuel-eval-in) ( in -- )
135 [ dup "IN: " prepend 1vector (fuel-eval) in set ] when* ; inline
137 : fuel-eval-in-context ( lines in usings -- )
144 : fuel-begin-eval ( in -- )
149 : fuel-eval ( lines -- )
150 (fuel-begin-eval) [ (fuel-eval) ] (fuel-end-eval) ; inline
152 : fuel-end-eval ( -- ) [ ] (fuel-end-eval) ; inline
154 : fuel-get-edit-location ( defspec -- )
156 first2 [ (normalize-path) ] dip 2array fuel-eval-set-result
159 : fuel-get-vocab-location ( vocab -- )
160 >vocab-link fuel-get-edit-location ;
162 : fuel-get-vocabs ( -- )
163 all-vocabs-seq [ vocab-name ] map fuel-eval-set-result ; inline
165 : fuel-run-file ( path -- ) run-file ; inline
167 : fuel-startup ( -- ) "listener" run ; inline