Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: packages/petitparser/lib/src/lisp/natives.dart

Issue 2989763002: Update charted to 0.4.8 and roll (Closed)
Patch Set: Removed Cutch from list of reviewers Created 3 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
OLDNEW
(Empty)
1 part of petitparser.lisp;
2
3 /// The native functions.
4 class Natives {
5
6 /// Imports the native functions into the [environment].
7 static Environment import(Environment environment) {
8
9 // basic functions
10 environment.define(new Name('define'), _define);
11 environment.define(new Name('lambda'), _lambda);
12 environment.define(new Name('quote'), _quote);
13 environment.define(new Name('eval'), _eval);
14 environment.define(new Name('apply'), _apply);
15 environment.define(new Name('let'), _let);
16 environment.define(new Name('set!'), _set);
17 environment.define(new Name('print'), _print);
18
19 // control structures
20 environment.define(new Name('if'), _if);
21 environment.define(new Name('while'), _while);
22 environment.define(new Name('and'), _and);
23 environment.define(new Name('or'), _or);
24 environment.define(new Name('not'), _not);
25
26 // arithmetic operators
27 environment.define(new Name('+'), _plus);
28 environment.define(new Name('-'), _minus);
29 environment.define(new Name('*'), _multiply);
30 environment.define(new Name('/'), _divide);
31 environment.define(new Name('%'), _modulo);
32
33 // arithmetic comparators
34 environment.define(new Name('<'), _smaller);
35 environment.define(new Name('<='), _smallerOrEqual);
36 environment.define(new Name('='), _equal);
37 environment.define(new Name('!='), _notEqual);
38 environment.define(new Name('>'), _larger);
39 environment.define(new Name('>='), _largerOrEqual);
40
41 // list operators
42 environment.define(new Name('cons'), _cons);
43 environment.define(new Name('car'), _car);
44 environment.define(new Name('car!'), _carSet);
45 environment.define(new Name('cdr'), _cdr);
46 environment.define(new Name('cdr!'), _cdrSet);
47
48 return environment;
49 }
50
51 static _define(Environment env, args) {
52 if (args.head is Name) {
53 return env.define(args.head, evalList(env, args.tail));
54 } else if (args.head.head is Name) {
55 return env.define(
56 args.head.head, _lambda(env, new Cons(args.head.tail, args.tail)));
57 } else {
58 throw new ArgumentError('Invalid define: $args');
59 }
60 }
61
62 static _lambda(Environment lambdaEnv, lambdaArgs) {
63 return (Environment evalEnv, evalArgs) {
64 var inner = lambdaEnv.create();
65 var names = lambdaArgs.head;
66 var values = evalArguments(evalEnv, evalArgs);
67 while (names != null && values != null) {
68 inner.define(names.head, values.head);
69 names = names.tail;
70 values = values.tail;
71 }
72 return evalList(inner, lambdaArgs.tail);
73 };
74 }
75
76 static _quote(Environment env, args) {
77 return args;
78 }
79
80 static _eval(Environment env, args) {
81 return eval(env.create(), eval(env, args.head));
82 }
83
84 static _apply(Environment env, args) {
85 return eval(env, args.head)(env.create(), args.tail);
86 }
87
88 static _let(Environment env, args) {
89 var inner = env.create();
90 var binding = args.head;
91 while (binding != null) {
92 inner.define(binding.head.head, eval(env, binding.head.tail.head));
93 binding = binding.tail;
94 }
95 return evalList(inner, args.tail);
96 }
97
98 static _set(Environment env, args) {
99 return env[args.head] = eval(env, args.tail.head);
100 }
101
102 static _print(Environment env, args) {
103 var buffer = new StringBuffer();
104 while (args != null) {
105 buffer.write(eval(env, args.head));
106 args = args.tail;
107 }
108 print(buffer);
109 return null;
110 }
111
112 static _if(Environment env, args) {
113 var condition = eval(env, args.head);
114 if (condition) {
115 if (args.tail != null) {
116 return eval(env, args.tail.head);
117 }
118 } else {
119 if (args.tail != null && args.tail.tail != null) {
120 return eval(env, args.tail.tail.head);
121 }
122 }
123 return null;
124 }
125
126 static _while(Environment env, args) {
127 var result = null;
128 while (eval(env, args.head)) {
129 result = evalList(env, args.tail);
130 }
131 return result;
132 }
133
134 static _and(Environment env, args) {
135 while (args != null) {
136 if (!eval(env, args.head)) {
137 return false;
138 }
139 args = args.tail;
140 }
141 return true;
142 }
143
144 static _or(Environment env, args) {
145 while (args != null) {
146 if (eval(env, args.head)) {
147 return true;
148 }
149 args = args.tail;
150 }
151 return false;
152 }
153
154 static _not(Environment env, args) {
155 return !eval(env, args.head);
156 }
157
158 static _plus(Environment env, args) {
159 var value = eval(env, args.head);
160 for (args = args.tail; args != null; args = args.tail) {
161 value += eval(env, args.head);
162 }
163 return value;
164 }
165
166 static _minus(Environment env, args) {
167 var value = eval(env, args.head);
168 if (args.tail == null) {
169 return -value;
170 }
171 for (args = args.tail; args != null; args = args.tail) {
172 value -= eval(env, args.head);
173 }
174 return value;
175 }
176
177 static _multiply(Environment env, args) {
178 var value = eval(env, args.head);
179 for (args = args.tail; args != null; args = args.tail) {
180 value *= eval(env, args.head);
181 }
182 return value;
183 }
184
185 static _divide(Environment env, args) {
186 var value = eval(env, args.head);
187 for (args = args.tail; args != null; args = args.tail) {
188 value /= eval(env, args.head);
189 }
190 return value;
191 }
192
193 static _modulo(Environment env, args) {
194 var value = eval(env, args.head);
195 for (args = args.tail; args != null; args = args.tail) {
196 value %= eval(env, args.head);
197 }
198 return value;
199 }
200
201 static _smaller(Environment env, args) {
202 return eval(env, args.head) < eval(env, args.tail.head);
203 }
204
205 static _smallerOrEqual(Environment env, args) {
206 return eval(env, args.head) <= eval(env, args.tail.head);
207 }
208
209 static _equal(Environment env, args) {
210 return eval(env, args.head) == eval(env, args.tail.head);
211 }
212
213 static _notEqual(Environment env, args) {
214 return eval(env, args.head) != eval(env, args.tail.head);
215 }
216
217 static _larger(Environment env, args) {
218 return eval(env, args.head) > eval(env, args.tail.head);
219 }
220
221 static _largerOrEqual(Environment env, args) {
222 return eval(env, args.head) >= eval(env, args.tail.head);
223 }
224
225 static _cons(Environment env, args) {
226 return new Cons(eval(env, args.head), eval(env, args.tail.head));
227 }
228
229 static _car(Environment env, args) {
230 var cons = eval(env, args.head);
231 return cons is Cons ? cons.head : null;
232 }
233
234 static _carSet(Environment env, args) {
235 var cons = eval(env, args.head);
236 if (cons is Cons) {
237 cons.head = eval(env, args.tail.head);
238 }
239 return cons;
240 }
241
242 static _cdr(Environment env, args) {
243 var cons = eval(env, args.head);
244 return cons is Cons ? cons.tail : null;
245 }
246
247 static _cdrSet(Environment env, args) {
248 var cons = eval(env, args.head);
249 if (cons is Cons) {
250 cons.tail = eval(env, args.tail.head);
251 }
252 return cons;
253 }
254 }
OLDNEW
« no previous file with comments | « packages/petitparser/lib/src/lisp/name.dart ('k') | packages/petitparser/lib/src/lisp/parser.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698