diff options
| author | Joel Martin <github@martintribe.org> | 2014-04-07 21:33:29 -0500 |
|---|---|---|
| committer | Joel Martin <github@martintribe.org> | 2014-04-07 21:33:29 -0500 |
| commit | 96115d4f2e8cf7335a7d6bb8b62e0f0bbfac0ab5 (patch) | |
| tree | 9d0e73e3bcaf87dd2c55c5d874f4581a8fbbbcfd /cs/types.cs | |
| parent | afdf531eba459a7a7b6505b037dbe48a363c2c79 (diff) | |
| download | mal-96115d4f2e8cf7335a7d6bb8b62e0f0bbfac0ab5.tar.gz mal-96115d4f2e8cf7335a7d6bb8b62e0f0bbfac0ab5.zip | |
C#: add step5_tco
Diffstat (limited to 'cs/types.cs')
| -rw-r--r-- | cs/types.cs | 36 |
1 files changed, 31 insertions, 5 deletions
diff --git a/cs/types.cs b/cs/types.cs index ae9d4bf..87a159b 100644 --- a/cs/types.cs +++ b/cs/types.cs @@ -67,7 +67,7 @@ namespace Mal { public abstract class MalVal { // Default is just to call regular toString() public virtual string ToString(bool print_readably) { - return "<unknown>"; + return this.ToString(); } public virtual bool list_Q() { return false; } } @@ -290,13 +290,39 @@ namespace Mal { } public class MalFunction : MalVal { - Func<MalList, MalVal> value = null; - public MalFunction(Func<MalList, MalVal> f) { - value = f; + Func<MalList, MalVal> fn = null; + MalVal ast = null; + Mal.env.Env env = null; + MalList fparams; + public MalFunction(Func<MalList, MalVal> fn) { + this.fn = fn; + } + public MalFunction(MalVal ast, Mal.env.Env env, MalList fparams, + Func<MalList, MalVal> fn) { + this.fn = fn; + this.ast = ast; + this.env = env; + this.fparams = fparams; + } + + public override string ToString() { + if (ast != null) { + return "<fn* " + Mal.printer._pr_str(fparams,true) + + " " + Mal.printer._pr_str(ast, true) + ">"; + } else { + return "<builtin_function " + fn.ToString() + ">"; + } } public MalVal apply(MalList args) { - return value(args); + return fn(args); + } + + public MalVal getAst() { return ast; } + public Mal.env.Env getEnv() { return env; } + public MalList getFParams() { return fparams; } + public Mal.env.Env genEnv(MalList args) { + return new Mal.env.Env(env, fparams, args); } } } |
