aboutsummaryrefslogtreecommitdiff
path: root/cs/types.cs
diff options
context:
space:
mode:
Diffstat (limited to 'cs/types.cs')
-rw-r--r--cs/types.cs26
1 files changed, 25 insertions, 1 deletions
diff --git a/cs/types.cs b/cs/types.cs
index 7cbbd53..8f6755f 100644
--- a/cs/types.cs
+++ b/cs/types.cs
@@ -13,6 +13,18 @@ namespace Mal {
}
public class MalContinue : MalThrowable { }
+ // Thrown by throw function
+ public class MalException : MalThrowable {
+ MalVal value;
+ public MalException(MalVal value) {
+ this.value = value;
+ }
+ public MalException(string value) {
+ this.value = new MalString(value);
+ }
+ public MalVal getValue() { return value; }
+ }
+
public abstract class MalVal {
// Default is just to call regular toString()
@@ -148,13 +160,20 @@ namespace Mal {
public int size() { return value.Count; }
public MalVal nth(int idx) { return value[idx]; }
- public MalVal rest() {
+ public MalList rest() {
if (size() > 0) {
return new MalList(value.GetRange(1, value.Count-1));
} else {
return new MalList();
}
}
+ public virtual MalList slice(int start) {
+ return new MalList(value.GetRange(start, value.Count-start));
+ }
+ public virtual MalList slice(int start, int end) {
+ return new MalList(value.GetRange(start, end-start));
+ }
+
}
public class MalVector : MalList {
@@ -179,6 +198,11 @@ namespace Mal {
}
public override bool list_Q() { return false; }
+
+ public override MalList slice(int start, int end) {
+ var val = this.getValue();
+ return new MalVector(val.GetRange(start, val.Count-start));
+ }
}
public class MalHashMap : MalVal {