Index: petitparser/lib/src/lisp/natives.dart |
diff --git a/petitparser/lib/src/lisp/natives.dart b/petitparser/lib/src/lisp/natives.dart |
deleted file mode 100644 |
index ef15e0545eefed45c18907e003000f251a69be88..0000000000000000000000000000000000000000 |
--- a/petitparser/lib/src/lisp/natives.dart |
+++ /dev/null |
@@ -1,256 +0,0 @@ |
-part of lisp; |
- |
-/** |
- * The native functions. |
- */ |
-class Natives { |
- |
- /** Imports the native functions into the [environment]. */ |
- static Environment import(Environment environment) { |
- |
- // basic functions |
- environment.define(new Name('define'), _define); |
- environment.define(new Name('lambda'), _lambda); |
- environment.define(new Name('quote'), _quote); |
- environment.define(new Name('eval'), _eval); |
- environment.define(new Name('apply'), _apply); |
- environment.define(new Name('let'), _let); |
- environment.define(new Name('set!'), _set); |
- environment.define(new Name('print'), _print); |
- |
- // control structures |
- environment.define(new Name('if'), _if); |
- environment.define(new Name('while'), _while); |
- environment.define(new Name('and'), _and); |
- environment.define(new Name('or'), _or); |
- environment.define(new Name('not'), _not); |
- |
- // arithmetic operators |
- environment.define(new Name('+'), _plus); |
- environment.define(new Name('-'), _minus); |
- environment.define(new Name('*'), _multiply); |
- environment.define(new Name('/'), _divide); |
- environment.define(new Name('%'), _modulo); |
- |
- // arithmetic comparators |
- environment.define(new Name('<'), _smaller); |
- environment.define(new Name('<='), _smallerOrEqual); |
- environment.define(new Name('='), _equal); |
- environment.define(new Name('!='), _notEqual); |
- environment.define(new Name('>'), _larger); |
- environment.define(new Name('>='), _largerOrEqual); |
- |
- // list operators |
- environment.define(new Name('cons'), _cons); |
- environment.define(new Name('car'), _car); |
- environment.define(new Name('car!'), _carSet); |
- environment.define(new Name('cdr'), _cdr); |
- environment.define(new Name('cdr!'), _cdrSet); |
- |
- return environment; |
- } |
- |
- static _define(Environment env, args) { |
- if (args.head is Name) { |
- return env.define(args.head, evalList(env, args.tail)); |
- } else if (args.head.head is Name) { |
- return env.define( |
- args.head.head, _lambda(env, new Cons(args.head.tail, args.tail))); |
- } else { |
- throw new ArgumentError('Invalid define: $args'); |
- } |
- } |
- |
- static _lambda(Environment lambda_env, lambda_args) { |
- return (Environment env, args) { |
- var inner = lambda_env.create(); |
- var names = lambda_args.head; |
- var values = evalArguments(env, args); |
- while (names != null && values != null) { |
- inner.define(names.head, values.head); |
- names = names.tail; |
- values = values.tail; |
- } |
- return evalList(inner, lambda_args.tail); |
- }; |
- } |
- |
- static _quote(Environment env, args) { |
- return args; |
- } |
- |
- static _eval(Environment env, args) { |
- return eval(env.create(), eval(env, args.head)); |
- } |
- |
- static _apply(Environment env, args) { |
- return eval(env, args.head)(env.create(), args.tail); |
- } |
- |
- static _let(Environment env, args) { |
- var inner = env.create(); |
- var binding = args.head; |
- while (binding != null) { |
- inner.define(binding.head.head, eval(env, binding.head.tail.head)); |
- binding = binding.tail; |
- } |
- return evalList(inner, args.tail); |
- } |
- |
- static _set(Environment env, args) { |
- return env[args.head] = eval(env, args.tail.head); |
- } |
- |
- static _print(Environment env, args) { |
- var buffer = new StringBuffer(); |
- while (args != null) { |
- buffer.write(eval(env, args.head)); |
- args = args.tail; |
- } |
- print(buffer); |
- return null; |
- } |
- |
- static _if(Environment env, args) { |
- var condition = eval(env, args.head); |
- if (condition) { |
- if (args.tail != null) { |
- return eval(env, args.tail.head); |
- } |
- } else { |
- if (args.tail != null && args.tail.tail != null) { |
- return eval(env, args.tail.tail.head); |
- } |
- } |
- return null; |
- } |
- |
- static _while(Environment env, args) { |
- var result = null; |
- while (eval(env, args.head)) { |
- result = evalList(env, args.tail); |
- } |
- return result; |
- } |
- |
- static _and(Environment env, args) { |
- while (args != null) { |
- if (!eval(env, args.head)) { |
- return false; |
- } |
- args = args.tail; |
- } |
- return true; |
- } |
- |
- static _or(Environment env, args) { |
- while (args != null) { |
- if (eval(env, args.head)) { |
- return true; |
- } |
- args = args.tail; |
- } |
- return false; |
- } |
- |
- static _not(Environment env, args) { |
- return !eval(env, args.head); |
- } |
- |
- static _plus(Environment env, args) { |
- var value = eval(env, args.head); |
- for (args = args.tail; args != null; args = args.tail) { |
- value += eval(env, args.head); |
- } |
- return value; |
- } |
- |
- static _minus(Environment env, args) { |
- var value = eval(env, args.head); |
- if (args.tail == null) { |
- return -value; |
- } |
- for (args = args.tail; args != null; args = args.tail) { |
- value -= eval(env, args.head); |
- } |
- return value; |
- } |
- |
- static _multiply(Environment env, args) { |
- var value = eval(env, args.head); |
- for (args = args.tail; args != null; args = args.tail) { |
- value *= eval(env, args.head); |
- } |
- return value; |
- } |
- |
- static _divide(Environment env, args) { |
- var value = eval(env, args.head); |
- for (args = args.tail; args != null; args = args.tail) { |
- value /= eval(env, args.head); |
- } |
- return value; |
- } |
- |
- static _modulo(Environment env, args) { |
- var value = eval(env, args.head); |
- for (args = args.tail; args != null; args = args.tail) { |
- value %= eval(env, args.head); |
- } |
- return value; |
- } |
- |
- static _smaller(Environment env, args) { |
- return eval(env, args.head) < eval(env, args.tail.head); |
- } |
- |
- static _smallerOrEqual(Environment env, args) { |
- return eval(env, args.head) <= eval(env, args.tail.head); |
- } |
- |
- static _equal(Environment env, args) { |
- return eval(env, args.head) == eval(env, args.tail.head); |
- } |
- |
- static _notEqual(Environment env, args) { |
- return eval(env, args.head) != eval(env, args.tail.head); |
- } |
- |
- static _larger(Environment env, args) { |
- return eval(env, args.head) > eval(env, args.tail.head); |
- } |
- |
- static _largerOrEqual(Environment env, args) { |
- return eval(env, args.head) >= eval(env, args.tail.head); |
- } |
- |
- static _cons(Environment env, args) { |
- return new Cons(eval(env, args.head), eval(env, args.tail.head)); |
- } |
- |
- static _car(Environment env, args) { |
- var cons = eval(env, args.head); |
- return cons is Cons ? cons.head : null; |
- } |
- |
- static _carSet(Environment env, args) { |
- var cons = eval(env, args.head); |
- if (cons is Cons) { |
- cons.head = eval(env, args.tail.head); |
- } |
- return cons; |
- } |
- |
- static _cdr(Environment env, args) { |
- var cons = eval(env, args.head); |
- return cons is Cons ? cons.tail : null; |
- } |
- |
- static _cdrSet(Environment env, args) { |
- var cons = eval(env, args.head); |
- if (cons is Cons) { |
- cons.tail = eval(env, args.tail.head); |
- } |
- return cons; |
- } |
-} |