OLD | NEW |
1 part of lisp; | 1 part of petitparser.lisp; |
2 | 2 |
3 /** | 3 /// The native functions. |
4 * The native functions. | |
5 */ | |
6 class Natives { | 4 class Natives { |
7 | 5 |
8 /** Imports the native functions into the [environment]. */ | 6 /// Imports the native functions into the [environment]. |
9 static Environment import(Environment environment) { | 7 static Environment import(Environment environment) { |
10 | 8 |
11 // basic functions | 9 // basic functions |
12 environment.define(new Name('define'), _define); | 10 environment.define(new Name('define'), _define); |
13 environment.define(new Name('lambda'), _lambda); | 11 environment.define(new Name('lambda'), _lambda); |
14 environment.define(new Name('quote'), _quote); | 12 environment.define(new Name('quote'), _quote); |
15 environment.define(new Name('eval'), _eval); | 13 environment.define(new Name('eval'), _eval); |
16 environment.define(new Name('apply'), _apply); | 14 environment.define(new Name('apply'), _apply); |
17 environment.define(new Name('let'), _let); | 15 environment.define(new Name('let'), _let); |
18 environment.define(new Name('set!'), _set); | 16 environment.define(new Name('set!'), _set); |
(...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
54 if (args.head is Name) { | 52 if (args.head is Name) { |
55 return env.define(args.head, evalList(env, args.tail)); | 53 return env.define(args.head, evalList(env, args.tail)); |
56 } else if (args.head.head is Name) { | 54 } else if (args.head.head is Name) { |
57 return env.define( | 55 return env.define( |
58 args.head.head, _lambda(env, new Cons(args.head.tail, args.tail))); | 56 args.head.head, _lambda(env, new Cons(args.head.tail, args.tail))); |
59 } else { | 57 } else { |
60 throw new ArgumentError('Invalid define: $args'); | 58 throw new ArgumentError('Invalid define: $args'); |
61 } | 59 } |
62 } | 60 } |
63 | 61 |
64 static _lambda(Environment lambda_env, lambda_args) { | 62 static _lambda(Environment lambdaEnv, lambdaArgs) { |
65 return (Environment env, args) { | 63 return (Environment evalEnv, evalArgs) { |
66 var inner = lambda_env.create(); | 64 var inner = lambdaEnv.create(); |
67 var names = lambda_args.head; | 65 var names = lambdaArgs.head; |
68 var values = evalArguments(env, args); | 66 var values = evalArguments(evalEnv, evalArgs); |
69 while (names != null && values != null) { | 67 while (names != null && values != null) { |
70 inner.define(names.head, values.head); | 68 inner.define(names.head, values.head); |
71 names = names.tail; | 69 names = names.tail; |
72 values = values.tail; | 70 values = values.tail; |
73 } | 71 } |
74 return evalList(inner, lambda_args.tail); | 72 return evalList(inner, lambdaArgs.tail); |
75 }; | 73 }; |
76 } | 74 } |
77 | 75 |
78 static _quote(Environment env, args) { | 76 static _quote(Environment env, args) { |
79 return args; | 77 return args; |
80 } | 78 } |
81 | 79 |
82 static _eval(Environment env, args) { | 80 static _eval(Environment env, args) { |
83 return eval(env.create(), eval(env, args.head)); | 81 return eval(env.create(), eval(env, args.head)); |
84 } | 82 } |
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
247 } | 245 } |
248 | 246 |
249 static _cdrSet(Environment env, args) { | 247 static _cdrSet(Environment env, args) { |
250 var cons = eval(env, args.head); | 248 var cons = eval(env, args.head); |
251 if (cons is Cons) { | 249 if (cons is Cons) { |
252 cons.tail = eval(env, args.tail.head); | 250 cons.tail = eval(env, args.tail.head); |
253 } | 251 } |
254 return cons; | 252 return cons; |
255 } | 253 } |
256 } | 254 } |
OLD | NEW |