aboutsummaryrefslogtreecommitdiff
path: root/cs/types.cs
diff options
context:
space:
mode:
authorJoel Martin <github@martintribe.org>2014-04-07 21:33:29 -0500
committerJoel Martin <github@martintribe.org>2014-04-07 21:33:29 -0500
commit96115d4f2e8cf7335a7d6bb8b62e0f0bbfac0ab5 (patch)
tree9d0e73e3bcaf87dd2c55c5d874f4581a8fbbbcfd /cs/types.cs
parentafdf531eba459a7a7b6505b037dbe48a363c2c79 (diff)
downloadmal-96115d4f2e8cf7335a7d6bb8b62e0f0bbfac0ab5.tar.gz
mal-96115d4f2e8cf7335a7d6bb8b62e0f0bbfac0ab5.zip
C#: add step5_tco
Diffstat (limited to 'cs/types.cs')
-rw-r--r--cs/types.cs36
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);
}
}
}