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

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

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

Powered by Google App Engine
This is Rietveld 408576698