Mercurial > repos > icfp2013
comparison src/bv.tp @ 3:dfc5f00c94bc
Initial evaluator implementation. fold is currently missing but other ops are present and seem to work
author | Mike Pavone <pavone@retrodev.com> |
---|---|
date | Thu, 08 Aug 2013 21:54:02 -0700 |
parents | |
children | 538440e1c3d2 |
comparison
equal
deleted
inserted
replaced
2:5cf8de487ed6 | 3:dfc5f00c94bc |
---|---|
1 #{ | |
2 program <- { | |
3 _input <- 0i64 | |
4 _zero <- #{ | |
5 string <- { "0" } | |
6 eval <- { 0i64 } | |
7 } | |
8 | |
9 _one <- #{ | |
10 string <- { "1" } | |
11 eval <- { 1i64 } | |
12 } | |
13 | |
14 _inputNode <- #{ | |
15 string <- { "input" } | |
16 eval <- { _input } | |
17 } | |
18 #{ | |
19 plus <- :left right { | |
20 #{ | |
21 string <- { "(plus " . (string: left) . " " . (string: right) . ")" } | |
22 eval <- { (eval: left) + (eval: right)} | |
23 } | |
24 } | |
25 zero <- { | |
26 _zero | |
27 } | |
28 | |
29 one <- { | |
30 _one | |
31 } | |
32 | |
33 opAnd <- :left right { | |
34 #{ | |
35 string <- { "(and " . (string: left) . " " . (string: right) . ")" } | |
36 eval <- { (eval: left) and (eval: right)} | |
37 } | |
38 } | |
39 | |
40 opOr <- :left right { | |
41 #{ | |
42 string <- { "(or " . (string: left) . " " . (string: right) . ")" } | |
43 eval <- { (eval: left) or (eval: right)} | |
44 } | |
45 } | |
46 | |
47 opXor <- :left right { | |
48 #{ | |
49 string <- { "(xor " . (string: left) . " " . (string: right) . ")" } | |
50 eval <- { (eval: left) xor (eval: right)} | |
51 } | |
52 } | |
53 | |
54 opNot <- :exp { | |
55 #{ | |
56 string <- { "(not " . (string: exp) . ")" } | |
57 eval <- { (eval: exp) xor -1 } | |
58 } | |
59 } | |
60 | |
61 shl1 <- :exp { | |
62 #{ | |
63 string <- { "(shl1 " . (string: exp) . ")" } | |
64 eval <- { lshift: (eval: exp) by: 1 } | |
65 } | |
66 } | |
67 | |
68 shr1 <- :exp { | |
69 #{ | |
70 string <- { "(shr1 " . (string: exp) . ")" } | |
71 eval <- { rshift: (eval: exp) by: 1 } | |
72 } | |
73 } | |
74 | |
75 shr4 <- :exp { | |
76 #{ | |
77 string <- { "(shr4 " . (string: exp) . ")" } | |
78 eval <- { rshift: (eval: exp) by: 4 } | |
79 } | |
80 } | |
81 | |
82 shr16 <- :exp { | |
83 #{ | |
84 string <- { "(shr16 " . (string: exp) . ")" } | |
85 eval <- { rshift: (eval: exp) by: 16 } | |
86 } | |
87 } | |
88 | |
89 input <- { _inputNode } | |
90 | |
91 if0:then:else <- :exp ifzero :ifnotzero { | |
92 #{ | |
93 string <- { "(if0 " . (string: exp) . " " . (string: ifzero) . " " . (string: ifnotzero) . ")" } | |
94 eval <- { | |
95 if: (eval: exp) = 0i64 { | |
96 eval: ifzero | |
97 } else: { | |
98 eval: ifnotzero | |
99 } | |
100 } | |
101 } | |
102 } | |
103 | |
104 run <- :in { | |
105 _input <- in | |
106 eval: root | |
107 } | |
108 | |
109 root <- _zero | |
110 | |
111 string <- { | |
112 "(lambda (input) " . (string: root) . ")" | |
113 } | |
114 | |
115 gentestprog <- { | |
116 root <- if0: (opAnd: input one) then: ( | |
117 plus: (opOr: input (shl1: one)) | |
118 ) else: ( | |
119 opXor: input (shr16: input) | |
120 ) | |
121 self | |
122 } | |
123 } | |
124 } | |
125 | |
126 test <- { | |
127 prog <- program gentestprog | |
128 print: (string: prog) . "\n" | |
129 vals <- #[0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 0x30001 0x50015] | |
130 foreach: vals :idx val { | |
131 print: "p(0x" . (hex: val) . ") = 0x" . (hex: (prog run: val)) . "\n" | |
132 } | |
133 } | |
134 | |
135 main <- { | |
136 test: | |
137 } | |
138 } |