Home My Page Projects Code Snippets Project Openings SML/NJ
Summary Activity Forums Tracker Lists Tasks Docs Surveys News SCM Files

SCM Repository

[smlnj] Annotation of /sml/trunk/src/smlnj-lib/Reactive/reactive.sml
ViewVC logotype

Annotation of /sml/trunk/src/smlnj-lib/Reactive/reactive.sml

Parent Directory Parent Directory | Revision Log Revision Log


Revision 9 - (view) (download)

1 : monnier 2 (* reactive.sml
2 :     *
3 :     * COPYRIGHT (c) 1997 Bell Labs, Lucent Technologies.
4 :     *
5 :     * A simple ractive engine modelled after RC and SugarCubes.
6 :     *)
7 :    
8 :     structure Reactive : REACTIVE =
9 :     struct
10 :    
11 :     structure I = Instruction
12 :     structure M = Machine
13 :    
14 :     type machine = M.machine
15 :     type instruction = machine Instruction.instr
16 :     type signal = I.signal
17 :     type config = I.signal I.config
18 :     type in_signal = M.in_signal
19 :     type out_signal = M.out_signal
20 :    
21 :     (* used to bind internal signal names *)
22 :     structure AMap = AtomBinaryMap
23 :    
24 :     exception UnboundSignal of I.signal
25 :    
26 :     fun machine {inputs, outputs, body} = let
27 :     val nextId = ref 0
28 :     val sigList = ref []
29 :     fun newSignal s = let
30 :     val id = !nextId
31 :     val s' = M.SIG{name=s, id=id, state = ref 0}
32 :     in
33 :     nextId := id+1;
34 :     sigList := s' :: !sigList;
35 :     s'
36 :     end
37 :     fun bindSig (env, s) = (case AMap.find (env, s)
38 :     of NONE => raise UnboundSignal s
39 :     | (SOME s') => s'
40 :     (* end case *))
41 :     fun trans (instr, env) = (case instr
42 :     of I.||(i1, i2) => M.||(trans(i1, env), trans(i2, env))
43 :     | I.&(i1, i2) => M.&(trans(i1, env), trans(i2, env))
44 :     | I.nothing => M.nothing
45 :     | I.stop => M.stop()
46 :     | I.suspend => M.suspend()
47 :     | I.action act => M.action act
48 : monnier 8 | I.exec f => M.exec f
49 : monnier 2 | I.ifThenElse(pred, i1, i2) =>
50 :     M.ifThenElse(pred, trans(i1, env), trans(i2, env))
51 :     | I.repeat(cnt, i) => M.repeat(cnt, trans(i, env))
52 :     | I.loop i => M.loop(trans(i, env))
53 :     | I.close i => M.close(trans(i, env))
54 :     | I.signal(s, i) => trans(i, AMap.insert(env, s, newSignal s))
55 :     | I.rebind(s1, s2, i) =>
56 :     trans(i, AMap.insert(env, s2, bindSig(env, s1)))
57 :     | I.emit s => M.emit(bindSig(env, s))
58 :     | I.await cfg => M.await(transConfig(cfg, env))
59 :     | I.when(cfg, i1, i2) =>
60 :     M.when(transConfig(cfg, env), trans(i1, env), trans(i2, env))
61 :     | I.trapWith(cfg, i1, i2) =>
62 :     M.trapWith(transConfig(cfg, env), trans(i1, env), trans(i2, env))
63 :     (* end case *))
64 :     and transConfig (cfg, env) = let
65 :     fun transCfg (I.posConfig s) = I.posConfig(bindSig(env, s))
66 :     | transCfg (I.negConfig s) = I.negConfig(bindSig(env, s))
67 :     | transCfg (I.orConfig(cfg1, cfg2)) =
68 :     I.orConfig(transCfg cfg1, transCfg cfg2)
69 :     | transCfg (I.andConfig(cfg1, cfg2)) =
70 :     I.andConfig(transCfg cfg1, transCfg cfg2)
71 :     in
72 :     transCfg cfg
73 :     end
74 :     val inputs' = List.map newSignal inputs
75 :     val outputs' = List.map newSignal outputs
76 :     fun ins (s as M.SIG{name, ...}, env) = AMap.insert(env, name, s)
77 :     val initialEnv =
78 :     List.foldl ins (List.foldl ins AMap.empty inputs') outputs'
79 :     val body' = trans (body, initialEnv)
80 :     in
81 :     M.M{
82 :     now = ref 0,
83 :     moveFlg = ref false,
84 :     endOfInstant = ref false,
85 :     prog = body',
86 :     signals = !sigList,
87 :     inputs = inputs',
88 :     outputs = outputs'
89 :     }
90 :     end
91 :    
92 :     val run = M.runMachine
93 :     val reset = M.resetMachine
94 :     val inputsOf = M.inputsOf
95 :     val outputsOf = M.outputsOf
96 :     val inputSignal = M.inputSignal
97 :     val outputSignal = M.outputSignal
98 :     val setInSignal = M.setInSignal
99 :     val getInSignal = M.getInSignal
100 :     val getOutSignal = M.getOutSignal
101 :    
102 :     val posConfig = I.posConfig
103 :     val negConfig = I.negConfig
104 :     val orConfig = I.orConfig
105 :     val andConfig = I.andConfig
106 :    
107 :     val || = I.||
108 :     val & = I.&
109 :     val nothing = I.nothing
110 :     val stop = I.stop
111 :     val suspend = I.suspend
112 :     val action = I.action
113 :     val exec = I.exec
114 :     val ifThenElse = I.ifThenElse
115 :     val repeat = I.repeat
116 :     val loop = I.loop
117 :     val close = I.close
118 :     val signal = I.signal
119 :     val rebind = I.rebind
120 :     val when = I.when
121 :     val trapWith = I.trapWith
122 :     fun trap (c, i) = I.trapWith(c, i, I.nothing)
123 :     val emit = I.emit
124 :     val await = I.await
125 :    
126 :     end

root@smlnj-gforge.cs.uchicago.edu
ViewVC Help
Powered by ViewVC 1.0.0