| /// This package contains a simple grammar and evaluator for LISP. |
| /// |
| /// The code is reasonably complete to run and evaluate reasonably complex |
| /// programs from the console and from the web browser. |
| library petitparser.lisp; |
| |
| import 'dart:collection'; |
| import 'petitparser.dart'; |
| |
| part 'src/lisp/cons.dart'; |
| part 'src/lisp/environment.dart'; |
| part 'src/lisp/grammar.dart'; |
| part 'src/lisp/name.dart'; |
| part 'src/lisp/natives.dart'; |
| part 'src/lisp/parser.dart'; |
| part 'src/lisp/standard.dart'; |
| |
| /// The standard lisp parser definition. |
| final lispParser = new LispParser(); |
| |
| /// The evaluation function. |
| eval(Environment env, expr) { |
| if (expr is Cons) { |
| return eval(env, expr.head)(env, expr.tail); |
| } else if (expr is Name) { |
| return env[expr]; |
| } else { |
| return expr; |
| } |
| } |
| |
| /// Evaluate a cons of instructions. |
| evalList(Environment env, Cons expr) { |
| var result = null; |
| while (expr is Cons) { |
| result = eval(env, expr.head); |
| expr = expr.tail; |
| } |
| return result; |
| } |
| |
| /// The arguments evaluation function. |
| evalArguments(Environment env, args) { |
| if (args is Cons) { |
| return new Cons(eval(env, args.head), evalArguments(env, args.tail)); |
| } else { |
| return null; |
| } |
| } |
| |
| /// Reads and evaluates a [script]. |
| evalString(Parser parser, Environment env, String script) { |
| var result = null; |
| for (var cell in parser.parse(script).value) { |
| result = eval(env, cell); |
| } |
| return result; |
| } |