OLD | NEW |
| (Empty) |
1 /// This package contains a simple grammar and evaluator for LISP. | |
2 /// | |
3 /// The code is reasonably complete to run and evaluate reasonably complex | |
4 /// programs from the console and from the web browser. | |
5 library petitparser.lisp; | |
6 | |
7 import 'dart:collection'; | |
8 import 'petitparser.dart'; | |
9 | |
10 part 'src/lisp/cons.dart'; | |
11 part 'src/lisp/environment.dart'; | |
12 part 'src/lisp/grammar.dart'; | |
13 part 'src/lisp/name.dart'; | |
14 part 'src/lisp/natives.dart'; | |
15 part 'src/lisp/parser.dart'; | |
16 part 'src/lisp/standard.dart'; | |
17 | |
18 /// The standard lisp parser definition. | |
19 final lispParser = new LispParser(); | |
20 | |
21 /// The evaluation function. | |
22 eval(Environment env, expr) { | |
23 if (expr is Cons) { | |
24 return eval(env, expr.head)(env, expr.tail); | |
25 } else if (expr is Name) { | |
26 return env[expr]; | |
27 } else { | |
28 return expr; | |
29 } | |
30 } | |
31 | |
32 /// Evaluate a cons of instructions. | |
33 evalList(Environment env, expr) { | |
34 var result = null; | |
35 while (expr is Cons) { | |
36 result = eval(env, expr.head); | |
37 expr = expr.tail; | |
38 } | |
39 return result; | |
40 } | |
41 | |
42 /// The arguments evaluation function. | |
43 evalArguments(Environment env, args) { | |
44 if (args is Cons) { | |
45 return new Cons(eval(env, args.head), evalArguments(env, args.tail)); | |
46 } else { | |
47 return null; | |
48 } | |
49 } | |
50 | |
51 /// Reads and evaluates a [script]. | |
52 evalString(Parser parser, Environment env, String script) { | |
53 var result = null; | |
54 for (var cell in parser.parse(script).value) { | |
55 result = eval(env, cell); | |
56 } | |
57 return result; | |
58 } | |
OLD | NEW |