annotate src/emmental.hs @ 8427:1fc808cd5b1f

<b_jonas> learn can\'t is the most frequent word whose pronunciation varies between /\xc9\x91\xcb\x90/ and /\xc3\xa6/ depending on dialect. The list is: advance after answer ask aunt brass can\'t cast castle chance class command dance demand draft enhance example fast father glass graph grass half last laugh mask master nasty pass past path plant rather sample shan\'t staff task vast
author HackBot
date Thu, 09 Jun 2016 21:28:47 +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!")) ++ "$"