annotate src/emmental.hs @ 12254:616be78bd12e draft

<oerjan> revert
author HackEso <hackeso@esolangs.org>
date Fri, 06 Dec 2019 07:54:58 +0000
parents bd08a41fcbe2
children
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2138
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
1 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
2 -- emmental.hs
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
3 -- Interpreter for the Emmental Programming Language
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
4 -- Chris Pressey, Cat's Eye Technologies
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
5 -- This work is in the public domain. See UNLICENSE for more information.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
6 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
7 -- Ørjan Johansen added main
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
8 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
9
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
10
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
11 import qualified Data.Map as Map
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
12 import qualified Data.Char as Char
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
13 import System.Environment (getArgs)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
14
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
15 main = do
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
16 args <- getArgs
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
17 case args of
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
18 "-d" : as -> debug =<< parse return as
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
19 _ -> emmental =<< parse return args
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
20 where
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
21 parse :: (String -> IO String) -> [String] -> IO String
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
22 parse _ ("-f":as) = parse readFile as
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
23 parse _ ("-e":as) = parse return as
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
24 parse op (a:as) = op a >>= (`fmap` parse op as) . (++)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
25 parse _ [] = return ""
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
26
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
27
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
28 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
29 -- ============================ Symbols ============================ --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
30 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
31
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
32 type Symbol = Char
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
33
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
34
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
35 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
36 -- ======================== Program States ========================= --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
37 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
38
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
39 data State = State [Symbol] [Symbol]
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
40 deriving (Ord, Eq, Show)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
41
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
42 pop (State (head:tail) queue) = (head, State tail queue)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
43 push (State list queue) sym = (State (sym:list) queue)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
44
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
45 popString (State (';':tail) queue) = ([], State tail queue)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
46 popString (State (head:tail) queue) =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
47 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
48 (string, state') = popString (State tail queue)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
49 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
50 (string ++ [head], state')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
51
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
52 enqueue (State stack queue) symbol = State stack (symbol:queue)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
53 dequeue (State stack queue) =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
54 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
55 symbol = last queue
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
56 queue' = init queue
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
57 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
58 (symbol, State stack queue')
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
59
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
60
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
61 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
62 -- ========================= Interpreters ========================== --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
63 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
64
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
65 data Interpreter = Interp (Map.Map Symbol Operation)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
66
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
67 fetch (Interp map) sym = Map.findWithDefault (fitRegOp opNop) sym map
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
68 supplant (Interp map) sym op = (Interp (Map.insert sym op map))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
69
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
70
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
71 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
72 -- ========================== Operations =========================== --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
73 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
74
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
75 type Operation = State -> Interpreter -> IO (State, Interpreter)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
76
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
77 composeOps :: Operation -> Operation -> Operation
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
78
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
79 composeOps op1 op2 = f where
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
80 f state interpreter = do
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
81 (state', interpreter') <- op1 state interpreter
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
82 op2 state' interpreter'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
83
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
84 createOp :: Interpreter -> [Symbol] -> Operation
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
85
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
86 createOp interpreter [] =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
87 (fitRegOp opNop)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
88 createOp interpreter (head:tail) =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
89 composeOps (fetch interpreter head) (createOp interpreter tail)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
90
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
91 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
92 -- It's useful for us to express a lot of our operators as non-monadic
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
93 -- functions that don't affect the interpreter. This is a little "adapter"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
94 -- function that lets us create monadic functions with the right signature
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
95 -- from them.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
96 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
97
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
98 fitRegOp :: (State -> State) -> Operation
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
99
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
100 fitRegOp regop = f where
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
101 f state interpreter =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
102 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
103 state' = regop state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
104 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
105 do return (state', interpreter)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
106
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
107
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
108 ------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
109 --------------- The operations themselves. -----------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
110 ------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
111
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
112 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
113 -- Redefine the meaning of the symbol on the stack with
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
114 -- a mini-program also popped off the stack.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
115 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
116
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
117 opSupplant state interpreter =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
118 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
119 (opSym, state') = pop state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
120 (newOpDefn, state'') = popString state'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
121 newOp = createOp interpreter newOpDefn
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
122 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
123 do return (state'', supplant interpreter opSym newOp)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
124
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
125 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
126 -- Execute the symbol on the stack with the current interpreter.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
127 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
128
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
129 opEval state interpreter =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
130 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
131 (opSym, state') = pop state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
132 newOp = createOp interpreter [opSym]
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
133 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
134 newOp state' interpreter
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
135
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
136 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
137 -- I/O.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
138 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
139
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
140 opInput state interpreter = do
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
141 symbol <- getChar
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
142 do return (push state symbol, interpreter)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
143
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
144 opOutput state interpreter =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
145 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
146 (symbol, state') = pop state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
147 in do
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
148 putChar symbol
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
149 return (state', interpreter)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
150
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
151 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
152 -- Primitive arithmetic.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
153 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
154
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
155 opAdd state =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
156 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
157 (symA, state') = pop state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
158 (symB, state'') = pop state'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
159 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
160 push state'' (Char.chr (((Char.ord symB) + (Char.ord symA)) `mod` 256))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
161
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
162 opSubtract state =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
163 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
164 (symA, state') = pop state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
165 (symB, state'') = pop state'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
166 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
167 push state'' (Char.chr (((Char.ord symB) - (Char.ord symA)) `mod` 256))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
168
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
169 discreteLog 0 = 8
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
170 discreteLog 1 = 0
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
171 discreteLog 2 = 1
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
172 discreteLog n = (discreteLog (n `div` 2)) + 1
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
173
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
174 opDiscreteLog state =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
175 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
176 (symbol, state') = pop state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
177 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
178 push state' (Char.chr (discreteLog (Char.ord symbol)))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
179
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
180 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
181 -- Stack manipulation.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
182 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
183
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
184 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
185 -- Pop the top symbol of the stack, make a copy of it, push it back onto the
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
186 -- stack, and enqueue the copy onto the queue.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
187 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
188
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
189 opEnqueueCopy state =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
190 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
191 (sym, _) = pop state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
192 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
193 enqueue state sym
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
194
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
195 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
196 -- Dequeue a symbol from the queue and push it onto the stack.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
197 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
198
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
199 opDequeue state =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
200 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
201 (sym, state') = dequeue state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
202 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
203 push state' sym
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
204
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
205 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
206 -- Duplicate the top symbol of the stack.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
207 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
208
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
209 opDuplicate state =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
210 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
211 (symbol, _) = pop state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
212 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
213 push state symbol
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
214
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
215 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
216 -- Miscellaneous operations.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
217 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
218
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
219 opNop state =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
220 state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
221
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
222 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
223 -- Parameterizable operations.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
224 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
225
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
226 opPushValue value state =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
227 push state (Char.chr value)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
228
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
229 opAccumValue value state =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
230 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
231 (sym, state') = pop state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
232 value' = ((Char.ord sym) * 10) + value
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
233 in
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
234 push state' (Char.chr (value' `mod` 256))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
235
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
236
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
237 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
238 -- ===================== Debugging Functions ======================= --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
239 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
240
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
241 type Debugger = State -> Interpreter -> IO ()
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
242
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
243 debugNop s i = do
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
244 return ()
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
245
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
246 debugPrintState s i = do
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
247 putStr ((show s) ++ "\n")
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
248 return ()
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
249
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
250
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
251 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
252 -- ============================ Executor =========================== --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
253 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
254
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
255 execute :: [Symbol] -> State -> Interpreter -> Debugger -> IO (State, Interpreter)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
256
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
257 execute [] state interpreter debugger =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
258 return (state, interpreter)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
259 execute (opSym:program') state interpreter debugger =
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
260 let
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
261 operation = fetch interpreter opSym
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
262 in do
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
263 (state', interpreter') <- operation state interpreter
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
264 debugger state' interpreter'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
265 execute program' state' interpreter' debugger
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
266
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
267
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
268 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
269 -- ====================== Top-Level Function ======================= --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
270 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
271
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
272 initialInterpreter = Interp
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
273 (Map.fromList
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
274 [
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
275 ('.', opOutput),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
276 (',', opInput),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
277
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
278 ('#', fitRegOp (opPushValue 0)),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
279 ('0', fitRegOp (opAccumValue 0)),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
280 ('1', fitRegOp (opAccumValue 1)),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
281 ('2', fitRegOp (opAccumValue 2)),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
282 ('3', fitRegOp (opAccumValue 3)),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
283 ('4', fitRegOp (opAccumValue 4)),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
284 ('5', fitRegOp (opAccumValue 5)),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
285 ('6', fitRegOp (opAccumValue 6)),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
286 ('7', fitRegOp (opAccumValue 7)),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
287 ('8', fitRegOp (opAccumValue 8)),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
288 ('9', fitRegOp (opAccumValue 9)),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
289
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
290 ('+', fitRegOp opAdd),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
291 ('-', fitRegOp opSubtract),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
292 ('~', fitRegOp opDiscreteLog),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
293
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
294 ('^', fitRegOp opEnqueueCopy),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
295 ('v', fitRegOp opDequeue),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
296 (':', fitRegOp opDuplicate),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
297
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
298 ('!', opSupplant),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
299 ('?', opEval),
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
300
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
301 (';', fitRegOp (opPushValue (Char.ord ';')))
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
302 ]
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
303 )
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
304
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
305 initialState = State [] []
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
306
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
307 emmental string = do
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
308 (state, interpreter) <- execute string initialState initialInterpreter debugNop
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
309 return state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
310
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
311 debug string = do
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
312 (state, interpreter) <- execute string initialState initialInterpreter debugPrintState
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
313 return state
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
314
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
315
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
316 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
317 -- ========================== Test Cases =========================== --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
318 -----------------------------------------------------------------------
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
319
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
320 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
321 -- Drivers for test cases. 'demo' runs them straight, whereas 'test'
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
322 -- uses the debugger.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
323 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
324
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
325 demo n = emmental (testProg n)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
326
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
327 test n = debug (testProg n)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
328
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
329 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
330 -- Here we introduce a bit of a cheat, in order to make writing
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
331 -- complex Emmental programs tolerable. You can still see the
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
332 -- programs in their fully glory by executing "show (testProg n)".
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
333 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
334
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
335 quote [] = []
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
336 quote (symbol:rest) = "#" ++ (show (Char.ord symbol)) ++ (quote rest)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
337
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
338 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
339 -- Add one and one.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
340 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
341
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
342 testProg 1 = "#1#1+"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
343
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
344 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
345 -- Redefine & as "+".
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
346 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
347
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
348 testProg 2 = ";#43#38!#1#1&" -- 59,43,38 ==> ";+&"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
349
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
350 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
351 -- Redefine 0 as "9".
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
352 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
353
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
354 testProg 3 = ";#57#48!#0" -- 59,57,48 ==> ";90"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
355
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
356 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
357 -- Redefine 0 as "#48?". This results in an infinite loop when 0 is executed.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
358 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
359
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
360 testProg 4 = ";#35#52#56#63#48!0" -- 59,35,52,56,63,48 ==> ";#48?0"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
361
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
362 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
363 -- Redefine $ as ".#36?". This results in a loop that pops symbols and
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
364 -- and prints them, until the stack underflows, when $ is executed.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
365 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
366
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
367 testProg 5 = ";#46#35#51#54#63#36! #65#66#67#68#69$"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
368
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
369 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
370 -- Duplicate the top stack element (assuming an empty queue.)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
371 -- This shows that the : operation is not strictly necessary
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
372 -- (when you know the size of the queue.)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
373 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
374
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
375 testProg 6 = "#65^v"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
376
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
377 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
378 -- Discard the top stack element (assuming more than one element
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
379 -- on the stack, and an empty queue.)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
380 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
381
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
382 testProg 7 = "#33#123^v-+"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
383
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
384 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
385 -- Swap the top two elements of the stack (assuming an empty queue.)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
386 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
387
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
388 testProg 8 = "#67#66#65^v^-+^^v^v^v-+^v-+^v-+vv"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
389
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
390 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
391 -- Input a symbol. Report whether its ASCII value is even or odd.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
392 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
393
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
394 testProg 9 = (quote ";^v:") ++ "!" ++ -- : = dup
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
395 (quote ";#69.") ++ "#!" ++ -- NUL = print "E"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
396 (quote ";#79.") ++ "#128!" ++ -- \128 = print "O"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
397 (quote (";" ++ (take 127 [':',':'..]) ++ -- m = mul by 128
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
398 (take 127 ['+','+'..]) ++ "m")) ++ "!" ++
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
399 ",m?"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
400
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
401 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
402 -- Input a symbol. Report whether it is M or not.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
403 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
404
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
405 testProg 10 = (quote ";#78.") ++ "#!" ++ -- NUL = print "N"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
406 ";##1!" ++ -- SOH = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
407 ";##2!" ++ -- STX = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
408 ";##3!" ++ -- ETX = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
409 ";##4!" ++ -- EOT = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
410 ";##5!" ++ -- ENQ = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
411 ";##6!" ++ -- ACK = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
412 ";##7!" ++ -- BEL = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
413 (quote ";#89.") ++ "#8!" ++ -- BS = print "Y"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
414 ",#77-~?"
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
415
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
416 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
417 -- Same as testProg 5, except stop printing when a NUL is
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
418 -- encountered, instead of just underflowing the stack.
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
419 --
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
420
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
421 testProg 11 = ";" ++ (quote ":~?$") ++ "!" ++ -- $ = dup & test
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
422 ";" ++ (quote ".$") ++ "#!" ++ -- NUL = print & repeat
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
423 ";#0#1!" ++ -- SOH = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
424 ";#0#2!" ++ -- STX = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
425 ";#0#3!" ++ -- ETX = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
426 ";#0#4!" ++ -- EOT = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
427 ";#0#5!" ++ -- ENQ = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
428 ";#0#6!" ++ -- ACK = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
429 ";#0#7!" ++ -- BEL = same as NUL
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
430 -- BS = stop (nop)
bd08a41fcbe2 <oerjan> mv fueue.c emmental.hs src
HackBot
parents:
diff changeset
431 "#0" ++ (quote (reverse "Hello!")) ++ "$"